mirror of https://github.com/xemu-project/xemu.git
pc: initialize memory hotplug address space
initialize and map hotplug memory address space container into guest's RAM address space. Signed-off-by: Igor Mammedov <imammedo@redhat.com> Acked-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
7bb5d6ade6
commit
619d11e463
26
hw/i386/pc.c
26
hw/i386/pc.c
|
@ -1197,6 +1197,9 @@ FWCfgState *pc_memory_init(MemoryRegion *system_memory,
|
||||||
MemoryRegion *ram, *option_rom_mr;
|
MemoryRegion *ram, *option_rom_mr;
|
||||||
MemoryRegion *ram_below_4g, *ram_above_4g;
|
MemoryRegion *ram_below_4g, *ram_above_4g;
|
||||||
FWCfgState *fw_cfg;
|
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);
|
linux_boot = (kernel_filename != NULL);
|
||||||
|
|
||||||
|
@ -1205,8 +1208,7 @@ FWCfgState *pc_memory_init(MemoryRegion *system_memory,
|
||||||
* with older qemus that used qemu_ram_alloc().
|
* with older qemus that used qemu_ram_alloc().
|
||||||
*/
|
*/
|
||||||
ram = g_malloc(sizeof(*ram));
|
ram = g_malloc(sizeof(*ram));
|
||||||
memory_region_init_ram(ram, NULL, "pc.ram",
|
memory_region_init_ram(ram, NULL, "pc.ram", ram_size);
|
||||||
below_4g_mem_size + above_4g_mem_size);
|
|
||||||
vmstate_register_ram_global(ram);
|
vmstate_register_ram_global(ram);
|
||||||
*ram_memory = ram;
|
*ram_memory = ram;
|
||||||
ram_below_4g = g_malloc(sizeof(*ram_below_4g));
|
ram_below_4g = g_malloc(sizeof(*ram_below_4g));
|
||||||
|
@ -1223,6 +1225,26 @@ FWCfgState *pc_memory_init(MemoryRegion *system_memory,
|
||||||
e820_add_entry(0x100000000ULL, above_4g_mem_size, E820_RAM);
|
e820_add_entry(0x100000000ULL, above_4g_mem_size, E820_RAM);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* initialize hotplug memory address space */
|
||||||
|
if (ram_size < machine->maxram_size) {
|
||||||
|
ram_addr_t hotplug_mem_size =
|
||||||
|
machine->maxram_size - ram_size;
|
||||||
|
|
||||||
|
pcms->hotplug_memory_base =
|
||||||
|
ROUND_UP(0x100000000ULL + above_4g_mem_size, 1ULL << 30);
|
||||||
|
|
||||||
|
if ((pcms->hotplug_memory_base + hotplug_mem_size) <
|
||||||
|
hotplug_mem_size) {
|
||||||
|
error_report("unsupported amount of maximum memory: " RAM_ADDR_FMT,
|
||||||
|
machine->maxram_size);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
memory_region_init(&pcms->hotplug_memory, OBJECT(pcms),
|
||||||
|
"hotplug-memory", hotplug_mem_size);
|
||||||
|
memory_region_add_subregion(system_memory, pcms->hotplug_memory_base,
|
||||||
|
&pcms->hotplug_memory);
|
||||||
|
}
|
||||||
|
|
||||||
/* Initialize PC system firmware */
|
/* Initialize PC system firmware */
|
||||||
pc_system_firmware_init(rom_memory, guest_info->isapc_ram_fw);
|
pc_system_firmware_init(rom_memory, guest_info->isapc_ram_fw);
|
||||||
|
|
|
@ -16,9 +16,19 @@
|
||||||
|
|
||||||
#define HPET_INTCAP "hpet-intcap"
|
#define HPET_INTCAP "hpet-intcap"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PCMachineState:
|
||||||
|
* @hotplug_memory_base: address in guest RAM address space where hotplug memory
|
||||||
|
* address space begins.
|
||||||
|
* @hotplug_memory: hotplug memory addess space container
|
||||||
|
*/
|
||||||
struct PCMachineState {
|
struct PCMachineState {
|
||||||
/*< private >*/
|
/*< private >*/
|
||||||
MachineState parent_obj;
|
MachineState parent_obj;
|
||||||
|
|
||||||
|
/* <public> */
|
||||||
|
ram_addr_t hotplug_memory_base;
|
||||||
|
MemoryRegion hotplug_memory;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct PCMachineClass {
|
struct PCMachineClass {
|
||||||
|
|
Loading…
Reference in New Issue