From: Corey Minyard <cminyard@xxxxxxxxxx> Setting up the firmware interface for the SMBIOS table needs to be done later in the process, after device initialization, so that devices can add entries to the table. Signed-off-by: Corey Minyard <cminyard@xxxxxxxxxx> --- hw/pc.c | 22 +++++++++++++--------- hw/pc.h | 9 +++++---- hw/pc_piix.c | 12 ++++++++---- 3 files changed, 26 insertions(+), 17 deletions(-) diff --git a/hw/pc.c b/hw/pc.c index fb04c8b..c0acb6a 100644 --- a/hw/pc.c +++ b/hw/pc.c @@ -971,20 +971,12 @@ void pc_cpus_init(const char *cpu_model) } void pc_memory_init(MemoryRegion *system_memory, - const char *kernel_filename, - const char *kernel_cmdline, - const char *initrd_filename, ram_addr_t below_4g_mem_size, ram_addr_t above_4g_mem_size, - MemoryRegion *rom_memory, MemoryRegion **ram_memory) { - int linux_boot, i; - MemoryRegion *ram, *option_rom_mr; + MemoryRegion *ram; MemoryRegion *ram_below_4g, *ram_above_4g; - void *fw_cfg; - - linux_boot = (kernel_filename != NULL); /* Allocate RAM. We allocate it as a single memory region and use * aliases to address portions of it, mostly for backwards compatibility @@ -1006,7 +998,17 @@ void pc_memory_init(MemoryRegion *system_memory, memory_region_add_subregion(system_memory, 0x100000000ULL, ram_above_4g); } +} +void pc_bios_init(const char *kernel_filename, + const char *kernel_cmdline, + const char *initrd_filename, + ram_addr_t below_4g_mem_size, + MemoryRegion *rom_memory) +{ + MemoryRegion *option_rom_mr; + void *fw_cfg; + int linux_boot, i; /* Initialize PC system firmware */ pc_system_firmware_init(rom_memory); @@ -1019,6 +1021,8 @@ void pc_memory_init(MemoryRegion *system_memory, option_rom_mr, 1); + linux_boot = (kernel_filename != NULL); + fw_cfg = bochs_bios_init(); rom_set_fw(fw_cfg); diff --git a/hw/pc.h b/hw/pc.h index 8ccf202..33ab689 100644 --- a/hw/pc.h +++ b/hw/pc.h @@ -107,13 +107,14 @@ void pc_acpi_smi_interrupt(void *opaque, int irq, int level); void pc_cpus_init(const char *cpu_model); void pc_memory_init(MemoryRegion *system_memory, - const char *kernel_filename, - const char *kernel_cmdline, - const char *initrd_filename, ram_addr_t below_4g_mem_size, ram_addr_t above_4g_mem_size, - MemoryRegion *rom_memory, MemoryRegion **ram_memory); +void pc_bios_init(const char *kernel_filename, + const char *kernel_cmdline, + const char *initrd_filename, + ram_addr_t below_4g_mem_size, + MemoryRegion *rom_memory); qemu_irq *pc_allocate_cpu_irq(void); DeviceState *pc_vga_init(ISABus *isa_bus, PCIBus *pci_bus); void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi, diff --git a/hw/pc_piix.c b/hw/pc_piix.c index fb86f27..21b4f59 100644 --- a/hw/pc_piix.c +++ b/hw/pc_piix.c @@ -176,10 +176,8 @@ static void pc_init1(MemoryRegion *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_enabled ? rom_memory : system_memory, &ram_memory); + pc_memory_init(system_memory, below_4g_mem_size, above_4g_mem_size, + &ram_memory); } gsi_state = g_malloc0(sizeof(*gsi_state)); @@ -287,6 +285,12 @@ static void pc_init1(MemoryRegion *system_memory, if (pci_enabled) { pc_pci_device_init(pci_bus); } + + if (!xen_enabled()) { + pc_bios_init(kernel_filename, kernel_cmdline, initrd_filename, + below_4g_mem_size, + pci_enabled ? rom_memory : system_memory); + } } static void pc_init_pci(ram_addr_t ram_size, -- 1.7.4.1 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html