From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KqCWY-0001Zk-Ic for qemu-devel@nongnu.org; Wed, 15 Oct 2008 15:59:14 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KqCWU-0001Xk-TR for qemu-devel@nongnu.org; Wed, 15 Oct 2008 15:59:12 -0400 Received: from [199.232.76.173] (port=36803 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KqCWU-0001XW-KH for qemu-devel@nongnu.org; Wed, 15 Oct 2008 15:59:10 -0400 Received: from mx2.redhat.com ([66.187.237.31]:49528) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1KqCWT-0001NP-CP for qemu-devel@nongnu.org; Wed, 15 Oct 2008 15:59:10 -0400 From: Glauber Costa Date: Wed, 15 Oct 2008 19:55:13 -0200 Message-Id: <1224107718-19128-17-git-send-email-glommer@redhat.com> In-Reply-To: <1224107718-19128-1-git-send-email-glommer@redhat.com> References: <1224107718-19128-1-git-send-email-glommer@redhat.com> Subject: [Qemu-devel] [PATCH 16/21] add hook to cpu_register_physical_memory Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: aliguori@us.ibm.com, jan.kiszka@siemens.com, jes@sgi.com, avi@qumranet.com, Glauber Costa , dmitry.baryshkov@siemens.com From: Glauber Costa kqemu has a hook in it, so add an accel wrapper. However, we still provide a double underlined version which does not call the wrapper. That's basically because kqemu call cpu_register_physical_memory itself during its initialization. Signed-off-by: Glauber Costa --- accel.c | 1 + accel.h | 9 +++++++++ exec.c | 32 +++++++++++++++++++------------- kqemu.c | 3 ++- 4 files changed, 31 insertions(+), 14 deletions(-) diff --git a/accel.c b/accel.c index 3186d46..99a4eb1 100644 --- a/accel.c +++ b/accel.c @@ -31,5 +31,6 @@ QEMUAccel noaccel = { #ifndef CONFIG_USER_ONLY .get_real_ticks = cpu_get_ticks, #endif + .register_physical_memory = accel_nop, }; diff --git a/accel.h b/accel.h index c6f0ff3..0811aa9 100644 --- a/accel.h +++ b/accel.h @@ -15,6 +15,9 @@ typedef struct QEMUAccel { #ifndef CONFIG_USER_ONLY uint64_t (*get_real_ticks)(void); #endif + void (*register_physical_memory)(uint64_t start_addr, + ram_addr_t size, ram_addr_t phys_offset); + } QEMUAccel; typedef struct QEMUCont { @@ -131,4 +134,10 @@ static inline uint64_t accel_get_real_ticks(void) } #endif +static inline void accel_register_phys_mem(uint64_t start_addr, + ram_addr_t size, + ram_addr_t phys_offset) +{ + current_accel->register_physical_memory(start_addr, size, phys_offset); +} #endif diff --git a/exec.c b/exec.c index ac378a5..bd2a26f 100644 --- a/exec.c +++ b/exec.c @@ -2189,12 +2189,13 @@ static void *subpage_init (target_phys_addr_t base, ram_addr_t *phys, } \ } while (0) -/* register physical memory. 'size' must be a multiple of the target - page size. If (phys_offset & ~TARGET_PAGE_MASK) != 0, then it is an - io memory page */ -void cpu_register_physical_memory(target_phys_addr_t start_addr, - ram_addr_t size, - ram_addr_t phys_offset) +/* Use this version of cpu registering physical memory in accel-specific code. It exists + * to avoid chicken and egg problems with code that might need to register memory in qemu, + * but not with the underlying accelerator + */ +void __cpu_register_physical_memory(target_phys_addr_t start_addr, + ram_addr_t size, + ram_addr_t phys_offset) { target_phys_addr_t addr, end_addr; PhysPageDesc *p; @@ -2202,13 +2203,6 @@ void cpu_register_physical_memory(target_phys_addr_t start_addr, ram_addr_t orig_size = size; void *subpage; -#ifdef USE_KQEMU - /* XXX: should not depend on cpu context */ - env = first_cpu; - if (env && env->kqemu_enabled) { - kqemu_set_phys_mem(start_addr, size, phys_offset); - } -#endif size = (size + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK; end_addr = start_addr + (target_phys_addr_t)size; for(addr = start_addr; addr != end_addr; addr += TARGET_PAGE_SIZE) { @@ -2266,6 +2260,18 @@ void cpu_register_physical_memory(target_phys_addr_t start_addr, } } +/* register physical memory. 'size' must be a multiple of the target + page size. If (phys_offset & ~TARGET_PAGE_MASK) != 0, then it is an + io memory page */ +void cpu_register_physical_memory(target_phys_addr_t start_addr, + ram_addr_t size, + ram_addr_t phys_offset) +{ + accel_register_phys_mem(start_addr, size, phys_offset); + + __cpu_register_physical_memory(start_addr, size, phys_offset); +} + /* XXX: temporary until new memory mapping API */ ram_addr_t cpu_get_physical_page_desc(target_phys_addr_t addr) { diff --git a/kqemu.c b/kqemu.c index 9b4263d..248c4f5 100644 --- a/kqemu.c +++ b/kqemu.c @@ -450,6 +450,7 @@ QEMUAccel kqemu_accel = { performance reasons */ .get_real_ticks = cpu_get_real_ticks, #endif + .register_physical_memory = kqemu_set_phys_mem, }; struct fpstate { @@ -1104,7 +1105,7 @@ static void qpi_init(void) qpi_io_memory = cpu_register_io_memory(0, qpi_mem_read, qpi_mem_write, NULL); - cpu_register_physical_memory(kqemu_comm_base & ~0xfff, + __cpu_register_physical_memory(kqemu_comm_base & ~0xfff, 0x1000, qpi_io_memory); } #endif -- 1.5.5.1