From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KszQx-0004LC-PM for qemu-devel@nongnu.org; Thu, 23 Oct 2008 08:37:00 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KszQw-0004KA-0D for qemu-devel@nongnu.org; Thu, 23 Oct 2008 08:36:59 -0400 Received: from [199.232.76.173] (port=51050 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KszQv-0004K4-Rd for qemu-devel@nongnu.org; Thu, 23 Oct 2008 08:36:57 -0400 Received: from mx2.redhat.com ([66.187.237.31]:57889) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1KszQv-0001PE-F7 for qemu-devel@nongnu.org; Thu, 23 Oct 2008 08:36:57 -0400 From: Glauber Costa Date: Thu, 23 Oct 2008 12:19:03 -0200 Message-Id: <1224771556-11146-20-git-send-email-glommer@redhat.com> In-Reply-To: <1224771556-11146-1-git-send-email-glommer@redhat.com> References: <1224771556-11146-1-git-send-email-glommer@redhat.com> Subject: [Qemu-devel] [PATCH 19/32] 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 +++++++++ cpu-all.h | 4 ++++ exec.c | 32 +++++++++++++++++++------------- kqemu.c | 3 ++- 5 files changed, 35 insertions(+), 14 deletions(-) diff --git a/accel.c b/accel.c index 74f7c89..bf1194d 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 3e49a93..dbb6372 100644 --- a/accel.h +++ b/accel.h @@ -17,6 +17,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 { @@ -133,4 +136,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/cpu-all.h b/cpu-all.h index 0150827..edefb45 100644 --- a/cpu-all.h +++ b/cpu-all.h @@ -863,6 +863,10 @@ extern ram_addr_t ram_size; typedef void CPUWriteMemoryFunc(void *opaque, target_phys_addr_t addr, uint32_t value); typedef uint32_t CPUReadMemoryFunc(void *opaque, target_phys_addr_t addr); +/* this is a private version, meant for internal use of accelerators */ +void __cpu_register_physical_memory(target_phys_addr_t start_addr, + ram_addr_t size, + ram_addr_t phys_offset); void cpu_register_physical_memory(target_phys_addr_t start_addr, ram_addr_t size, ram_addr_t phys_offset); diff --git a/exec.c b/exec.c index 005785a..80b8a78 100644 --- a/exec.c +++ b/exec.c @@ -2183,12 +2183,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; @@ -2196,13 +2197,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) { @@ -2260,6 +2254,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 68ec917..f4d905a 100644 --- a/kqemu.c +++ b/kqemu.c @@ -1048,7 +1048,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); } @@ -1124,6 +1124,7 @@ QEMUAccel kqemu_accel = { performance reasons */ .get_real_ticks = cpu_get_real_ticks, #endif + .register_physical_memory = kqemu_set_phys_mem, }; #endif -- 1.5.5.1