From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Subject: [RFC v5 08/86] memory: late initialization of ram_addr Date: Wed, 20 Jul 2011 19:49:18 +0300 Message-ID: <1311180636-17012-9-git-send-email-avi@redhat.com> References: <1311180636-17012-1-git-send-email-avi@redhat.com> Cc: kvm@vger.kernel.org To: qemu-devel@nongnu.org Return-path: Received: from mx1.redhat.com ([209.132.183.28]:52984 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751844Ab1GTQuo (ORCPT ); Wed, 20 Jul 2011 12:50:44 -0400 In-Reply-To: <1311180636-17012-1-git-send-email-avi@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: For non-RAM memory regions, we cannot tell whether this is an I/O region or an MMIO region. Since the qemu backing registration is different for the two, we have to defer initialization until we know which address space we are in. These shenanigans will be removed once the backing registration is unified with the memory API. Signed-off-by: Avi Kivity --- memory.c | 24 ++++++++++++++++++++---- memory.h | 1 + 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/memory.c b/memory.c index 5fda4a0..bc8bfa2 100644 --- a/memory.c +++ b/memory.c @@ -158,10 +158,14 @@ static void flatview_simplify(FlatView *view) } } +static void memory_region_prepare_ram_addr(MemoryRegion *mr); + static void as_memory_range_add(AddressSpace *as, FlatRange *fr) { ram_addr_t phys_offset, region_offset; + memory_region_prepare_ram_addr(fr->mr); + phys_offset = fr->mr->ram_addr; region_offset = fr->offset_in_region; /* cpu_register_physical_memory_log() wants region_offset for @@ -512,6 +516,19 @@ static CPUWriteMemoryFunc * const memory_region_write_thunk[] = { memory_region_write_thunk_l, }; +static void memory_region_prepare_ram_addr(MemoryRegion *mr) +{ + if (mr->backend_registered) { + return; + } + + mr->ram_addr = cpu_register_io_memory(memory_region_read_thunk, + memory_region_write_thunk, + mr, + mr->ops->endianness); + mr->backend_registered = true; +} + void memory_region_init_io(MemoryRegion *mr, const MemoryRegionOps *ops, void *opaque, @@ -522,10 +539,7 @@ void memory_region_init_io(MemoryRegion *mr, mr->ops = ops; mr->opaque = opaque; mr->terminates = true; - mr->ram_addr = cpu_register_io_memory(memory_region_read_thunk, - memory_region_write_thunk, - mr, - mr->ops->endianness); + mr->backend_registered = false; } void memory_region_init_ram(MemoryRegion *mr, @@ -536,6 +550,7 @@ void memory_region_init_ram(MemoryRegion *mr, memory_region_init(mr, name, size); mr->terminates = true; mr->ram_addr = qemu_ram_alloc(dev, name, size); + mr->backend_registered = true; } void memory_region_init_ram_ptr(MemoryRegion *mr, @@ -547,6 +562,7 @@ void memory_region_init_ram_ptr(MemoryRegion *mr, memory_region_init(mr, name, size); mr->terminates = true; mr->ram_addr = qemu_ram_alloc_from_ptr(dev, name, size, ptr); + mr->backend_registered = true; } void memory_region_init_alias(MemoryRegion *mr, diff --git a/memory.h b/memory.h index 2ad7202..0994b18 100644 --- a/memory.h +++ b/memory.h @@ -76,6 +76,7 @@ struct MemoryRegion { uint64_t size; target_phys_addr_t addr; target_phys_addr_t offset; + bool backend_registered; ram_addr_t ram_addr; bool terminates; MemoryRegion *alias; -- 1.7.5.3 From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:60908) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QjaAy-0008Ls-US for qemu-devel@nongnu.org; Wed, 20 Jul 2011 13:03:14 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QjZyv-0004w7-SE for qemu-devel@nongnu.org; Wed, 20 Jul 2011 12:51:00 -0400 Received: from mx1.redhat.com ([209.132.183.28]:41230) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QjZys-0004tX-W8 for qemu-devel@nongnu.org; Wed, 20 Jul 2011 12:50:43 -0400 From: Avi Kivity Date: Wed, 20 Jul 2011 19:49:18 +0300 Message-Id: <1311180636-17012-9-git-send-email-avi@redhat.com> In-Reply-To: <1311180636-17012-1-git-send-email-avi@redhat.com> References: <1311180636-17012-1-git-send-email-avi@redhat.com> Subject: [Qemu-devel] [RFC v5 08/86] memory: late initialization of ram_addr List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kvm@vger.kernel.org For non-RAM memory regions, we cannot tell whether this is an I/O region or an MMIO region. Since the qemu backing registration is different for the two, we have to defer initialization until we know which address space we are in. These shenanigans will be removed once the backing registration is unified with the memory API. Signed-off-by: Avi Kivity --- memory.c | 24 ++++++++++++++++++++---- memory.h | 1 + 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/memory.c b/memory.c index 5fda4a0..bc8bfa2 100644 --- a/memory.c +++ b/memory.c @@ -158,10 +158,14 @@ static void flatview_simplify(FlatView *view) } } +static void memory_region_prepare_ram_addr(MemoryRegion *mr); + static void as_memory_range_add(AddressSpace *as, FlatRange *fr) { ram_addr_t phys_offset, region_offset; + memory_region_prepare_ram_addr(fr->mr); + phys_offset = fr->mr->ram_addr; region_offset = fr->offset_in_region; /* cpu_register_physical_memory_log() wants region_offset for @@ -512,6 +516,19 @@ static CPUWriteMemoryFunc * const memory_region_write_thunk[] = { memory_region_write_thunk_l, }; +static void memory_region_prepare_ram_addr(MemoryRegion *mr) +{ + if (mr->backend_registered) { + return; + } + + mr->ram_addr = cpu_register_io_memory(memory_region_read_thunk, + memory_region_write_thunk, + mr, + mr->ops->endianness); + mr->backend_registered = true; +} + void memory_region_init_io(MemoryRegion *mr, const MemoryRegionOps *ops, void *opaque, @@ -522,10 +539,7 @@ void memory_region_init_io(MemoryRegion *mr, mr->ops = ops; mr->opaque = opaque; mr->terminates = true; - mr->ram_addr = cpu_register_io_memory(memory_region_read_thunk, - memory_region_write_thunk, - mr, - mr->ops->endianness); + mr->backend_registered = false; } void memory_region_init_ram(MemoryRegion *mr, @@ -536,6 +550,7 @@ void memory_region_init_ram(MemoryRegion *mr, memory_region_init(mr, name, size); mr->terminates = true; mr->ram_addr = qemu_ram_alloc(dev, name, size); + mr->backend_registered = true; } void memory_region_init_ram_ptr(MemoryRegion *mr, @@ -547,6 +562,7 @@ void memory_region_init_ram_ptr(MemoryRegion *mr, memory_region_init(mr, name, size); mr->terminates = true; mr->ram_addr = qemu_ram_alloc_from_ptr(dev, name, size, ptr); + mr->backend_registered = true; } void memory_region_init_alias(MemoryRegion *mr, diff --git a/memory.h b/memory.h index 2ad7202..0994b18 100644 --- a/memory.h +++ b/memory.h @@ -76,6 +76,7 @@ struct MemoryRegion { uint64_t size; target_phys_addr_t addr; target_phys_addr_t offset; + bool backend_registered; ram_addr_t ram_addr; bool terminates; MemoryRegion *alias; -- 1.7.5.3