From: Jan Kiszka <jan.kis...@siemens.com> This is based on the original fix by Hervé Poussineau: pc_memory_init actually takes a memory region for mapping BIOS and extension ROMs. That equals the PCI memory region if PCI is available, but must be system memory in the ISA case.
Signed-off-by: Jan Kiszka <jan.kis...@siemens.com> --- hw/pc.c | 8 ++++---- hw/pc.h | 2 +- hw/pc_piix.c | 13 ++++++++++--- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/hw/pc.c b/hw/pc.c index fcaae9f..992c61d 100644 --- a/hw/pc.c +++ b/hw/pc.c @@ -962,7 +962,7 @@ void pc_memory_init(MemoryRegion *system_memory, const char *initrd_filename, ram_addr_t below_4g_mem_size, ram_addr_t above_4g_mem_size, - MemoryRegion *pci_memory, + MemoryRegion *rom_memory, MemoryRegion **ram_memory) { char *filename; @@ -1026,7 +1026,7 @@ void pc_memory_init(MemoryRegion *system_memory, isa_bios = g_malloc(sizeof(*isa_bios)); memory_region_init_alias(isa_bios, "isa-bios", bios, bios_size - isa_bios_size, isa_bios_size); - memory_region_add_subregion_overlap(pci_memory, + memory_region_add_subregion_overlap(rom_memory, 0x100000 - isa_bios_size, isa_bios, 1); @@ -1034,13 +1034,13 @@ void pc_memory_init(MemoryRegion *system_memory, option_rom_mr = g_malloc(sizeof(*option_rom_mr)); memory_region_init_ram(option_rom_mr, NULL, "pc.rom", PC_ROM_SIZE); - memory_region_add_subregion_overlap(pci_memory, + memory_region_add_subregion_overlap(rom_memory, PC_ROM_MIN_VGA, option_rom_mr, 1); /* map all the bios at the top of memory */ - memory_region_add_subregion(pci_memory, + memory_region_add_subregion(rom_memory, (uint32_t)(-bios_size), bios); diff --git a/hw/pc.h b/hw/pc.h index 958c77d..36749b0 100644 --- a/hw/pc.h +++ b/hw/pc.h @@ -137,7 +137,7 @@ void pc_memory_init(MemoryRegion *system_memory, const char *initrd_filename, ram_addr_t below_4g_mem_size, ram_addr_t above_4g_mem_size, - MemoryRegion *pci_memory, + MemoryRegion *rom_memory, MemoryRegion **ram_memory); qemu_irq *pc_allocate_cpu_irq(void); void pc_vga_init(PCIBus *pci_bus); diff --git a/hw/pc_piix.c b/hw/pc_piix.c index 75d96d9..52939f5 100644 --- a/hw/pc_piix.c +++ b/hw/pc_piix.c @@ -97,6 +97,7 @@ static void pc_init1(MemoryRegion *system_memory, ISADevice *rtc_state; MemoryRegion *ram_memory; MemoryRegion *pci_memory; + MemoryRegion *rom_memory; pc_cpus_init(cpu_model); @@ -112,15 +113,21 @@ static void pc_init1(MemoryRegion *system_memory, below_4g_mem_size = ram_size; } - pci_memory = g_new(MemoryRegion, 1); - memory_region_init(pci_memory, "pci", INT64_MAX); + if (pci_enabled) { + pci_memory = g_new(MemoryRegion, 1); + memory_region_init(pci_memory, "pci", INT64_MAX); + rom_memory = pci_memory; + } else { + pci_memory = NULL; + rom_memory = system_memory; + } /* allocate ram and load rom/bios */ if (!xen_enabled()) { pc_memory_init(system_memory, kernel_filename, kernel_cmdline, initrd_filename, below_4g_mem_size, above_4g_mem_size, - pci_memory, &ram_memory); + rom_memory, &ram_memory); } if (!xen_enabled()) { -- 1.7.3.4