From: Corey Minyard <cminy...@mvista.com> 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 <cminy...@mvista.com> --- hw/pc.c | 24 ++++++++++++++---------- hw/pc.h | 11 ++++++----- hw/pc_piix.c | 12 ++++++++---- 3 files changed, 28 insertions(+), 19 deletions(-) diff --git a/hw/pc.c b/hw/pc.c index fb1ad5b..bc753c0 100644 --- a/hw/pc.c +++ b/hw/pc.c @@ -970,21 +970,13 @@ 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, +void pc_memory_init(MemoryRegion *system_memory, 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 a662090..d727dfb 100644 --- a/hw/pc.h +++ b/hw/pc.h @@ -106,14 +106,15 @@ void pc_register_ferr_irq(qemu_irq irq); 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, +void pc_memory_init(MemoryRegion *system_memory, 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 98a06fa..2c3feaa 100644 --- a/hw/pc_piix.c +++ b/hw/pc_piix.c @@ -178,10 +178,8 @@ static void pc_init1(MemoryRegion *system_memory, /* allocate ram and load rom/bios */ if (!xen_enabled()) { - fw_cfg = 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)); @@ -275,6 +273,12 @@ static void pc_init1(MemoryRegion *system_memory, pci_create_simple(pci_bus, piix3_devfn + 2, "piix3-usb-uhci"); } + if (!xen_enabled()) { + fw_cfg = pc_bios_init(kernel_filename, kernel_cmdline, + initrd_filename, below_4g_mem_size, + pci_enabled ? rom_memory : system_memory); + } + if (pci_enabled && acpi_enabled) { i2c_bus *smbus; -- 1.7.4.1