From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LPLgx-00034P-DS for qemu-devel@nongnu.org; Tue, 20 Jan 2009 13:51:15 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LPLgv-00033L-Dh for qemu-devel@nongnu.org; Tue, 20 Jan 2009 13:51:14 -0500 Received: from [199.232.76.173] (port=48487 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LPLgv-00032Z-8v for qemu-devel@nongnu.org; Tue, 20 Jan 2009 13:51:13 -0500 Received: from mx2.redhat.com ([66.187.237.31]:59032) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1LPLgs-0003vO-Mt for qemu-devel@nongnu.org; Tue, 20 Jan 2009 13:51:11 -0500 From: Glauber Costa Date: Tue, 20 Jan 2009 13:51:04 -0500 Message-Id: <1232477465-32386-6-git-send-email-glommer@redhat.com> In-Reply-To: <1232477465-32386-5-git-send-email-glommer@redhat.com> References: <1232477465-32386-1-git-send-email-glommer@redhat.com> <1232477465-32386-2-git-send-email-glommer@redhat.com> <1232477465-32386-3-git-send-email-glommer@redhat.com> <1232477465-32386-4-git-send-email-glommer@redhat.com> <1232477465-32386-5-git-send-email-glommer@redhat.com> Subject: [Qemu-devel] [PATCH 5/6] hook cpu_register_physical_mem 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 Since now we have our own memory read/write function, we don't depend on all of tcg data structures anymore. So, instead of filling them up, bypass it altogether by using kvm_set_phys mem alone. To do that, we now have to provide our own way to get page information given the address. (kvm_get_physical_page_desc) Signed-off-by: Glauber Costa --- exec.c | 44 +++++++++++++++++++++++++++++--------------- kvm-all.c | 13 +++++++++++++ kvm.h | 2 ++ 3 files changed, 44 insertions(+), 15 deletions(-) diff --git a/exec.c b/exec.c index 20ac972..f009e41 100644 --- a/exec.c +++ b/exec.c @@ -2260,14 +2260,8 @@ 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. The address used when calling the IO function is - the offset from the start of the region, plus region_offset. Both - start_region and regon_offset are rounded down to a page boundary - before calculating this offset. This should not be a problem unless - the low bits of start_addr and region_offset differ. */ -void cpu_register_physical_memory_offset(target_phys_addr_t start_addr, + +static void default_register_physical_memory_offset(target_phys_addr_t start_addr, ram_addr_t size, ram_addr_t phys_offset, ram_addr_t region_offset) @@ -2285,8 +2279,6 @@ void cpu_register_physical_memory_offset(target_phys_addr_t start_addr, kqemu_set_phys_mem(start_addr, size, phys_offset); } #endif - if (kvm_enabled()) - kvm_set_phys_mem(start_addr, size, phys_offset); region_offset &= TARGET_PAGE_MASK; size = (size + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK; @@ -2353,15 +2345,37 @@ void cpu_register_physical_memory_offset(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. The address used when calling the IO function is + the offset from the start of the region, plus region_offset. Both + start_region and regon_offset are rounded down to a page boundary + before calculating this offset. This should not be a problem unless + the low bits of start_addr and region_offset differ. */ +void cpu_register_physical_memory_offset(target_phys_addr_t start_addr, + ram_addr_t size, + ram_addr_t phys_offset, + ram_addr_t region_offset) +{ + if (kvm_enabled()) + kvm_set_phys_mem(start_addr, size, phys_offset); + else + default_register_physical_memory_offset(start_addr, size, phys_offset, region_offset); +} + /* XXX: temporary until new memory mapping API */ ram_addr_t cpu_get_physical_page_desc(target_phys_addr_t addr) { - PhysPageDesc *p; + if (kvm_enabled()) { + return kvm_get_physical_page_desc(addr); + } else { + PhysPageDesc *p; - p = phys_page_find(addr >> TARGET_PAGE_BITS); - if (!p) - return IO_MEM_UNASSIGNED; - return p->phys_offset; + p = phys_page_find(addr >> TARGET_PAGE_BITS); + if (!p) + return IO_MEM_UNASSIGNED; + return p->phys_offset; + } } void qemu_register_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size) diff --git a/kvm-all.c b/kvm-all.c index 9cbb2f9..85f2922 100644 --- a/kvm-all.c +++ b/kvm-all.c @@ -709,3 +709,16 @@ void kvm_cpu_physical_memory_rw(target_phys_addr_t addr, uint8_t *buf, kvm_cpu_physical_memory_rw(addr + l, buf + l, len - l, is_write); } } + +ram_addr_t kvm_get_physical_page_desc(target_phys_addr_t addr) +{ + + KVMSlot *mem; + KVMState *s = kvm_state; + mem = kvm_lookup_slot(s, addr); + + if (!mem) + return IO_MEM_UNASSIGNED; + else + return (addr - mem->start_addr) + mem->phys_offset; +} diff --git a/kvm.h b/kvm.h index e3e9ca0..776cfcf 100644 --- a/kvm.h +++ b/kvm.h @@ -51,6 +51,8 @@ int kvm_uncoalesce_mmio_region(target_phys_addr_t start, ram_addr_t size); void kvm_cpu_physical_memory_rw(target_phys_addr_t addr, uint8_t *buf, int len, int is_write); + +ram_addr_t kvm_get_physical_page_desc(target_phys_addr_t addr); /* internal API */ struct KVMState; -- 1.5.6.5