From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47850) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VsX1i-00017S-Rk for qemu-devel@nongnu.org; Mon, 16 Dec 2013 07:12:05 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VsX1c-0008BU-LM for qemu-devel@nongnu.org; Mon, 16 Dec 2013 07:11:58 -0500 Received: from cantor2.suse.de ([195.135.220.15]:37269 helo=mx2.suse.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VsX1c-0008BO-AI for qemu-devel@nongnu.org; Mon, 16 Dec 2013 07:11:52 -0500 Message-ID: <52AEEE03.5000801@suse.de> Date: Mon, 16 Dec 2013 13:11:47 +0100 From: =?ISO-8859-15?Q?Andreas_F=E4rber?= MIME-Version: 1.0 References: <1387181170-23267-1-git-send-email-edgar.iglesias@gmail.com> <1387181170-23267-9-git-send-email-edgar.iglesias@gmail.com> In-Reply-To: <1387181170-23267-9-git-send-email-edgar.iglesias@gmail.com> Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH v1 08/22] cpu: Add per-cpu address space List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: edgar.iglesias@gmail.com, qemu-devel@nongnu.org Cc: peter.maydell@linaro.org, blauwirbel@gmail.com, aliguori@amazon.com, pcrost@xilinx.com, pbonzini@redhat.com, aurelien@aurel32.net, rth@twiddle.net Am 16.12.2013 09:05, schrieb edgar.iglesias@gmail.com: > From: "Edgar E. Iglesias" >=20 > Signed-off-by: Edgar E. Iglesias > --- > cputlb.c | 4 ++-- > exec.c | 31 +++++++++++++++++++++++-------- > include/exec/cpu-defs.h | 3 +++ > include/exec/exec-all.h | 1 + > include/exec/softmmu_template.h | 4 ++-- > include/qom/cpu.h | 2 ++ > 6 files changed, 33 insertions(+), 12 deletions(-) [...] > diff --git a/exec.c b/exec.c > index 803bbde..edb6a43 100644 > --- a/exec.c > +++ b/exec.c > @@ -136,6 +136,7 @@ typedef struct subpage_t { > =20 > static void io_mem_init(void); > static void memory_map_init(void); > +static void tcg_commit(MemoryListener *listener); > =20 > static MemoryRegion io_mem_watch; > #endif > @@ -434,6 +435,25 @@ CPUState *qemu_get_cpu(int index) > return NULL; > } > =20 > +#if !defined(CONFIG_USER_ONLY) > +void cpu_address_space_init(CPUState *cpu, AddressSpace *as) > +{ > + CPUArchState *env =3D cpu->env_ptr; > + > + if (tcg_enabled()) { > + if (cpu->tcg_as_listener) { > + memory_listener_unregister(cpu->tcg_as_listener); > + } else { > + cpu->tcg_as_listener =3D g_new0(MemoryListener, 1); > + } > + cpu->tcg_as_listener->commit =3D tcg_commit; > + memory_listener_register(cpu->tcg_as_listener, as); > + } > + > + env->as =3D as; > +} > +#endif > + > void cpu_exec_init(CPUArchState *env) > { > CPUState *cpu =3D ENV_GET_CPU(env); > @@ -453,6 +473,7 @@ void cpu_exec_init(CPUArchState *env) > QTAILQ_INIT(&env->breakpoints); > QTAILQ_INIT(&env->watchpoints); > #ifndef CONFIG_USER_ONLY > + cpu_address_space_init(cpu, &address_space_memory); > cpu->thread_id =3D qemu_get_thread_id(); > #endif > QTAILQ_INSERT_TAIL(&cpus, cpu, node); > @@ -482,9 +503,10 @@ static void breakpoint_invalidate(CPUState *cpu, t= arget_ulong pc) > #else > static void breakpoint_invalidate(CPUState *cpu, target_ulong pc) > { > + CPUArchState *env =3D cpu->env_ptr; > hwaddr phys =3D cpu_get_phys_page_debug(cpu, pc); > if (phys !=3D -1) { > - tb_invalidate_phys_addr(&address_space_memory, > + tb_invalidate_phys_addr(env->as, > phys | (pc & ~TARGET_PAGE_MASK)); > } > } [...] > diff --git a/include/exec/cpu-defs.h b/include/exec/cpu-defs.h > index 01cd8c7..406b36c 100644 > --- a/include/exec/cpu-defs.h > +++ b/include/exec/cpu-defs.h > @@ -176,6 +176,9 @@ typedef struct CPUWatchpoint { > sigjmp_buf jmp_env; = \ > int exception_index; = \ > = \ > + /* Per CPU address-space. */ = \ > + AddressSpace *as; = \ Why are you adding this field here rather than in CPUState alongside the other field? This being a pointer I can't imagine problems for non-softmmu, and I had posted patches a while ago to move the surrounding fields there. Having it in CPUState would avoid some of the env_ptr accesses above, which were supposed to be an interim solution onl= y. Regards, Andreas > + = \ > /* user data */ = \ > void *opaque; = \ > =20 [...] > diff --git a/include/qom/cpu.h b/include/qom/cpu.h > index 7739e00..c1febae 100644 > --- a/include/qom/cpu.h > +++ b/include/qom/cpu.h > @@ -186,6 +186,8 @@ struct CPUState { > uint32_t interrupt_request; > int singlestep_enabled; > =20 > + MemoryListener *tcg_as_listener; > + > void *env_ptr; /* CPUArchState */ > struct TranslationBlock *current_tb; > struct GDBRegisterState *gdb_regs; --=20 SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 N=FCrnberg, Germany GF: Jeff Hawn, Jennifer Guild, Felix Imend=F6rffer; HRB 16746 AG N=FCrnbe= rg