I missed Xen while converting stuff to the memory API, as it''s not in hw/. Here comes the first simple patches; expect more as ram_addr_t is retired. Please review & test (build tested only here). Also in git://git.kernel.org/pub/scm/virt/kvm/qemu-kvm.git memory/xen (includes a patchset not yet merged upstream) Avi Kivity (2): memory, xen: pass MemoryRegion to xen_ram_alloc() xen: convert to memory API exec-obsolete.h | 7 +++++-- exec.c | 10 ++++++---- hw/xen.h | 4 +++- memory.c | 6 +++--- xen-all.c | 43 +++++++++++++++++++++++-------------------- xen-stub.c | 3 ++- 6 files changed, 42 insertions(+), 31 deletions(-) -- 1.7.7.1
Avi Kivity
2011-Dec-18 15:32 UTC
[PATCH 1/2] memory, xen: pass MemoryRegion to xen_ram_alloc()
Currently xen_ram_alloc() relies on ram_addr, which is going away. Give it something else to use as a cookie. Signed-off-by: Avi Kivity <avi@redhat.com> --- exec-obsolete.h | 7 +++++-- exec.c | 10 ++++++---- hw/xen.h | 4 +++- memory.c | 6 +++--- xen-all.c | 2 +- xen-stub.c | 3 ++- 6 files changed, 20 insertions(+), 12 deletions(-) diff --git a/exec-obsolete.h b/exec-obsolete.h index bf0dea5..1d0b610 100644 --- a/exec-obsolete.h +++ b/exec-obsolete.h @@ -25,9 +25,12 @@ #ifndef CONFIG_USER_ONLY +#include "memory.h" + ram_addr_t qemu_ram_alloc_from_ptr(DeviceState *dev, const char *name, - ram_addr_t size, void *host); -ram_addr_t qemu_ram_alloc(DeviceState *dev, const char *name, ram_addr_t size); + ram_addr_t size, void *host, MemoryRegion *mr); +ram_addr_t qemu_ram_alloc(DeviceState *dev, const char *name, ram_addr_t size, + MemoryRegion *mr); void qemu_ram_free(ram_addr_t addr); void qemu_ram_free_from_ptr(ram_addr_t addr); diff --git a/exec.c b/exec.c index 8fbf7e4..05336a5 100644 --- a/exec.c +++ b/exec.c @@ -2918,7 +2918,8 @@ static ram_addr_t last_ram_offset(void) } ram_addr_t qemu_ram_alloc_from_ptr(DeviceState *dev, const char *name, - ram_addr_t size, void *host) + ram_addr_t size, void *host, + MemoryRegion *mr) { RAMBlock *new_block, *block; @@ -2974,7 +2975,7 @@ ram_addr_t qemu_ram_alloc_from_ptr(DeviceState *dev, const char *name, } #else if (xen_enabled()) { - xen_ram_alloc(new_block->offset, size); + xen_ram_alloc(new_block->offset, size, mr); } else { new_block->host = qemu_vmalloc(size); } @@ -2997,9 +2998,10 @@ ram_addr_t qemu_ram_alloc_from_ptr(DeviceState *dev, const char *name, return new_block->offset; } -ram_addr_t qemu_ram_alloc(DeviceState *dev, const char *name, ram_addr_t size) +ram_addr_t qemu_ram_alloc(DeviceState *dev, const char *name, ram_addr_t size, + MemoryRegion *mr) { - return qemu_ram_alloc_from_ptr(dev, name, size, NULL); + return qemu_ram_alloc_from_ptr(dev, name, size, NULL, mr); } void qemu_ram_free_from_ptr(ram_addr_t addr) diff --git a/hw/xen.h b/hw/xen.h index 2162111..f9f66e8 100644 --- a/hw/xen.h +++ b/hw/xen.h @@ -44,7 +44,9 @@ void xen_vcpu_init(void); void xenstore_store_pv_console_info(int i, struct CharDriverState *chr); #if defined(NEED_CPU_H) && !defined(CONFIG_USER_ONLY) -void xen_ram_alloc(ram_addr_t ram_addr, ram_addr_t size); +struct MemoryRegion; +void xen_ram_alloc(ram_addr_t ram_addr, ram_addr_t size, + struct MemoryRegion *mr); #endif #if defined(CONFIG_XEN) && CONFIG_XEN_CTRL_INTERFACE_VERSION < 400 diff --git a/memory.c b/memory.c index d2ba9c4..cbd6988 100644 --- a/memory.c +++ b/memory.c @@ -985,7 +985,7 @@ void memory_region_init_ram(MemoryRegion *mr, memory_region_init(mr, name, size); mr->terminates = true; mr->destructor = memory_region_destructor_ram; - mr->ram_addr = qemu_ram_alloc(dev, name, size); + mr->ram_addr = qemu_ram_alloc(dev, name, size, mr); mr->backend_registered = true; } @@ -998,7 +998,7 @@ void memory_region_init_ram_ptr(MemoryRegion *mr, memory_region_init(mr, name, size); mr->terminates = true; mr->destructor = memory_region_destructor_ram_from_ptr; - mr->ram_addr = qemu_ram_alloc_from_ptr(dev, name, size, ptr); + mr->ram_addr = qemu_ram_alloc_from_ptr(dev, name, size, ptr, mr); mr->backend_registered = true; } @@ -1025,7 +1025,7 @@ void memory_region_init_rom_device(MemoryRegion *mr, mr->opaque = opaque; mr->terminates = true; mr->destructor = memory_region_destructor_rom_device; - mr->ram_addr = qemu_ram_alloc(dev, name, size); + mr->ram_addr = qemu_ram_alloc(dev, name, size, mr); mr->ram_addr |= cpu_register_io_memory(memory_region_read_thunk, memory_region_write_thunk, mr, diff --git a/xen-all.c b/xen-all.c index b5e28ab..b441fc1 100644 --- a/xen-all.c +++ b/xen-all.c @@ -181,7 +181,7 @@ static void xen_ram_init(ram_addr_t ram_size) } } -void xen_ram_alloc(ram_addr_t ram_addr, ram_addr_t size) +void xen_ram_alloc(ram_addr_t ram_addr, ram_addr_t size, MemoryRegion *mr) { unsigned long nr_pfn; xen_pfn_t *pfn_list; diff --git a/xen-stub.c b/xen-stub.c index efe2ab5..5fa400f 100644 --- a/xen-stub.c +++ b/xen-stub.c @@ -8,6 +8,7 @@ #include "qemu-common.h" #include "hw/xen.h" +#include "memory.h" void xenstore_store_pv_console_info(int i, CharDriverState *chr) { @@ -30,7 +31,7 @@ void xen_cmos_set_s3_resume(void *opaque, int irq, int level) { } -void xen_ram_alloc(ram_addr_t ram_addr, ram_addr_t size) +void xen_ram_alloc(ram_addr_t ram_addr, ram_addr_t size, MemoryRegion *mr) { } -- 1.7.7.1
Undo the private implementation of qemu_ram_alloc(); use the global one (which calls right back into xen_ram_alloc()). Signed-off-by: Avi Kivity <avi@redhat.com> --- xen-all.c | 41 ++++++++++++++++++++++------------------- 1 files changed, 22 insertions(+), 19 deletions(-) diff --git a/xen-all.c b/xen-all.c index b441fc1..bd89889 100644 --- a/xen-all.c +++ b/xen-all.c @@ -16,6 +16,7 @@ #include "range.h" #include "xen-mapcache.h" #include "trace.h" +#include "exec-memory.h" #include <xen/hvm/ioreq.h> #include <xen/hvm/params.h> @@ -31,6 +32,8 @@ do { } while (0) #endif +static MemoryRegion ram_memory, ram_640k, ram_lo, ram_hi; + /* Compatibility with older version */ #if __XEN_LATEST_INTERFACE_VERSION__ < 0x0003020a static inline uint32_t xen_vcpu_eport(shared_iopage_t *shared_page, int i) @@ -137,27 +140,18 @@ static void xen_set_irq(void *opaque, int irq, int level) static void xen_ram_init(ram_addr_t ram_size) { - RAMBlock *new_block; + MemoryRegion *sysmem = get_system_memory(); ram_addr_t below_4g_mem_size, above_4g_mem_size = 0; + ram_addr_t block_len; - new_block = g_malloc0(sizeof (*new_block)); - pstrcpy(new_block->idstr, sizeof (new_block->idstr), "xen.ram"); - new_block->host = NULL; - new_block->offset = 0; - new_block->length = ram_size; + block_len = ram_size; if (ram_size >= HVM_BELOW_4G_RAM_END) { /* Xen does not allocate the memory continuously, and keep a hole at * HVM_BELOW_4G_MMIO_START of HVM_BELOW_4G_MMIO_LENGTH */ - new_block->length += HVM_BELOW_4G_MMIO_LENGTH; + block_len += HVM_BELOW_4G_MMIO_LENGTH; } - - QLIST_INSERT_HEAD(&ram_list.blocks, new_block, next); - - ram_list.phys_dirty = g_realloc(ram_list.phys_dirty, - new_block->length >> TARGET_PAGE_BITS); - memset(ram_list.phys_dirty + (new_block->offset >> TARGET_PAGE_BITS), - 0xff, new_block->length >> TARGET_PAGE_BITS); + memory_region_init_ram(&ram_memory, NULL, "xen.ram", block_len); if (ram_size >= HVM_BELOW_4G_RAM_END) { above_4g_mem_size = ram_size - HVM_BELOW_4G_RAM_END; @@ -166,18 +160,23 @@ static void xen_ram_init(ram_addr_t ram_size) below_4g_mem_size = ram_size; } - cpu_register_physical_memory(0, 0xa0000, 0); + memory_region_init_alias(&ram_640k, "xen.ram.640k", + &ram_memory, 0, 0xa0000); + memory_region_add_subregion(sysmem, 0, &ram_640k); /* Skip of the VGA IO memory space, it will be registered later by the VGA * emulated device. * * The area between 0xc0000 and 0x100000 will be used by SeaBIOS to load * the Options ROM, so it is registered here as RAM. */ - cpu_register_physical_memory(0xc0000, below_4g_mem_size - 0xc0000, - 0xc0000); + memory_region_init_alias(&ram_lo, "xen.ram.lo", + &ram_memory, 0xc0000, below_4g_mem_size - 0xc0000); + memory_region_add_subregion(sysmem, 0xc0000, &ram_lo); if (above_4g_mem_size > 0) { - cpu_register_physical_memory(0x100000000ULL, above_4g_mem_size, - 0x100000000ULL); + memory_region_init_alias(&ram_hi, "xen.ram.hi", + &ram_memory, 0x100000000ULL, + above_4g_mem_size); + memory_region_add_subregion(sysmem, 0x100000000ULL, &ram_hi); } } @@ -187,6 +186,10 @@ void xen_ram_alloc(ram_addr_t ram_addr, ram_addr_t size, MemoryRegion *mr) xen_pfn_t *pfn_list; int i; + if (mr == &ram_memory) { + return; + } + trace_xen_ram_alloc(ram_addr, size); nr_pfn = size >> TARGET_PAGE_BITS; -- 1.7.7.1
On 18 December 2011 15:32, Avi Kivity <avi@redhat.com> wrote:> I missed Xen while converting stuff to the memory API, as it''s not in hw/. > > Here comes the first simple patches; expect more as ram_addr_t is retired.Er, ram_addr_t is going away? Can you elaborate? -- PMM
On 12/18/2011 05:43 PM, Peter Maydell wrote:> On 18 December 2011 15:32, Avi Kivity <avi@redhat.com> wrote: > > I missed Xen while converting stuff to the memory API, as it''s not in hw/. > > > > Here comes the first simple patches; expect more as ram_addr_t is retired. > > Er, ram_addr_t is going away? Can you elaborate? >Nothing dramatic. Uses of ram_addr_t to denote RAM will be replaced by a (MemoryRegion *, offset) pair. The type of the offset will be called ram_addr_t. -- error compiling committee.c: too many arguments to function