On Wed, 16 Apr 2014 16:59:25 +0800 Hu Tao <hu...@cn.fujitsu.com> wrote:
> On Fri, Apr 04, 2014 at 03:36:38PM +0200, Igor Mammedov wrote: > > initialize and map hotplug memory address space container > > into guest's RAM address space. > > > > Signed-off-by: Igor Mammedov <imamm...@redhat.com> > > --- > > hw/i386/pc.c | 19 +++++++++++++++++-- > > include/hw/i386/pc.h | 10 ++++++++++ > > 2 files changed, 27 insertions(+), 2 deletions(-) > > > > diff --git a/hw/i386/pc.c b/hw/i386/pc.c > > index 32b4003..69e4225 100644 > > --- a/hw/i386/pc.c > > +++ b/hw/i386/pc.c > > @@ -1171,6 +1171,9 @@ FWCfgState *pc_memory_init(MemoryRegion > > *system_memory, > > MemoryRegion *ram, *option_rom_mr; > > MemoryRegion *ram_below_4g, *ram_above_4g; > > FWCfgState *fw_cfg; > > + ram_addr_t ram_size = below_4g_mem_size + above_4g_mem_size; > > + MachineState *machine = MACHINE(qdev_get_machine()); > > + PCMachineState *pcms = PC_MACHINE(machine); > > > > linux_boot = (kernel_filename != NULL); > > > > @@ -1179,8 +1182,7 @@ FWCfgState *pc_memory_init(MemoryRegion > > *system_memory, > > * with older qemus that used qemu_ram_alloc(). > > */ > > ram = g_malloc(sizeof(*ram)); > > - memory_region_init_ram(ram, NULL, "pc.ram", > > - below_4g_mem_size + above_4g_mem_size); > > + memory_region_init_ram(ram, NULL, "pc.ram", ram_size); > > vmstate_register_ram_global(ram); > > *ram_memory = ram; > > ram_below_4g = g_malloc(sizeof(*ram_below_4g)); > > @@ -1197,6 +1199,19 @@ FWCfgState *pc_memory_init(MemoryRegion > > *system_memory, > > e820_add_entry(0x100000000ULL, above_4g_mem_size, E820_RAM); > > } > > > > + /* initialize hotplug memory address space */ > > + if (ram_size < machine->init_args.maxram_size) { > > + ram_addr_t hotplug_mem_size = > > + machine->init_args.maxram_size - ram_size; > > + > > + pcms->hotplug_memory_base = > > + ROUND_UP(0x100000000ULL + above_4g_mem_size, 1ULL << 30); > > -m maxmem should be limited otherwise hotplug_memory_base + maxmem can > overflow(in dimm_get_free_addr()). If overflow happens than dimm_get_free_addr() will return error, if you look its end. dimm_get_free_addr() { ... if (new_start < address_space_start) { error_setg(... that of cause doesn't mean that maxmem limit shouldn't be set and verified with proper error reporting in case of one. Is there any suggestion as to what max supported RAM amount should be?