@@ -1023,36 +1023,19 @@ void pc_acpi_init(const char *default_dsdt)
}
}
-FWCfgState *pc_memory_init(MemoryRegion *system_memory,
- const char *kernel_filename,
+FWCfgState *pc_memory_init(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)
+ ram_addr_t above_4g_mem_size)
{
- int linux_boot, i;
- MemoryRegion *option_rom_mr;
+ int i;
FWCfgState *fw_cfg;
- linux_boot = (kernel_filename != NULL);
-
-
- /* Initialize PC system firmware */
- pc_system_firmware_init(rom_memory);
-
- option_rom_mr = g_malloc(sizeof(*option_rom_mr));
- memory_region_init_ram(option_rom_mr, "pc.rom", PC_ROM_SIZE);
- vmstate_register_ram_global(option_rom_mr);
- memory_region_add_subregion_overlap(rom_memory,
- PC_ROM_MIN_VGA,
- option_rom_mr,
- 1);
-
fw_cfg = bochs_bios_init();
rom_set_fw(fw_cfg);
- if (linux_boot) {
+ if (kernel_filename) {
load_linux(fw_cfg, kernel_filename, initrd_filename, kernel_cmdline, below_4g_mem_size);
}
@@ -1380,6 +1363,16 @@ static int memory_controller_init(PCIDevice *dev)
dev->config[0x72] = 0x02;
cpu_smm_register(c->set_smm, m);
+
+ pc_system_firmware_init(m->pci_address_space);
+
+ memory_region_init_ram(&m->option_roms, "pc.rom", PC_ROM_SIZE);
+ vmstate_register_ram_global(&m->option_roms);
+ memory_region_add_subregion_overlap(m->pci_address_space,
+ PC_ROM_MIN_VGA,
+ &m->option_roms,
+ 1);
+
return 0;
}
@@ -86,7 +86,6 @@ static void pc_init1(MemoryRegion *system_memory,
ISADevice *rtc_state;
ISADevice *floppy;
MemoryRegion *pci_memory;
- MemoryRegion *rom_memory;
DeviceState *icc_bridge;
FWCfgState *fw_cfg = NULL;
ISAPc *isapc = NULL;
@@ -135,18 +134,10 @@ static void pc_init1(MemoryRegion *system_memory,
}
isa_bus_irqs(isa_bus, gsi);
- if (pci_enabled) {
- rom_memory = pci_memory;
- } else {
- rom_memory = 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,
- rom_memory);
+ fw_cfg = pc_memory_init(kernel_filename, kernel_cmdline, initrd_filename,
+ below_4g_mem_size, above_4g_mem_size);
}
if (kvm_irqchip_in_kernel()) {
@@ -64,7 +64,6 @@ static void pc_q35_init(QEMUMachineInitArgs *args)
BusState *idebus[MAX_SATA_PORTS];
ISADevice *rtc_state;
ISADevice *floppy;
- MemoryRegion *rom_memory;
GSIState *gsi_state;
ISABus *isa_bus;
int pci_enabled = 1;
@@ -96,18 +95,10 @@ static void pc_q35_init(QEMUMachineInitArgs *args)
below_4g_mem_size = ram_size;
}
- /* pci enabled */
- if (pci_enabled) {
- rom_memory = &q35_host->pci_address_space;
- } else {
- rom_memory = get_system_memory();
- }
-
/* allocate ram and load rom/bios */
if (!xen_enabled()) {
- pc_memory_init(get_system_memory(), kernel_filename, kernel_cmdline,
- initrd_filename, below_4g_mem_size, above_4g_mem_size,
- rom_memory);
+ pc_memory_init(kernel_filename, kernel_cmdline,
+ initrd_filename, below_4g_mem_size, above_4g_mem_size);
}
/* irq lines */
@@ -1,4 +1,6 @@
+#include "hw/i386/pc.h"
#include "hw/isa/isa_pc.h"
+#include "hw/loader.h"
static void isa_pc_realize(DeviceState *dev, Error **errp)
{
@@ -17,6 +19,15 @@ static void isa_pc_realize(DeviceState *dev, Error **errp)
memory_region_init_ram(&isapc->ram, "pc.ram", isapc->ram_size);
vmstate_register_ram_global(&isapc->ram);
memory_region_add_subregion(isapc->address_space_mem, 0, &isapc->ram);
+
+ pc_system_firmware_init(isapc->address_space_mem);
+
+ memory_region_init_ram(&isapc->option_roms, "pc.rom", PC_ROM_SIZE);
+ vmstate_register_ram_global(&isapc->option_roms);
+ memory_region_add_subregion_overlap(isapc->address_space_mem,
+ PC_ROM_MIN_VGA,
+ &isapc->option_roms,
+ 1);
}
static void isa_pc_class_init(ObjectClass *klass, void *data)
@@ -36,6 +36,7 @@ typedef struct MemoryController {
MemoryRegion *system_memory;
MemoryRegion *pci_address_space;
MemoryRegion *ram_memory;
+ MemoryRegion option_roms;
MemoryRegion pci_hole;
MemoryRegion pci_hole_64bit;
PAMMemoryRegion pam_regions[13];
@@ -128,13 +129,11 @@ void pc_acpi_smi_interrupt(void *opaque, int irq, int level);
void pc_cpus_init(const char *cpu_model, DeviceState *icc_bridge);
void pc_hot_add_cpu(const int64_t id, Error **errp);
void pc_acpi_init(const char *default_dsdt);
-FWCfgState *pc_memory_init(MemoryRegion *system_memory,
- const char *kernel_filename,
+FWCfgState *pc_memory_init(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);
+ ram_addr_t above_4g_mem_size);
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,
@@ -19,6 +19,7 @@ struct ISAPc {
MemoryRegion *address_space_mem;
MemoryRegion *address_space_io;
+ MemoryRegion option_roms;
MemoryRegion ram;
ram_addr_t ram_size;
};
Signed-off-by: Hu Tao <hutao@cn.fujitsu.com> --- hw/i386/pc.c | 35 ++++++++++++++--------------------- hw/i386/pc_piix.c | 13 ++----------- hw/i386/pc_q35.c | 13 ++----------- hw/isa/isa_pc.c | 11 +++++++++++ include/hw/i386/pc.h | 7 +++---- include/hw/isa/isa_pc.h | 1 + 6 files changed, 33 insertions(+), 47 deletions(-)