提交 7102fa70 编写于 作者: E Eduardo Habkost 提交者: Michael S. Tsirkin

pc: Move compat boolean globals to PCMachineClass

This way the compat flags can be initialized in the machine_options()
function. This will help us to eventually eliminate the pc_compat_*()
functions.
Signed-off-by: NEduardo Habkost <ehabkost@redhat.com>
Reviewed-by: NMichael S. Tsirkin <mst@redhat.com>
Signed-off-by: NMichael S. Tsirkin <mst@redhat.com>
Reviewed-by: NMarcel Apfelbaum <marcel@redhat.com>
上级 097a50d0
...@@ -1953,6 +1953,14 @@ static void pc_machine_class_init(ObjectClass *oc, void *data) ...@@ -1953,6 +1953,14 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc); HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc);
pcmc->get_hotplug_handler = mc->get_hotplug_handler; pcmc->get_hotplug_handler = mc->get_hotplug_handler;
pcmc->pci_enabled = true;
pcmc->has_acpi_build = true;
pcmc->rsdp_in_ram = true;
pcmc->smbios_defaults = true;
pcmc->smbios_uuid_encoded = true;
pcmc->gigabyte_align = true;
pcmc->has_reserved_memory = true;
pcmc->kvmclock_enabled = true;
mc->get_hotplug_handler = pc_get_hotpug_handler; mc->get_hotplug_handler = pc_get_hotpug_handler;
mc->cpu_index_to_socket_id = pc_cpu_index_to_socket_id; mc->cpu_index_to_socket_id = pc_cpu_index_to_socket_id;
mc->default_boot_order = "cad"; mc->default_boot_order = "cad";
......
...@@ -61,26 +61,14 @@ static const int ide_iobase[MAX_IDE_BUS] = { 0x1f0, 0x170 }; ...@@ -61,26 +61,14 @@ static const int ide_iobase[MAX_IDE_BUS] = { 0x1f0, 0x170 };
static const int ide_iobase2[MAX_IDE_BUS] = { 0x3f6, 0x376 }; static const int ide_iobase2[MAX_IDE_BUS] = { 0x3f6, 0x376 };
static const int ide_irq[MAX_IDE_BUS] = { 14, 15 }; static const int ide_irq[MAX_IDE_BUS] = { 14, 15 };
static bool pci_enabled = true;
static bool has_acpi_build = true;
static bool rsdp_in_ram = true;
static int legacy_acpi_table_size; static int legacy_acpi_table_size;
static bool smbios_defaults = true;
static bool smbios_legacy_mode;
static bool smbios_uuid_encoded = true;
/* Make sure that guest addresses aligned at 1Gbyte boundaries get mapped to
* host addresses aligned at 1Gbyte boundaries. This way we can use 1GByte
* pages in the host.
*/
static bool gigabyte_align = true;
static bool has_reserved_memory = true;
static bool kvmclock_enabled = true;
/* PC hardware initialisation */ /* PC hardware initialisation */
static void pc_init1(MachineState *machine, static void pc_init1(MachineState *machine,
const char *host_type, const char *pci_type) const char *host_type, const char *pci_type)
{ {
PCMachineState *pcms = PC_MACHINE(machine); PCMachineState *pcms = PC_MACHINE(machine);
PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
MemoryRegion *system_memory = get_system_memory(); MemoryRegion *system_memory = get_system_memory();
MemoryRegion *system_io = get_system_io(); MemoryRegion *system_io = get_system_io();
int i; int i;
...@@ -109,7 +97,7 @@ static void pc_init1(MachineState *machine, ...@@ -109,7 +97,7 @@ static void pc_init1(MachineState *machine,
* breaking migration. * breaking migration.
*/ */
if (machine->ram_size >= 0xe0000000) { if (machine->ram_size >= 0xe0000000) {
lowmem = gigabyte_align ? 0xc0000000 : 0xe0000000; lowmem = pcmc->gigabyte_align ? 0xc0000000 : 0xe0000000;
} else { } else {
lowmem = 0xe0000000; lowmem = 0xe0000000;
} }
...@@ -142,11 +130,11 @@ static void pc_init1(MachineState *machine, ...@@ -142,11 +130,11 @@ static void pc_init1(MachineState *machine,
pc_cpus_init(pcms); pc_cpus_init(pcms);
if (kvm_enabled() && kvmclock_enabled) { if (kvm_enabled() && pcmc->kvmclock_enabled) {
kvmclock_create(); kvmclock_create();
} }
if (pci_enabled) { if (pcmc->pci_enabled) {
pci_memory = g_new(MemoryRegion, 1); pci_memory = g_new(MemoryRegion, 1);
memory_region_init(pci_memory, NULL, "pci", UINT64_MAX); memory_region_init(pci_memory, NULL, "pci", UINT64_MAX);
rom_memory = pci_memory; rom_memory = pci_memory;
...@@ -157,18 +145,19 @@ static void pc_init1(MachineState *machine, ...@@ -157,18 +145,19 @@ static void pc_init1(MachineState *machine,
guest_info = pc_guest_info_init(pcms); guest_info = pc_guest_info_init(pcms);
guest_info->has_acpi_build = has_acpi_build; guest_info->has_acpi_build = pcmc->has_acpi_build;
guest_info->legacy_acpi_table_size = legacy_acpi_table_size; guest_info->legacy_acpi_table_size = legacy_acpi_table_size;
guest_info->isapc_ram_fw = !pci_enabled; guest_info->isapc_ram_fw = !pcmc->pci_enabled;
guest_info->has_reserved_memory = has_reserved_memory; guest_info->has_reserved_memory = pcmc->has_reserved_memory;
guest_info->rsdp_in_ram = rsdp_in_ram; guest_info->rsdp_in_ram = pcmc->rsdp_in_ram;
if (smbios_defaults) { if (pcmc->smbios_defaults) {
MachineClass *mc = MACHINE_GET_CLASS(machine); MachineClass *mc = MACHINE_GET_CLASS(machine);
/* These values are guest ABI, do not change */ /* These values are guest ABI, do not change */
smbios_set_defaults("QEMU", "Standard PC (i440FX + PIIX, 1996)", smbios_set_defaults("QEMU", "Standard PC (i440FX + PIIX, 1996)",
mc->name, smbios_legacy_mode, smbios_uuid_encoded, mc->name, pcmc->smbios_legacy_mode,
pcmc->smbios_uuid_encoded,
SMBIOS_ENTRY_POINT_21); SMBIOS_ENTRY_POINT_21);
} }
...@@ -183,14 +172,14 @@ static void pc_init1(MachineState *machine, ...@@ -183,14 +172,14 @@ static void pc_init1(MachineState *machine,
gsi_state = g_malloc0(sizeof(*gsi_state)); gsi_state = g_malloc0(sizeof(*gsi_state));
if (kvm_ioapic_in_kernel()) { if (kvm_ioapic_in_kernel()) {
kvm_pc_setup_irq_routing(pci_enabled); kvm_pc_setup_irq_routing(pcmc->pci_enabled);
gsi = qemu_allocate_irqs(kvm_pc_gsi_handler, gsi_state, gsi = qemu_allocate_irqs(kvm_pc_gsi_handler, gsi_state,
GSI_NUM_PINS); GSI_NUM_PINS);
} else { } else {
gsi = qemu_allocate_irqs(gsi_handler, gsi_state, GSI_NUM_PINS); gsi = qemu_allocate_irqs(gsi_handler, gsi_state, GSI_NUM_PINS);
} }
if (pci_enabled) { if (pcmc->pci_enabled) {
pci_bus = i440fx_init(host_type, pci_bus = i440fx_init(host_type,
pci_type, pci_type,
&i440fx_state, &piix3_devfn, &isa_bus, gsi, &i440fx_state, &piix3_devfn, &isa_bus, gsi,
...@@ -218,13 +207,13 @@ static void pc_init1(MachineState *machine, ...@@ -218,13 +207,13 @@ static void pc_init1(MachineState *machine,
gsi_state->i8259_irq[i] = i8259[i]; gsi_state->i8259_irq[i] = i8259[i];
} }
g_free(i8259); g_free(i8259);
if (pci_enabled) { if (pcmc->pci_enabled) {
ioapic_init_gsi(gsi_state, "i440fx"); ioapic_init_gsi(gsi_state, "i440fx");
} }
pc_register_ferr_irq(gsi[13]); pc_register_ferr_irq(gsi[13]);
pc_vga_init(isa_bus, pci_enabled ? pci_bus : NULL); pc_vga_init(isa_bus, pcmc->pci_enabled ? pci_bus : NULL);
assert(pcms->vmport != ON_OFF_AUTO__MAX); assert(pcms->vmport != ON_OFF_AUTO__MAX);
if (pcms->vmport == ON_OFF_AUTO_AUTO) { if (pcms->vmport == ON_OFF_AUTO_AUTO) {
...@@ -238,7 +227,7 @@ static void pc_init1(MachineState *machine, ...@@ -238,7 +227,7 @@ static void pc_init1(MachineState *machine,
pc_nic_init(isa_bus, pci_bus); pc_nic_init(isa_bus, pci_bus);
ide_drive_get(hd, ARRAY_SIZE(hd)); ide_drive_get(hd, ARRAY_SIZE(hd));
if (pci_enabled) { if (pcmc->pci_enabled) {
PCIDevice *dev; PCIDevice *dev;
if (xen_enabled()) { if (xen_enabled()) {
dev = pci_piix3_xen_ide_init(pci_bus, hd, piix3_devfn + 1); dev = pci_piix3_xen_ide_init(pci_bus, hd, piix3_devfn + 1);
...@@ -265,11 +254,11 @@ static void pc_init1(MachineState *machine, ...@@ -265,11 +254,11 @@ static void pc_init1(MachineState *machine,
pc_cmos_init(pcms, idebus[0], idebus[1], rtc_state); pc_cmos_init(pcms, idebus[0], idebus[1], rtc_state);
if (pci_enabled && usb_enabled()) { if (pcmc->pci_enabled && usb_enabled()) {
pci_create_simple(pci_bus, piix3_devfn + 2, "piix3-usb-uhci"); pci_create_simple(pci_bus, piix3_devfn + 2, "piix3-usb-uhci");
} }
if (pci_enabled && acpi_enabled) { if (pcmc->pci_enabled && acpi_enabled) {
DeviceState *piix4_pm; DeviceState *piix4_pm;
I2CBus *smbus; I2CBus *smbus;
...@@ -290,7 +279,7 @@ static void pc_init1(MachineState *machine, ...@@ -290,7 +279,7 @@ static void pc_init1(MachineState *machine,
PC_MACHINE_ACPI_DEVICE_PROP, &error_abort); PC_MACHINE_ACPI_DEVICE_PROP, &error_abort);
} }
if (pci_enabled) { if (pcmc->pci_enabled) {
pc_pci_device_init(pci_bus); pc_pci_device_init(pci_bus);
} }
} }
...@@ -316,7 +305,6 @@ static void pc_compat_2_3(MachineState *machine) ...@@ -316,7 +305,6 @@ static void pc_compat_2_3(MachineState *machine)
static void pc_compat_2_2(MachineState *machine) static void pc_compat_2_2(MachineState *machine)
{ {
pc_compat_2_3(machine); pc_compat_2_3(machine);
rsdp_in_ram = false;
machine->suppress_vmdesc = true; machine->suppress_vmdesc = true;
} }
...@@ -325,7 +313,6 @@ static void pc_compat_2_1(MachineState *machine) ...@@ -325,7 +313,6 @@ static void pc_compat_2_1(MachineState *machine)
PCMachineState *pcms = PC_MACHINE(machine); PCMachineState *pcms = PC_MACHINE(machine);
pc_compat_2_2(machine); pc_compat_2_2(machine);
smbios_uuid_encoded = false;
x86_cpu_change_kvm_default("svm", NULL); x86_cpu_change_kvm_default("svm", NULL);
pcms->enforce_aligned_dimm = false; pcms->enforce_aligned_dimm = false;
} }
...@@ -350,16 +337,12 @@ static void pc_compat_2_0(MachineState *machine) ...@@ -350,16 +337,12 @@ static void pc_compat_2_0(MachineState *machine)
* QEMU 1.7 it is 6414. For RHEL/CentOS 7.0 it is 6418. * QEMU 1.7 it is 6414. For RHEL/CentOS 7.0 it is 6418.
*/ */
legacy_acpi_table_size = 6652; legacy_acpi_table_size = 6652;
smbios_legacy_mode = true;
has_reserved_memory = false;
pc_set_legacy_acpi_data_size(); pc_set_legacy_acpi_data_size();
} }
static void pc_compat_1_7(MachineState *machine) static void pc_compat_1_7(MachineState *machine)
{ {
pc_compat_2_0(machine); pc_compat_2_0(machine);
smbios_defaults = false;
gigabyte_align = false;
option_rom_has_mr = true; option_rom_has_mr = true;
legacy_acpi_table_size = 6414; legacy_acpi_table_size = 6414;
x86_cpu_change_kvm_default("x2apic", NULL); x86_cpu_change_kvm_default("x2apic", NULL);
...@@ -369,7 +352,6 @@ static void pc_compat_1_6(MachineState *machine) ...@@ -369,7 +352,6 @@ static void pc_compat_1_6(MachineState *machine)
{ {
pc_compat_1_7(machine); pc_compat_1_7(machine);
rom_file_has_mr = false; rom_file_has_mr = false;
has_acpi_build = false;
} }
static void pc_compat_1_5(MachineState *machine) static void pc_compat_1_5(MachineState *machine)
...@@ -399,17 +381,10 @@ static void pc_compat_1_2(MachineState *machine) ...@@ -399,17 +381,10 @@ static void pc_compat_1_2(MachineState *machine)
static void pc_compat_0_13(MachineState *machine) static void pc_compat_0_13(MachineState *machine)
{ {
pc_compat_1_2(machine); pc_compat_1_2(machine);
kvmclock_enabled = false;
} }
static void pc_init_isa(MachineState *machine) static void pc_init_isa(MachineState *machine)
{ {
pci_enabled = false;
has_acpi_build = false;
smbios_defaults = false;
gigabyte_align = false;
smbios_legacy_mode = true;
has_reserved_memory = false;
option_rom_has_mr = true; option_rom_has_mr = true;
rom_file_has_mr = false; rom_file_has_mr = false;
if (!machine->cpu_model) { if (!machine->cpu_model) {
...@@ -511,9 +486,11 @@ DEFINE_I440FX_MACHINE(v2_3, "pc-i440fx-2.3", pc_compat_2_3, ...@@ -511,9 +486,11 @@ DEFINE_I440FX_MACHINE(v2_3, "pc-i440fx-2.3", pc_compat_2_3,
static void pc_i440fx_2_2_machine_options(MachineClass *m) static void pc_i440fx_2_2_machine_options(MachineClass *m)
{ {
PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
pc_i440fx_2_3_machine_options(m); pc_i440fx_2_3_machine_options(m);
m->hw_version = "2.2.0"; m->hw_version = "2.2.0";
SET_MACHINE_COMPAT(m, PC_COMPAT_2_2); SET_MACHINE_COMPAT(m, PC_COMPAT_2_2);
pcmc->rsdp_in_ram = false;
} }
DEFINE_I440FX_MACHINE(v2_2, "pc-i440fx-2.2", pc_compat_2_2, DEFINE_I440FX_MACHINE(v2_2, "pc-i440fx-2.2", pc_compat_2_2,
...@@ -522,10 +499,12 @@ DEFINE_I440FX_MACHINE(v2_2, "pc-i440fx-2.2", pc_compat_2_2, ...@@ -522,10 +499,12 @@ DEFINE_I440FX_MACHINE(v2_2, "pc-i440fx-2.2", pc_compat_2_2,
static void pc_i440fx_2_1_machine_options(MachineClass *m) static void pc_i440fx_2_1_machine_options(MachineClass *m)
{ {
PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
pc_i440fx_2_2_machine_options(m); pc_i440fx_2_2_machine_options(m);
m->hw_version = "2.1.0"; m->hw_version = "2.1.0";
m->default_display = NULL; m->default_display = NULL;
SET_MACHINE_COMPAT(m, PC_COMPAT_2_1); SET_MACHINE_COMPAT(m, PC_COMPAT_2_1);
pcmc->smbios_uuid_encoded = false;
} }
DEFINE_I440FX_MACHINE(v2_1, "pc-i440fx-2.1", pc_compat_2_1, DEFINE_I440FX_MACHINE(v2_1, "pc-i440fx-2.1", pc_compat_2_1,
...@@ -535,9 +514,12 @@ DEFINE_I440FX_MACHINE(v2_1, "pc-i440fx-2.1", pc_compat_2_1, ...@@ -535,9 +514,12 @@ DEFINE_I440FX_MACHINE(v2_1, "pc-i440fx-2.1", pc_compat_2_1,
static void pc_i440fx_2_0_machine_options(MachineClass *m) static void pc_i440fx_2_0_machine_options(MachineClass *m)
{ {
PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
pc_i440fx_2_1_machine_options(m); pc_i440fx_2_1_machine_options(m);
m->hw_version = "2.0.0"; m->hw_version = "2.0.0";
SET_MACHINE_COMPAT(m, PC_COMPAT_2_0); SET_MACHINE_COMPAT(m, PC_COMPAT_2_0);
pcmc->smbios_legacy_mode = true;
pcmc->has_reserved_memory = false;
} }
DEFINE_I440FX_MACHINE(v2_0, "pc-i440fx-2.0", pc_compat_2_0, DEFINE_I440FX_MACHINE(v2_0, "pc-i440fx-2.0", pc_compat_2_0,
...@@ -546,10 +528,13 @@ DEFINE_I440FX_MACHINE(v2_0, "pc-i440fx-2.0", pc_compat_2_0, ...@@ -546,10 +528,13 @@ DEFINE_I440FX_MACHINE(v2_0, "pc-i440fx-2.0", pc_compat_2_0,
static void pc_i440fx_1_7_machine_options(MachineClass *m) static void pc_i440fx_1_7_machine_options(MachineClass *m)
{ {
PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
pc_i440fx_2_0_machine_options(m); pc_i440fx_2_0_machine_options(m);
m->hw_version = "1.7.0"; m->hw_version = "1.7.0";
m->default_machine_opts = NULL; m->default_machine_opts = NULL;
SET_MACHINE_COMPAT(m, PC_COMPAT_1_7); SET_MACHINE_COMPAT(m, PC_COMPAT_1_7);
pcmc->smbios_defaults = false;
pcmc->gigabyte_align = false;
} }
DEFINE_I440FX_MACHINE(v1_7, "pc-i440fx-1.7", pc_compat_1_7, DEFINE_I440FX_MACHINE(v1_7, "pc-i440fx-1.7", pc_compat_1_7,
...@@ -558,9 +543,11 @@ DEFINE_I440FX_MACHINE(v1_7, "pc-i440fx-1.7", pc_compat_1_7, ...@@ -558,9 +543,11 @@ DEFINE_I440FX_MACHINE(v1_7, "pc-i440fx-1.7", pc_compat_1_7,
static void pc_i440fx_1_6_machine_options(MachineClass *m) static void pc_i440fx_1_6_machine_options(MachineClass *m)
{ {
PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
pc_i440fx_1_7_machine_options(m); pc_i440fx_1_7_machine_options(m);
m->hw_version = "1.6.0"; m->hw_version = "1.6.0";
SET_MACHINE_COMPAT(m, PC_COMPAT_1_6); SET_MACHINE_COMPAT(m, PC_COMPAT_1_6);
pcmc->has_acpi_build = false;
} }
DEFINE_I440FX_MACHINE(v1_6, "pc-i440fx-1.6", pc_compat_1_6, DEFINE_I440FX_MACHINE(v1_6, "pc-i440fx-1.6", pc_compat_1_6,
...@@ -814,9 +801,11 @@ DEFINE_I440FX_MACHINE(v0_14, "pc-0.14", pc_compat_1_2, ...@@ -814,9 +801,11 @@ DEFINE_I440FX_MACHINE(v0_14, "pc-0.14", pc_compat_1_2,
static void pc_i440fx_0_13_machine_options(MachineClass *m) static void pc_i440fx_0_13_machine_options(MachineClass *m)
{ {
PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
pc_i440fx_0_14_machine_options(m); pc_i440fx_0_14_machine_options(m);
m->hw_version = "0.13"; m->hw_version = "0.13";
SET_MACHINE_COMPAT(m, PC_COMPAT_0_13); SET_MACHINE_COMPAT(m, PC_COMPAT_0_13);
pcmc->kvmclock_enabled = false;
} }
DEFINE_I440FX_MACHINE(v0_13, "pc-0.13", pc_compat_0_13, DEFINE_I440FX_MACHINE(v0_13, "pc-0.13", pc_compat_0_13,
...@@ -1038,8 +1027,15 @@ void igd_passthrough_isa_bridge_create(PCIBus *bus, uint16_t gpu_dev_id) ...@@ -1038,8 +1027,15 @@ void igd_passthrough_isa_bridge_create(PCIBus *bus, uint16_t gpu_dev_id)
static void isapc_machine_options(MachineClass *m) static void isapc_machine_options(MachineClass *m)
{ {
PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
m->desc = "ISA-only PC"; m->desc = "ISA-only PC";
m->max_cpus = 1; m->max_cpus = 1;
pcmc->pci_enabled = false;
pcmc->has_acpi_build = false;
pcmc->smbios_defaults = false;
pcmc->gigabyte_align = false;
pcmc->smbios_legacy_mode = true;
pcmc->has_reserved_memory = false;
} }
DEFINE_PC_MACHINE(isapc, "isapc", pc_init_isa, DEFINE_PC_MACHINE(isapc, "isapc", pc_init_isa,
......
...@@ -49,22 +49,11 @@ ...@@ -49,22 +49,11 @@
/* ICH9 AHCI has 6 ports */ /* ICH9 AHCI has 6 ports */
#define MAX_SATA_PORTS 6 #define MAX_SATA_PORTS 6
static bool has_acpi_build = true;
static bool rsdp_in_ram = true;
static bool smbios_defaults = true;
static bool smbios_legacy_mode;
static bool smbios_uuid_encoded = true;
/* Make sure that guest addresses aligned at 1Gbyte boundaries get mapped to
* host addresses aligned at 1Gbyte boundaries. This way we can use 1GByte
* pages in the host.
*/
static bool gigabyte_align = true;
static bool has_reserved_memory = true;
/* PC hardware initialisation */ /* PC hardware initialisation */
static void pc_q35_init(MachineState *machine) static void pc_q35_init(MachineState *machine)
{ {
PCMachineState *pcms = PC_MACHINE(machine); PCMachineState *pcms = PC_MACHINE(machine);
PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
Q35PCIHost *q35_host; Q35PCIHost *q35_host;
PCIHostState *phb; PCIHostState *phb;
PCIBus *host_bus; PCIBus *host_bus;
...@@ -76,7 +65,6 @@ static void pc_q35_init(MachineState *machine) ...@@ -76,7 +65,6 @@ static void pc_q35_init(MachineState *machine)
MemoryRegion *ram_memory; MemoryRegion *ram_memory;
GSIState *gsi_state; GSIState *gsi_state;
ISABus *isa_bus; ISABus *isa_bus;
int pci_enabled = 1;
qemu_irq *gsi; qemu_irq *gsi;
qemu_irq *i8259; qemu_irq *i8259;
int i; int i;
...@@ -97,7 +85,7 @@ static void pc_q35_init(MachineState *machine) ...@@ -97,7 +85,7 @@ static void pc_q35_init(MachineState *machine)
* breaking migration. * breaking migration.
*/ */
if (machine->ram_size >= 0xb0000000) { if (machine->ram_size >= 0xb0000000) {
lowmem = gigabyte_align ? 0x80000000 : 0xb0000000; lowmem = pcmc->gigabyte_align ? 0x80000000 : 0xb0000000;
} else { } else {
lowmem = 0xb0000000; lowmem = 0xb0000000;
} }
...@@ -134,7 +122,7 @@ static void pc_q35_init(MachineState *machine) ...@@ -134,7 +122,7 @@ static void pc_q35_init(MachineState *machine)
kvmclock_create(); kvmclock_create();
/* pci enabled */ /* pci enabled */
if (pci_enabled) { if (pcmc->pci_enabled) {
pci_memory = g_new(MemoryRegion, 1); pci_memory = g_new(MemoryRegion, 1);
memory_region_init(pci_memory, NULL, "pci", UINT64_MAX); memory_region_init(pci_memory, NULL, "pci", UINT64_MAX);
rom_memory = pci_memory; rom_memory = pci_memory;
...@@ -145,19 +133,20 @@ static void pc_q35_init(MachineState *machine) ...@@ -145,19 +133,20 @@ static void pc_q35_init(MachineState *machine)
guest_info = pc_guest_info_init(pcms); guest_info = pc_guest_info_init(pcms);
guest_info->isapc_ram_fw = false; guest_info->isapc_ram_fw = false;
guest_info->has_acpi_build = has_acpi_build; guest_info->has_acpi_build = pcmc->has_acpi_build;
guest_info->has_reserved_memory = has_reserved_memory; guest_info->has_reserved_memory = pcmc->has_reserved_memory;
guest_info->rsdp_in_ram = rsdp_in_ram; guest_info->rsdp_in_ram = pcmc->rsdp_in_ram;
/* Migration was not supported in 2.0 for Q35, so do not bother /* Migration was not supported in 2.0 for Q35, so do not bother
* with this hack (see hw/i386/acpi-build.c). * with this hack (see hw/i386/acpi-build.c).
*/ */
guest_info->legacy_acpi_table_size = 0; guest_info->legacy_acpi_table_size = 0;
if (smbios_defaults) { if (pcmc->smbios_defaults) {
/* These values are guest ABI, do not change */ /* These values are guest ABI, do not change */
smbios_set_defaults("QEMU", "Standard PC (Q35 + ICH9, 2009)", smbios_set_defaults("QEMU", "Standard PC (Q35 + ICH9, 2009)",
mc->name, smbios_legacy_mode, smbios_uuid_encoded, mc->name, pcmc->smbios_legacy_mode,
pcmc->smbios_uuid_encoded,
SMBIOS_ENTRY_POINT_21); SMBIOS_ENTRY_POINT_21);
} }
...@@ -170,7 +159,7 @@ static void pc_q35_init(MachineState *machine) ...@@ -170,7 +159,7 @@ static void pc_q35_init(MachineState *machine)
/* irq lines */ /* irq lines */
gsi_state = g_malloc0(sizeof(*gsi_state)); gsi_state = g_malloc0(sizeof(*gsi_state));
if (kvm_irqchip_in_kernel()) { if (kvm_irqchip_in_kernel()) {
kvm_pc_setup_irq_routing(pci_enabled); kvm_pc_setup_irq_routing(pcmc->pci_enabled);
gsi = qemu_allocate_irqs(kvm_pc_gsi_handler, gsi_state, gsi = qemu_allocate_irqs(kvm_pc_gsi_handler, gsi_state,
GSI_NUM_PINS); GSI_NUM_PINS);
} else { } else {
...@@ -227,7 +216,7 @@ static void pc_q35_init(MachineState *machine) ...@@ -227,7 +216,7 @@ static void pc_q35_init(MachineState *machine)
for (i = 0; i < ISA_NUM_IRQS; i++) { for (i = 0; i < ISA_NUM_IRQS; i++) {
gsi_state->i8259_irq[i] = i8259[i]; gsi_state->i8259_irq[i] = i8259[i];
} }
if (pci_enabled) { if (pcmc->pci_enabled) {
ioapic_init_gsi(gsi_state, "q35"); ioapic_init_gsi(gsi_state, "q35");
} }
...@@ -272,7 +261,7 @@ static void pc_q35_init(MachineState *machine) ...@@ -272,7 +261,7 @@ static void pc_q35_init(MachineState *machine)
/* the rest devices to which pci devfn is automatically assigned */ /* the rest devices to which pci devfn is automatically assigned */
pc_vga_init(isa_bus, host_bus); pc_vga_init(isa_bus, host_bus);
pc_nic_init(isa_bus, host_bus); pc_nic_init(isa_bus, host_bus);
if (pci_enabled) { if (pcmc->pci_enabled) {
pc_pci_device_init(host_bus); pc_pci_device_init(host_bus);
} }
} }
...@@ -298,7 +287,6 @@ static void pc_compat_2_3(MachineState *machine) ...@@ -298,7 +287,6 @@ static void pc_compat_2_3(MachineState *machine)
static void pc_compat_2_2(MachineState *machine) static void pc_compat_2_2(MachineState *machine)
{ {
pc_compat_2_3(machine); pc_compat_2_3(machine);
rsdp_in_ram = false;
machine->suppress_vmdesc = true; machine->suppress_vmdesc = true;
} }
...@@ -308,23 +296,18 @@ static void pc_compat_2_1(MachineState *machine) ...@@ -308,23 +296,18 @@ static void pc_compat_2_1(MachineState *machine)
pc_compat_2_2(machine); pc_compat_2_2(machine);
pcms->enforce_aligned_dimm = false; pcms->enforce_aligned_dimm = false;
smbios_uuid_encoded = false;
x86_cpu_change_kvm_default("svm", NULL); x86_cpu_change_kvm_default("svm", NULL);
} }
static void pc_compat_2_0(MachineState *machine) static void pc_compat_2_0(MachineState *machine)
{ {
pc_compat_2_1(machine); pc_compat_2_1(machine);
smbios_legacy_mode = true;
has_reserved_memory = false;
pc_set_legacy_acpi_data_size(); pc_set_legacy_acpi_data_size();
} }
static void pc_compat_1_7(MachineState *machine) static void pc_compat_1_7(MachineState *machine)
{ {
pc_compat_2_0(machine); pc_compat_2_0(machine);
smbios_defaults = false;
gigabyte_align = false;
option_rom_has_mr = true; option_rom_has_mr = true;
x86_cpu_change_kvm_default("x2apic", NULL); x86_cpu_change_kvm_default("x2apic", NULL);
} }
...@@ -333,7 +316,6 @@ static void pc_compat_1_6(MachineState *machine) ...@@ -333,7 +316,6 @@ static void pc_compat_1_6(MachineState *machine)
{ {
pc_compat_1_7(machine); pc_compat_1_7(machine);
rom_file_has_mr = false; rom_file_has_mr = false;
has_acpi_build = false;
} }
static void pc_compat_1_5(MachineState *machine) static void pc_compat_1_5(MachineState *machine)
...@@ -409,9 +391,11 @@ DEFINE_Q35_MACHINE(v2_3, "pc-q35-2.3", pc_compat_2_3, ...@@ -409,9 +391,11 @@ DEFINE_Q35_MACHINE(v2_3, "pc-q35-2.3", pc_compat_2_3,
static void pc_q35_2_2_machine_options(MachineClass *m) static void pc_q35_2_2_machine_options(MachineClass *m)
{ {
PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
pc_q35_2_3_machine_options(m); pc_q35_2_3_machine_options(m);
m->hw_version = "2.2.0"; m->hw_version = "2.2.0";
SET_MACHINE_COMPAT(m, PC_COMPAT_2_2); SET_MACHINE_COMPAT(m, PC_COMPAT_2_2);
pcmc->rsdp_in_ram = false;
} }
DEFINE_Q35_MACHINE(v2_2, "pc-q35-2.2", pc_compat_2_2, DEFINE_Q35_MACHINE(v2_2, "pc-q35-2.2", pc_compat_2_2,
...@@ -420,10 +404,12 @@ DEFINE_Q35_MACHINE(v2_2, "pc-q35-2.2", pc_compat_2_2, ...@@ -420,10 +404,12 @@ DEFINE_Q35_MACHINE(v2_2, "pc-q35-2.2", pc_compat_2_2,
static void pc_q35_2_1_machine_options(MachineClass *m) static void pc_q35_2_1_machine_options(MachineClass *m)
{ {
PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
pc_q35_2_2_machine_options(m); pc_q35_2_2_machine_options(m);
m->hw_version = "2.1.0"; m->hw_version = "2.1.0";
m->default_display = NULL; m->default_display = NULL;
SET_MACHINE_COMPAT(m, PC_COMPAT_2_1); SET_MACHINE_COMPAT(m, PC_COMPAT_2_1);
pcmc->smbios_uuid_encoded = false;
} }
DEFINE_Q35_MACHINE(v2_1, "pc-q35-2.1", pc_compat_2_1, DEFINE_Q35_MACHINE(v2_1, "pc-q35-2.1", pc_compat_2_1,
...@@ -432,9 +418,12 @@ DEFINE_Q35_MACHINE(v2_1, "pc-q35-2.1", pc_compat_2_1, ...@@ -432,9 +418,12 @@ DEFINE_Q35_MACHINE(v2_1, "pc-q35-2.1", pc_compat_2_1,
static void pc_q35_2_0_machine_options(MachineClass *m) static void pc_q35_2_0_machine_options(MachineClass *m)
{ {
PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
pc_q35_2_1_machine_options(m); pc_q35_2_1_machine_options(m);
m->hw_version = "2.0.0"; m->hw_version = "2.0.0";
SET_MACHINE_COMPAT(m, PC_COMPAT_2_0); SET_MACHINE_COMPAT(m, PC_COMPAT_2_0);
pcmc->has_reserved_memory = false;
pcmc->smbios_legacy_mode = true;
} }
DEFINE_Q35_MACHINE(v2_0, "pc-q35-2.0", pc_compat_2_0, DEFINE_Q35_MACHINE(v2_0, "pc-q35-2.0", pc_compat_2_0,
...@@ -443,10 +432,13 @@ DEFINE_Q35_MACHINE(v2_0, "pc-q35-2.0", pc_compat_2_0, ...@@ -443,10 +432,13 @@ DEFINE_Q35_MACHINE(v2_0, "pc-q35-2.0", pc_compat_2_0,
static void pc_q35_1_7_machine_options(MachineClass *m) static void pc_q35_1_7_machine_options(MachineClass *m)
{ {
PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
pc_q35_2_0_machine_options(m); pc_q35_2_0_machine_options(m);
m->hw_version = "1.7.0"; m->hw_version = "1.7.0";
m->default_machine_opts = NULL; m->default_machine_opts = NULL;
SET_MACHINE_COMPAT(m, PC_COMPAT_1_7); SET_MACHINE_COMPAT(m, PC_COMPAT_1_7);
pcmc->smbios_defaults = false;
pcmc->gigabyte_align = false;
} }
DEFINE_Q35_MACHINE(v1_7, "pc-q35-1.7", pc_compat_1_7, DEFINE_Q35_MACHINE(v1_7, "pc-q35-1.7", pc_compat_1_7,
...@@ -455,9 +447,11 @@ DEFINE_Q35_MACHINE(v1_7, "pc-q35-1.7", pc_compat_1_7, ...@@ -455,9 +447,11 @@ DEFINE_Q35_MACHINE(v1_7, "pc-q35-1.7", pc_compat_1_7,
static void pc_q35_1_6_machine_options(MachineClass *m) static void pc_q35_1_6_machine_options(MachineClass *m)
{ {
PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
pc_q35_machine_options(m); pc_q35_machine_options(m);
m->hw_version = "1.6.0"; m->hw_version = "1.6.0";
SET_MACHINE_COMPAT(m, PC_COMPAT_1_6); SET_MACHINE_COMPAT(m, PC_COMPAT_1_6);
pcmc->has_acpi_build = false;
} }
DEFINE_Q35_MACHINE(v1_6, "pc-q35-1.6", pc_compat_1_6, DEFINE_Q35_MACHINE(v1_6, "pc-q35-1.6", pc_compat_1_6,
......
...@@ -75,6 +75,20 @@ struct PCMachineClass { ...@@ -75,6 +75,20 @@ struct PCMachineClass {
bool broken_reserved_end; bool broken_reserved_end;
HotplugHandler *(*get_hotplug_handler)(MachineState *machine, HotplugHandler *(*get_hotplug_handler)(MachineState *machine,
DeviceState *dev); DeviceState *dev);
bool pci_enabled;
bool has_acpi_build;
bool rsdp_in_ram;
bool smbios_defaults;
bool smbios_legacy_mode;
bool smbios_uuid_encoded;
/* Make sure that guest addresses aligned at 1Gbyte boundaries get
* mapped to host addresses aligned at 1Gbyte boundaries. This way
* we can use 1GByte pages in the host.
*/
bool gigabyte_align;
bool has_reserved_memory;
bool kvmclock_enabled;
}; };
#define TYPE_PC_MACHINE "generic-pc-machine" #define TYPE_PC_MACHINE "generic-pc-machine"
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册