From 3c88acb005806ad2386ab6c94a8831151f624738 Mon Sep 17 00:00:00 2001 From: Miroslav Rezanina Date: Fri, 19 Oct 2018 13:10:31 +0200 Subject: Add x86_64 machine types Adding changes to add RHEL machine types for x86_64 architecture. Signed-off-by: Miroslav Rezanina Rebase notes (6.1.0): - Update qemu64 cpu spec Rebase notes (7.0.0): - Reset alias for all machine-types except latest one Rebase notes (8.0.0): - remove legacy_no_rng_seed usage (removed upstream) Rebase notes (8.1.0): - default_nic_model to default_nic Merged patches (6.1.0): - 59c284ad3b x86: Add x86 rhel8.5 machine types - a8868b42fe redhat: x86: Enable 'kvm-asyncpf-int' by default - a3995e2eff Remove RHEL 7.0.0 machine type (only x86_64 changes) - ad3190a79b Remove RHEL 7.1.0 machine type (only x86_64 changes) - 84bbe15d4e Remove RHEL 7.2.0 machine type (only x86_64 changes) - 0215eb3356 Remove RHEL 7.3.0 machine types (only x86_64 changes) - af69d1ca6e Remove RHEL 7.4.0 machine types (only x86_64 changes) - 8f7a74ab78 Remove RHEL 7.5.0 machine types (only x86_64 changes) Merged patches (7.0.0): - eae7d8dd3c x86/rhel machine types: Add pc_rhel_8_5_compat - 6762f56469 x86/rhel machine types: Wire compat into q35 and i440fx - 5762101438 rhel machine types/x86: set prefer_sockets - 9ba9ddc632 x86: Add q35 RHEL 8.6.0 machine type - 6110d865e5 x86: Add q35 RHEL 9.0.0 machine type - dcc64971bf RHEL: mark old machine types as deprecated (partialy) - 6b396f182b RHEL: disable "seqpacket" for "vhost-vsock-device" in rhel8.6.0 Merged patches (7.1.0): - 38b89dc245 pc: Move s3/s4 suspend disabling to compat (only hw/i386/pc.c chunk) - 1d6439527a WRB: Introduce RHEL 9.0.0 hw compat structure (x86_64 specific changes) - 35b5c8554f target/i386: deprecate CPUs older than x86_64-v2 ABI Merged patches (7.2.0): - 0be2889fa2 Introduce upstream 7.0 compat changes (only applicable parts) Merged patches (8.0.0): - f33ca8aed4 x86: rhel 9.2.0 machine type Merged patches (8.1.0): - bd5d81d286 Add RHEL 9.2.0 compat structure (x86_64 part) - c6eaf73add redhat: hw/i386/pc: Update x86 machine type compatibility for QEMU 8.0.0 update - 6cbf496e5e hw/acpi: Mark acpi blobs as resizable on RHEL pc machines version 7.6 and above Merged patches (8.2.0): - 4ee284aca9 Add machine types compat bits. (partial) - 719e2ac147 Fix x86 machine type compatibility for qemu-kvm 8.1.0 Merged patches (9.0.0 rc0): - 9149e2bc8f x86: rhel 9.2.0 machine type compat fix --- hw/i386/fw_cfg.c | 2 +- hw/i386/pc.c | 159 ++++++++++++++++++++- hw/i386/pc_piix.c | 109 ++++++++++++++ hw/i386/pc_q35.c | 285 +++++++++++++++++++++++++++++++++++++ include/hw/boards.h | 2 + include/hw/i386/pc.h | 33 +++++ target/i386/cpu.c | 21 +++ target/i386/kvm/kvm-cpu.c | 1 + target/i386/kvm/kvm.c | 4 + tests/qtest/pvpanic-test.c | 5 +- 10 files changed, 617 insertions(+), 4 deletions(-) diff --git a/hw/i386/fw_cfg.c b/hw/i386/fw_cfg.c index c7aa39a13e..283c3f4c16 100644 --- a/hw/i386/fw_cfg.c +++ b/hw/i386/fw_cfg.c @@ -63,7 +63,7 @@ void fw_cfg_build_smbios(PCMachineState *pcms, FWCfgState *fw_cfg, if (pcmc->smbios_defaults) { /* These values are guest ABI, do not change */ - smbios_set_defaults("QEMU", mc->desc, mc->name, + smbios_set_defaults("Red Hat", "KVM", mc->desc, pcmc->smbios_uuid_encoded, pcmc->smbios_stream_product, pcmc->smbios_stream_version); } diff --git a/hw/i386/pc.c b/hw/i386/pc.c index 5c21b0c4db..4a154c1a9a 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -326,6 +326,161 @@ GlobalProperty pc_compat_2_0[] = { }; const size_t pc_compat_2_0_len = G_N_ELEMENTS(pc_compat_2_0); +/* This macro is for changes to properties that are RHEL specific, + * different to the current upstream and to be applied to the latest + * machine type. + */ +GlobalProperty pc_rhel_compat[] = { + /* we don't support s3/s4 suspend */ + { "PIIX4_PM", "disable_s3", "1" }, + { "PIIX4_PM", "disable_s4", "1" }, + { "ICH9-LPC", "disable_s3", "1" }, + { "ICH9-LPC", "disable_s4", "1" }, + + { TYPE_X86_CPU, "host-phys-bits", "on" }, + { TYPE_X86_CPU, "host-phys-bits-limit", "48" }, + { TYPE_X86_CPU, "vmx-entry-load-perf-global-ctrl", "off" }, + { TYPE_X86_CPU, "vmx-exit-load-perf-global-ctrl", "off" }, + /* bz 1508330 */ + { "vfio-pci", "x-no-geforce-quirks", "on" }, + /* bz 1941397 */ + { TYPE_X86_CPU, "kvm-asyncpf-int", "on" }, +}; +const size_t pc_rhel_compat_len = G_N_ELEMENTS(pc_rhel_compat); + +GlobalProperty pc_rhel_9_3_compat[] = { + /* pc_rhel_9_3_compat from pc_compat_8_0 */ + { "virtio-mem", "unplugged-inaccessible", "auto" }, +}; +const size_t pc_rhel_9_3_compat_len = G_N_ELEMENTS(pc_rhel_9_3_compat); + +GlobalProperty pc_rhel_9_2_compat[] = { + /* pc_rhel_9_2_compat from pc_compat_7_2 */ + { "ICH9-LPC", "noreboot", "true" }, +}; +const size_t pc_rhel_9_2_compat_len = G_N_ELEMENTS(pc_rhel_9_2_compat); + +GlobalProperty pc_rhel_9_0_compat[] = { + /* pc_rhel_9_0_compat from pc_compat_6_2 */ + { "virtio-mem", "unplugged-inaccessible", "off" }, +}; +const size_t pc_rhel_9_0_compat_len = G_N_ELEMENTS(pc_rhel_9_0_compat); + +GlobalProperty pc_rhel_8_5_compat[] = { + /* pc_rhel_8_5_compat from pc_compat_6_0 */ + { "qemu64" "-" TYPE_X86_CPU, "family", "6" }, + /* pc_rhel_8_5_compat from pc_compat_6_0 */ + { "qemu64" "-" TYPE_X86_CPU, "model", "6" }, + /* pc_rhel_8_5_compat from pc_compat_6_0 */ + { "qemu64" "-" TYPE_X86_CPU, "stepping", "3" }, + /* pc_rhel_8_5_compat from pc_compat_6_0 */ + { TYPE_X86_CPU, "x-vendor-cpuid-only", "off" }, + /* pc_rhel_8_5_compat from pc_compat_6_0 */ + { "ICH9-LPC", ACPI_PM_PROP_ACPI_PCIHP_BRIDGE, "off" }, + + /* pc_rhel_8_5_compat from pc_compat_6_1 */ + { TYPE_X86_CPU, "hv-version-id-build", "0x1bbc" }, + /* pc_rhel_8_5_compat from pc_compat_6_1 */ + { TYPE_X86_CPU, "hv-version-id-major", "0x0006" }, + /* pc_rhel_8_5_compat from pc_compat_6_1 */ + { TYPE_X86_CPU, "hv-version-id-minor", "0x0001" }, +}; +const size_t pc_rhel_8_5_compat_len = G_N_ELEMENTS(pc_rhel_8_5_compat); + +GlobalProperty pc_rhel_8_4_compat[] = { + /* pc_rhel_8_4_compat from pc_compat_5_2 */ + { "ICH9-LPC", "x-smi-cpu-hotunplug", "off" }, + { TYPE_X86_CPU, "kvm-asyncpf-int", "off" }, +}; +const size_t pc_rhel_8_4_compat_len = G_N_ELEMENTS(pc_rhel_8_4_compat); + +GlobalProperty pc_rhel_8_3_compat[] = { + /* pc_rhel_8_3_compat from pc_compat_5_1 */ + { "ICH9-LPC", "x-smi-cpu-hotplug", "off" }, +}; +const size_t pc_rhel_8_3_compat_len = G_N_ELEMENTS(pc_rhel_8_3_compat); + +GlobalProperty pc_rhel_8_2_compat[] = { + /* pc_rhel_8_2_compat from pc_compat_4_2 */ + { "mch", "smbase-smram", "off" }, +}; +const size_t pc_rhel_8_2_compat_len = G_N_ELEMENTS(pc_rhel_8_2_compat); + +/* pc_rhel_8_1_compat is empty since pc_4_1_compat is */ +GlobalProperty pc_rhel_8_1_compat[] = { }; +const size_t pc_rhel_8_1_compat_len = G_N_ELEMENTS(pc_rhel_8_1_compat); + +GlobalProperty pc_rhel_8_0_compat[] = { + /* pc_rhel_8_0_compat from pc_compat_3_1 */ + { "intel-iommu", "dma-drain", "off" }, + /* pc_rhel_8_0_compat from pc_compat_3_1 */ + { "Opteron_G3" "-" TYPE_X86_CPU, "rdtscp", "off" }, + /* pc_rhel_8_0_compat from pc_compat_3_1 */ + { "Opteron_G4" "-" TYPE_X86_CPU, "rdtscp", "off" }, + /* pc_rhel_8_0_compat from pc_compat_3_1 */ + { "Opteron_G4" "-" TYPE_X86_CPU, "npt", "off" }, + /* pc_rhel_8_0_compat from pc_compat_3_1 */ + { "Opteron_G4" "-" TYPE_X86_CPU, "nrip-save", "off" }, + /* pc_rhel_8_0_compat from pc_compat_3_1 */ + { "Opteron_G5" "-" TYPE_X86_CPU, "rdtscp", "off" }, + /* pc_rhel_8_0_compat from pc_compat_3_1 */ + { "Opteron_G5" "-" TYPE_X86_CPU, "npt", "off" }, + /* pc_rhel_8_0_compat from pc_compat_3_1 */ + { "Opteron_G5" "-" TYPE_X86_CPU, "nrip-save", "off" }, + /* pc_rhel_8_0_compat from pc_compat_3_1 */ + { "EPYC" "-" TYPE_X86_CPU, "npt", "off" }, + /* pc_rhel_8_0_compat from pc_compat_3_1 */ + { "EPYC" "-" TYPE_X86_CPU, "nrip-save", "off" }, + /* pc_rhel_8_0_compat from pc_compat_3_1 */ + { "EPYC-IBPB" "-" TYPE_X86_CPU, "npt", "off" }, + /* pc_rhel_8_0_compat from pc_compat_3_1 */ + { "EPYC-IBPB" "-" TYPE_X86_CPU, "nrip-save", "off" }, + /** The mpx=on entries from pc_compat_3_1 are in pc_rhel_7_6_compat **/ + /* pc_rhel_8_0_compat from pc_compat_3_1 */ + { "Cascadelake-Server" "-" TYPE_X86_CPU, "stepping", "5" }, + /* pc_rhel_8_0_compat from pc_compat_3_1 */ + { TYPE_X86_CPU, "x-intel-pt-auto-level", "off" }, +}; +const size_t pc_rhel_8_0_compat_len = G_N_ELEMENTS(pc_rhel_8_0_compat); + +/* Similar to PC_COMPAT_3_0 + PC_COMPAT_2_12, but: + * all of the 2_12 stuff was already in 7.6 from bz 1481253 + * x-migrate-smi-count comes from PC_COMPAT_2_11 but + * is really tied to kernel version so keep it off on 7.x + * machine types irrespective of host. + */ +GlobalProperty pc_rhel_7_6_compat[] = { + /* pc_rhel_7_6_compat from pc_compat_3_0 */ + { TYPE_X86_CPU, "x-hv-synic-kvm-only", "on" }, + /* pc_rhel_7_6_compat from pc_compat_3_0 */ + { "Skylake-Server" "-" TYPE_X86_CPU, "pku", "off" }, + /* pc_rhel_7_6_compat from pc_compat_3_0 */ + { "Skylake-Server-IBRS" "-" TYPE_X86_CPU, "pku", "off" }, + /* pc_rhel_7_6_compat from pc_compat_2_11 */ + { TYPE_X86_CPU, "x-migrate-smi-count", "off" }, + /* pc_rhel_7_6_compat from pc_compat_2_11 */ + { "Skylake-Client" "-" TYPE_X86_CPU, "mpx", "on" }, + /* pc_rhel_7_6_compat from pc_compat_2_11 */ + { "Skylake-Client-IBRS" "-" TYPE_X86_CPU, "mpx", "on" }, + /* pc_rhel_7_6_compat from pc_compat_2_11 */ + { "Skylake-Server" "-" TYPE_X86_CPU, "mpx", "on" }, + /* pc_rhel_7_6_compat from pc_compat_2_11 */ + { "Skylake-Server-IBRS" "-" TYPE_X86_CPU, "mpx", "on" }, + /* pc_rhel_7_6_compat from pc_compat_2_11 */ + { "Cascadelake-Server" "-" TYPE_X86_CPU, "mpx", "on" }, + /* pc_rhel_7_6_compat from pc_compat_2_11 */ + { "Icelake-Client" "-" TYPE_X86_CPU, "mpx", "on" }, + /* pc_rhel_7_6_compat from pc_compat_2_11 */ + { "Icelake-Server" "-" TYPE_X86_CPU, "mpx", "on" }, +}; +const size_t pc_rhel_7_6_compat_len = G_N_ELEMENTS(pc_rhel_7_6_compat); + +/* + * The PC_RHEL_*_COMPAT serve the same purpose for RHEL-7 machine + * types as the PC_COMPAT_* do for upstream types. + * PC_RHEL_7_*_COMPAT apply both to i440fx and q35 types. + */ + GSIState *pc_gsi_create(qemu_irq **irqs, bool pci_enabled) { GSIState *s; @@ -1813,6 +1968,7 @@ static void pc_machine_class_init(ObjectClass *oc, void *data) pcmc->resizable_acpi_blob = true; x86mc->apic_xrupt_override = true; assert(!mc->get_hotplug_handler); + mc->async_pf_vmexit_disable = false; mc->get_hotplug_handler = pc_get_hotplug_handler; mc->hotplug_allowed = pc_hotplug_allowed; mc->cpu_index_to_instance_props = x86_cpu_index_to_props; @@ -1823,7 +1979,8 @@ static void pc_machine_class_init(ObjectClass *oc, void *data) mc->has_hotpluggable_cpus = true; mc->default_boot_order = "cad"; mc->block_default_type = IF_IDE; - mc->max_cpus = 255; + /* 240: max CPU count for RHEL */ + mc->max_cpus = 240; mc->reset = pc_machine_reset; mc->wakeup = pc_machine_wakeup; hc->pre_plug = pc_machine_device_pre_plug_cb; diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c index 18ba076609..a647262d63 100644 --- a/hw/i386/pc_piix.c +++ b/hw/i386/pc_piix.c @@ -52,6 +52,7 @@ #include "qapi/error.h" #include "qemu/error-report.h" #include "sysemu/xen.h" +#include "migration/migration.h" #ifdef CONFIG_XEN #include #include "hw/xen/xen_pt.h" @@ -422,6 +423,7 @@ static void pc_set_south_bridge(Object *obj, int value, Error **errp) * hw_compat_*, pc_compat_*, or * pc_*_machine_options(). */ +#if 0 /* Disabled for Red Hat Enterprise Linux */ static void pc_compat_2_3_fn(MachineState *machine) { X86MachineState *x86ms = X86_MACHINE(machine); @@ -951,3 +953,110 @@ static void xenfv_3_1_machine_options(MachineClass *m) DEFINE_PC_MACHINE(xenfv, "xenfv-3.1", pc_xen_hvm_init, xenfv_3_1_machine_options); #endif +#endif /* Disabled for Red Hat Enterprise Linux */ + +/* Red Hat Enterprise Linux machine types */ + +/* Options for the latest rhel7 machine type */ +static void pc_machine_rhel7_options(MachineClass *m) +{ + PCMachineClass *pcmc = PC_MACHINE_CLASS(m); + m->family = "pc_piix_Y"; + m->default_machine_opts = "firmware=bios-256k.bin,hpet=off"; + pcmc->pci_root_uid = 0; + pcmc->resizable_acpi_blob = true; + m->default_nic = "e1000"; + m->default_display = "std"; + m->no_parallel = 1; + m->numa_mem_supported = true; + m->auto_enable_numa_with_memdev = false; + machine_class_allow_dynamic_sysbus_dev(m, TYPE_RAMFB_DEVICE); + compat_props_add(m->compat_props, pc_rhel_compat, pc_rhel_compat_len); + m->alias = "pc"; + m->is_default = 1; + m->smp_props.prefer_sockets = true; +} + +static void pc_init_rhel760(MachineState *machine) +{ + pc_init1(machine, TYPE_I440FX_PCI_DEVICE); +} + +static void pc_machine_rhel760_options(MachineClass *m) +{ + PCMachineClass *pcmc = PC_MACHINE_CLASS(m); + ObjectClass *oc = OBJECT_CLASS(m); + pc_machine_rhel7_options(m); + m->desc = "RHEL 7.6.0 PC (i440FX + PIIX, 1996)"; + m->async_pf_vmexit_disable = true; + m->smbus_no_migration_support = true; + + /* All RHEL machines for prior major releases are deprecated */ + m->deprecation_reason = rhel_old_machine_deprecation; + + pcmc->pvh_enabled = false; + pcmc->default_cpu_version = CPU_VERSION_LEGACY; + pcmc->kvmclock_create_always = false; + /* From pc_i440fx_5_1_machine_options() */ + pcmc->pci_root_uid = 1; + /* From pc_i440fx_7_0_machine_options() */ + pcmc->enforce_amd_1tb_hole = false; + /* From pc_i440fx_8_0_machine_options() */ + pcmc->default_smbios_ep_type = SMBIOS_ENTRY_POINT_TYPE_32; + /* From pc_i440fx_8_1_machine_options() */ + pcmc->broken_32bit_mem_addr_check = true; + /* Introduced in QEMU 8.2 */ + pcmc->default_south_bridge = TYPE_PIIX3_DEVICE; + + object_class_property_add_enum(oc, "x-south-bridge", "PCSouthBridgeOption", + &PCSouthBridgeOption_lookup, + pc_get_south_bridge, + pc_set_south_bridge); + object_class_property_set_description(oc, "x-south-bridge", + "Use a different south bridge than PIIX3"); + + + compat_props_add(m->compat_props, hw_compat_rhel_9_4, + hw_compat_rhel_9_4_len); + compat_props_add(m->compat_props, hw_compat_rhel_9_3, + hw_compat_rhel_9_3_len); + compat_props_add(m->compat_props, pc_rhel_9_3_compat, + pc_rhel_9_3_compat_len); + compat_props_add(m->compat_props, hw_compat_rhel_9_2, + hw_compat_rhel_9_2_len); + compat_props_add(m->compat_props, pc_rhel_9_2_compat, + pc_rhel_9_2_compat_len); + compat_props_add(m->compat_props, hw_compat_rhel_9_1, + hw_compat_rhel_9_1_len); + compat_props_add(m->compat_props, hw_compat_rhel_9_0, + hw_compat_rhel_9_0_len); + compat_props_add(m->compat_props, pc_rhel_9_0_compat, + pc_rhel_9_0_compat_len); + compat_props_add(m->compat_props, hw_compat_rhel_8_6, + hw_compat_rhel_8_6_len); + compat_props_add(m->compat_props, hw_compat_rhel_8_5, + hw_compat_rhel_8_5_len); + compat_props_add(m->compat_props, pc_rhel_8_5_compat, + pc_rhel_8_5_compat_len); + compat_props_add(m->compat_props, hw_compat_rhel_8_4, + hw_compat_rhel_8_4_len); + compat_props_add(m->compat_props, pc_rhel_8_4_compat, + pc_rhel_8_4_compat_len); + compat_props_add(m->compat_props, hw_compat_rhel_8_3, + hw_compat_rhel_8_3_len); + compat_props_add(m->compat_props, pc_rhel_8_3_compat, + pc_rhel_8_3_compat_len); + compat_props_add(m->compat_props, hw_compat_rhel_8_2, + hw_compat_rhel_8_2_len); + compat_props_add(m->compat_props, pc_rhel_8_2_compat, + pc_rhel_8_2_compat_len); + compat_props_add(m->compat_props, hw_compat_rhel_8_1, hw_compat_rhel_8_1_len); + compat_props_add(m->compat_props, pc_rhel_8_1_compat, pc_rhel_8_1_compat_len); + compat_props_add(m->compat_props, hw_compat_rhel_8_0, hw_compat_rhel_8_0_len); + compat_props_add(m->compat_props, pc_rhel_8_0_compat, pc_rhel_8_0_compat_len); + compat_props_add(m->compat_props, hw_compat_rhel_7_6, hw_compat_rhel_7_6_len); + compat_props_add(m->compat_props, pc_rhel_7_6_compat, pc_rhel_7_6_compat_len); +} + +DEFINE_PC_MACHINE(rhel760, "pc-i440fx-rhel7.6.0", pc_init_rhel760, + pc_machine_rhel760_options); diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c index c7bc8a2041..e872dc7e46 100644 --- a/hw/i386/pc_q35.c +++ b/hw/i386/pc_q35.c @@ -341,6 +341,7 @@ static void pc_q35_init(MachineState *machine) DEFINE_PC_MACHINE(suffix, name, pc_init_##suffix, optionfn) +#if 0 /* Disabled for Red Hat Enterprise Linux */ static void pc_q35_machine_options(MachineClass *m) { PCMachineClass *pcmc = PC_MACHINE_CLASS(m); @@ -693,3 +694,287 @@ static void pc_q35_2_4_machine_options(MachineClass *m) DEFINE_Q35_MACHINE(v2_4, "pc-q35-2.4", NULL, pc_q35_2_4_machine_options); +#endif /* Disabled for Red Hat Enterprise Linux */ + +/* Red Hat Enterprise Linux machine types */ + +/* Options for the latest rhel q35 machine type */ +static void pc_q35_machine_rhel_options(MachineClass *m) +{ + PCMachineClass *pcmc = PC_MACHINE_CLASS(m); + pcmc->pci_root_uid = 0; + m->default_nic = "e1000e"; + m->family = "pc_q35_Z"; + m->units_per_default_bus = 1; + m->default_machine_opts = "firmware=bios-256k.bin,hpet=off"; + m->default_display = "std"; + m->no_floppy = 1; + m->no_parallel = 1; + pcmc->default_cpu_version = 1; + machine_class_allow_dynamic_sysbus_dev(m, TYPE_AMD_IOMMU_DEVICE); + machine_class_allow_dynamic_sysbus_dev(m, TYPE_INTEL_IOMMU_DEVICE); + machine_class_allow_dynamic_sysbus_dev(m, TYPE_RAMFB_DEVICE); + m->alias = "q35"; + m->max_cpus = 710; + compat_props_add(m->compat_props, pc_rhel_compat, pc_rhel_compat_len); + compat_props_add(m->compat_props, + pc_q35_compat_defaults, pc_q35_compat_defaults_len); +} + +static void pc_q35_init_rhel940(MachineState *machine) +{ + pc_q35_init(machine); +} + +static void pc_q35_machine_rhel940_options(MachineClass *m) +{ + PCMachineClass *pcmc = PC_MACHINE_CLASS(m); + pc_q35_machine_rhel_options(m); + m->desc = "RHEL-9.4.0 PC (Q35 + ICH9, 2009)"; + pcmc->smbios_stream_product = "RHEL"; + pcmc->smbios_stream_version = "9.4.0"; +} + +DEFINE_PC_MACHINE(q35_rhel940, "pc-q35-rhel9.4.0", pc_q35_init_rhel940, + pc_q35_machine_rhel940_options); + + +static void pc_q35_init_rhel920(MachineState *machine) +{ + pc_q35_init(machine); +} + +static void pc_q35_machine_rhel920_options(MachineClass *m) +{ + PCMachineClass *pcmc = PC_MACHINE_CLASS(m); + pc_q35_machine_rhel940_options(m); + m->desc = "RHEL-9.2.0 PC (Q35 + ICH9, 2009)"; + m->alias = NULL; + pcmc->smbios_stream_product = "RHEL"; + pcmc->smbios_stream_version = "9.2.0"; + + /* From pc_q35_8_0_machine_options() */ + pcmc->default_smbios_ep_type = SMBIOS_ENTRY_POINT_TYPE_32; + /* From pc_q35_8_1_machine_options() */ + pcmc->broken_32bit_mem_addr_check = true; + + compat_props_add(m->compat_props, hw_compat_rhel_9_4, + hw_compat_rhel_9_4_len); + compat_props_add(m->compat_props, hw_compat_rhel_9_3, + hw_compat_rhel_9_3_len); + compat_props_add(m->compat_props, pc_rhel_9_3_compat, + pc_rhel_9_3_compat_len); + compat_props_add(m->compat_props, hw_compat_rhel_9_2, + hw_compat_rhel_9_2_len); + compat_props_add(m->compat_props, pc_rhel_9_2_compat, + pc_rhel_9_2_compat_len); +} + +DEFINE_PC_MACHINE(q35_rhel920, "pc-q35-rhel9.2.0", pc_q35_init_rhel920, + pc_q35_machine_rhel920_options); + +static void pc_q35_init_rhel900(MachineState *machine) +{ + pc_q35_init(machine); +} + +static void pc_q35_machine_rhel900_options(MachineClass *m) +{ + PCMachineClass *pcmc = PC_MACHINE_CLASS(m); + pc_q35_machine_rhel920_options(m); + m->desc = "RHEL-9.0.0 PC (Q35 + ICH9, 2009)"; + m->alias = NULL; + pcmc->smbios_stream_product = "RHEL"; + pcmc->smbios_stream_version = "9.0.0"; + pcmc->enforce_amd_1tb_hole = false; + compat_props_add(m->compat_props, hw_compat_rhel_9_1, + hw_compat_rhel_9_1_len); + compat_props_add(m->compat_props, hw_compat_rhel_9_0, + hw_compat_rhel_9_0_len); + compat_props_add(m->compat_props, pc_rhel_9_0_compat, + pc_rhel_9_0_compat_len); +} + +DEFINE_PC_MACHINE(q35_rhel900, "pc-q35-rhel9.0.0", pc_q35_init_rhel900, + pc_q35_machine_rhel900_options); + +static void pc_q35_init_rhel860(MachineState *machine) +{ + pc_q35_init(machine); +} + +static void pc_q35_machine_rhel860_options(MachineClass *m) +{ + PCMachineClass *pcmc = PC_MACHINE_CLASS(m); + pc_q35_machine_rhel900_options(m); + m->desc = "RHEL-8.6.0 PC (Q35 + ICH9, 2009)"; + m->alias = NULL; + + /* All RHEL machines for prior major releases are deprecated */ + m->deprecation_reason = rhel_old_machine_deprecation; + + pcmc->smbios_stream_product = "RHEL-AV"; + pcmc->smbios_stream_version = "8.6.0"; + compat_props_add(m->compat_props, hw_compat_rhel_8_6, + hw_compat_rhel_8_6_len); +} + +DEFINE_PC_MACHINE(q35_rhel860, "pc-q35-rhel8.6.0", pc_q35_init_rhel860, + pc_q35_machine_rhel860_options); + + +static void pc_q35_init_rhel850(MachineState *machine) +{ + pc_q35_init(machine); +} + +static void pc_q35_machine_rhel850_options(MachineClass *m) +{ + PCMachineClass *pcmc = PC_MACHINE_CLASS(m); + pc_q35_machine_rhel860_options(m); + m->desc = "RHEL-8.5.0 PC (Q35 + ICH9, 2009)"; + m->alias = NULL; + pcmc->smbios_stream_product = "RHEL-AV"; + pcmc->smbios_stream_version = "8.5.0"; + compat_props_add(m->compat_props, hw_compat_rhel_8_5, + hw_compat_rhel_8_5_len); + compat_props_add(m->compat_props, pc_rhel_8_5_compat, + pc_rhel_8_5_compat_len); + m->smp_props.prefer_sockets = true; +} + +DEFINE_PC_MACHINE(q35_rhel850, "pc-q35-rhel8.5.0", pc_q35_init_rhel850, + pc_q35_machine_rhel850_options); + + +static void pc_q35_init_rhel840(MachineState *machine) +{ + pc_q35_init(machine); +} + +static void pc_q35_machine_rhel840_options(MachineClass *m) +{ + PCMachineClass *pcmc = PC_MACHINE_CLASS(m); + pc_q35_machine_rhel850_options(m); + m->desc = "RHEL-8.4.0 PC (Q35 + ICH9, 2009)"; + m->alias = NULL; + pcmc->smbios_stream_product = "RHEL-AV"; + pcmc->smbios_stream_version = "8.4.0"; + compat_props_add(m->compat_props, hw_compat_rhel_8_4, + hw_compat_rhel_8_4_len); + compat_props_add(m->compat_props, pc_rhel_8_4_compat, + pc_rhel_8_4_compat_len); +} + +DEFINE_PC_MACHINE(q35_rhel840, "pc-q35-rhel8.4.0", pc_q35_init_rhel840, + pc_q35_machine_rhel840_options); + + +static void pc_q35_init_rhel830(MachineState *machine) +{ + pc_q35_init(machine); +} + +static void pc_q35_machine_rhel830_options(MachineClass *m) +{ + PCMachineClass *pcmc = PC_MACHINE_CLASS(m); + pc_q35_machine_rhel840_options(m); + m->desc = "RHEL-8.3.0 PC (Q35 + ICH9, 2009)"; + m->alias = NULL; + pcmc->smbios_stream_product = "RHEL-AV"; + pcmc->smbios_stream_version = "8.3.0"; + compat_props_add(m->compat_props, hw_compat_rhel_8_3, + hw_compat_rhel_8_3_len); + compat_props_add(m->compat_props, pc_rhel_8_3_compat, + pc_rhel_8_3_compat_len); + /* From pc_q35_5_1_machine_options() */ + pcmc->kvmclock_create_always = false; + /* From pc_q35_5_1_machine_options() */ + pcmc->pci_root_uid = 1; +} + +DEFINE_PC_MACHINE(q35_rhel830, "pc-q35-rhel8.3.0", pc_q35_init_rhel830, + pc_q35_machine_rhel830_options); + +static void pc_q35_init_rhel820(MachineState *machine) +{ + pc_q35_init(machine); +} + +static void pc_q35_machine_rhel820_options(MachineClass *m) +{ + PCMachineClass *pcmc = PC_MACHINE_CLASS(m); + pc_q35_machine_rhel830_options(m); + m->desc = "RHEL-8.2.0 PC (Q35 + ICH9, 2009)"; + m->alias = NULL; + m->numa_mem_supported = true; + m->auto_enable_numa_with_memdev = false; + pcmc->smbios_stream_product = "RHEL-AV"; + pcmc->smbios_stream_version = "8.2.0"; + compat_props_add(m->compat_props, hw_compat_rhel_8_2, + hw_compat_rhel_8_2_len); + compat_props_add(m->compat_props, pc_rhel_8_2_compat, + pc_rhel_8_2_compat_len); +} + +DEFINE_PC_MACHINE(q35_rhel820, "pc-q35-rhel8.2.0", pc_q35_init_rhel820, + pc_q35_machine_rhel820_options); + +static void pc_q35_init_rhel810(MachineState *machine) +{ + pc_q35_init(machine); +} + +static void pc_q35_machine_rhel810_options(MachineClass *m) +{ + PCMachineClass *pcmc = PC_MACHINE_CLASS(m); + pc_q35_machine_rhel820_options(m); + m->desc = "RHEL-8.1.0 PC (Q35 + ICH9, 2009)"; + m->alias = NULL; + pcmc->smbios_stream_product = NULL; + pcmc->smbios_stream_version = NULL; + compat_props_add(m->compat_props, hw_compat_rhel_8_1, hw_compat_rhel_8_1_len); + compat_props_add(m->compat_props, pc_rhel_8_1_compat, pc_rhel_8_1_compat_len); +} + +DEFINE_PC_MACHINE(q35_rhel810, "pc-q35-rhel8.1.0", pc_q35_init_rhel810, + pc_q35_machine_rhel810_options); + +static void pc_q35_init_rhel800(MachineState *machine) +{ + pc_q35_init(machine); +} + +static void pc_q35_machine_rhel800_options(MachineClass *m) +{ + PCMachineClass *pcmc = PC_MACHINE_CLASS(m); + pc_q35_machine_rhel810_options(m); + m->desc = "RHEL-8.0.0 PC (Q35 + ICH9, 2009)"; + m->smbus_no_migration_support = true; + m->alias = NULL; + pcmc->pvh_enabled = false; + pcmc->default_cpu_version = CPU_VERSION_LEGACY; + compat_props_add(m->compat_props, hw_compat_rhel_8_0, hw_compat_rhel_8_0_len); + compat_props_add(m->compat_props, pc_rhel_8_0_compat, pc_rhel_8_0_compat_len); +} + +DEFINE_PC_MACHINE(q35_rhel800, "pc-q35-rhel8.0.0", pc_q35_init_rhel800, + pc_q35_machine_rhel800_options); + +static void pc_q35_init_rhel760(MachineState *machine) +{ + pc_q35_init(machine); +} + +static void pc_q35_machine_rhel760_options(MachineClass *m) +{ + pc_q35_machine_rhel800_options(m); + m->alias = NULL; + m->desc = "RHEL-7.6.0 PC (Q35 + ICH9, 2009)"; + m->async_pf_vmexit_disable = true; + compat_props_add(m->compat_props, hw_compat_rhel_7_6, hw_compat_rhel_7_6_len); + compat_props_add(m->compat_props, pc_rhel_7_6_compat, pc_rhel_7_6_compat_len); +} + +DEFINE_PC_MACHINE(q35_rhel760, "pc-q35-rhel7.6.0", pc_q35_init_rhel760, + pc_q35_machine_rhel760_options); diff --git a/include/hw/boards.h b/include/hw/boards.h index 0466f9d0f3..46b8725c41 100644 --- a/include/hw/boards.h +++ b/include/hw/boards.h @@ -283,6 +283,8 @@ struct MachineClass { strList *allowed_dynamic_sysbus_devices; bool auto_enable_numa_with_memhp; bool auto_enable_numa_with_memdev; + /* RHEL only */ + bool async_pf_vmexit_disable; bool ignore_boot_device_suffixes; bool smbus_no_migration_support; bool nvdimm_supported; diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h index ebd8f973f2..a984c951ad 100644 --- a/include/hw/i386/pc.h +++ b/include/hw/i386/pc.h @@ -291,6 +291,39 @@ extern const size_t pc_compat_2_1_len; extern GlobalProperty pc_compat_2_0[]; extern const size_t pc_compat_2_0_len; +extern GlobalProperty pc_rhel_compat[]; +extern const size_t pc_rhel_compat_len; + +extern GlobalProperty pc_rhel_9_3_compat[]; +extern const size_t pc_rhel_9_3_compat_len; + +extern GlobalProperty pc_rhel_9_2_compat[]; +extern const size_t pc_rhel_9_2_compat_len; + +extern GlobalProperty pc_rhel_9_0_compat[]; +extern const size_t pc_rhel_9_0_compat_len; + +extern GlobalProperty pc_rhel_8_5_compat[]; +extern const size_t pc_rhel_8_5_compat_len; + +extern GlobalProperty pc_rhel_8_4_compat[]; +extern const size_t pc_rhel_8_4_compat_len; + +extern GlobalProperty pc_rhel_8_3_compat[]; +extern const size_t pc_rhel_8_3_compat_len; + +extern GlobalProperty pc_rhel_8_2_compat[]; +extern const size_t pc_rhel_8_2_compat_len; + +extern GlobalProperty pc_rhel_8_1_compat[]; +extern const size_t pc_rhel_8_1_compat_len; + +extern GlobalProperty pc_rhel_8_0_compat[]; +extern const size_t pc_rhel_8_0_compat_len; + +extern GlobalProperty pc_rhel_7_6_compat[]; +extern const size_t pc_rhel_7_6_compat_len; + #define DEFINE_PC_MACHINE(suffix, namestr, initfn, optsfn) \ static void pc_machine_##suffix##_class_init(ObjectClass *oc, void *data) \ { \ diff --git a/target/i386/cpu.c b/target/i386/cpu.c index 33760a2ee1..be7b0663cd 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -2190,9 +2190,13 @@ static const CPUCaches epyc_genoa_cache_info = { * PT in VMX operation */ +#define RHEL_CPU_DEPRECATION \ + "use at least 'Nehalem' / 'Opteron_G4', or 'host' / 'max'" + static const X86CPUDefinition builtin_x86_defs[] = { { .name = "qemu64", + .deprecation_note = RHEL_CPU_DEPRECATION, .level = 0xd, .vendor = CPUID_VENDOR_AMD, .family = 15, @@ -2213,6 +2217,7 @@ static const X86CPUDefinition builtin_x86_defs[] = { }, { .name = "phenom", + .deprecation_note = RHEL_CPU_DEPRECATION, .level = 5, .vendor = CPUID_VENDOR_AMD, .family = 16, @@ -2245,6 +2250,7 @@ static const X86CPUDefinition builtin_x86_defs[] = { }, { .name = "core2duo", + .deprecation_note = RHEL_CPU_DEPRECATION, .level = 10, .vendor = CPUID_VENDOR_INTEL, .family = 6, @@ -2287,6 +2293,7 @@ static const X86CPUDefinition builtin_x86_defs[] = { }, { .name = "kvm64", + .deprecation_note = RHEL_CPU_DEPRECATION, .level = 0xd, .vendor = CPUID_VENDOR_INTEL, .family = 15, @@ -2328,6 +2335,7 @@ static const X86CPUDefinition builtin_x86_defs[] = { }, { .name = "qemu32", + .deprecation_note = RHEL_CPU_DEPRECATION, .level = 4, .vendor = CPUID_VENDOR_INTEL, .family = 6, @@ -2342,6 +2350,7 @@ static const X86CPUDefinition builtin_x86_defs[] = { }, { .name = "kvm32", + .deprecation_note = RHEL_CPU_DEPRECATION, .level = 5, .vendor = CPUID_VENDOR_INTEL, .family = 15, @@ -2372,6 +2381,7 @@ static const X86CPUDefinition builtin_x86_defs[] = { }, { .name = "coreduo", + .deprecation_note = RHEL_CPU_DEPRECATION, .level = 10, .vendor = CPUID_VENDOR_INTEL, .family = 6, @@ -2405,6 +2415,7 @@ static const X86CPUDefinition builtin_x86_defs[] = { }, { .name = "486", + .deprecation_note = RHEL_CPU_DEPRECATION, .level = 1, .vendor = CPUID_VENDOR_INTEL, .family = 4, @@ -2417,6 +2428,7 @@ static const X86CPUDefinition builtin_x86_defs[] = { }, { .name = "pentium", + .deprecation_note = RHEL_CPU_DEPRECATION, .level = 1, .vendor = CPUID_VENDOR_INTEL, .family = 5, @@ -2429,6 +2441,7 @@ static const X86CPUDefinition builtin_x86_defs[] = { }, { .name = "pentium2", + .deprecation_note = RHEL_CPU_DEPRECATION, .level = 2, .vendor = CPUID_VENDOR_INTEL, .family = 6, @@ -2441,6 +2454,7 @@ static const X86CPUDefinition builtin_x86_defs[] = { }, { .name = "pentium3", + .deprecation_note = RHEL_CPU_DEPRECATION, .level = 3, .vendor = CPUID_VENDOR_INTEL, .family = 6, @@ -2453,6 +2467,7 @@ static const X86CPUDefinition builtin_x86_defs[] = { }, { .name = "athlon", + .deprecation_note = RHEL_CPU_DEPRECATION, .level = 2, .vendor = CPUID_VENDOR_AMD, .family = 6, @@ -2468,6 +2483,7 @@ static const X86CPUDefinition builtin_x86_defs[] = { }, { .name = "n270", + .deprecation_note = RHEL_CPU_DEPRECATION, .level = 10, .vendor = CPUID_VENDOR_INTEL, .family = 6, @@ -2493,6 +2509,7 @@ static const X86CPUDefinition builtin_x86_defs[] = { }, { .name = "Conroe", + .deprecation_note = RHEL_CPU_DEPRECATION, .level = 10, .vendor = CPUID_VENDOR_INTEL, .family = 6, @@ -2533,6 +2550,7 @@ static const X86CPUDefinition builtin_x86_defs[] = { }, { .name = "Penryn", + .deprecation_note = RHEL_CPU_DEPRECATION, .level = 10, .vendor = CPUID_VENDOR_INTEL, .family = 6, @@ -4394,6 +4412,7 @@ static const X86CPUDefinition builtin_x86_defs[] = { }, { .name = "Opteron_G1", + .deprecation_note = RHEL_CPU_DEPRECATION, .level = 5, .vendor = CPUID_VENDOR_AMD, .family = 15, @@ -4414,6 +4433,7 @@ static const X86CPUDefinition builtin_x86_defs[] = { }, { .name = "Opteron_G2", + .deprecation_note = RHEL_CPU_DEPRECATION, .level = 5, .vendor = CPUID_VENDOR_AMD, .family = 15, @@ -4436,6 +4456,7 @@ static const X86CPUDefinition builtin_x86_defs[] = { }, { .name = "Opteron_G3", + .deprecation_note = RHEL_CPU_DEPRECATION, .level = 5, .vendor = CPUID_VENDOR_AMD, .family = 16, diff --git a/target/i386/kvm/kvm-cpu.c b/target/i386/kvm/kvm-cpu.c index 9c791b7b05..b91af5051f 100644 --- a/target/i386/kvm/kvm-cpu.c +++ b/target/i386/kvm/kvm-cpu.c @@ -138,6 +138,7 @@ static PropValue kvm_default_props[] = { { "acpi", "off" }, { "monitor", "off" }, { "svm", "off" }, + { "kvm-pv-unhalt", "on" }, { NULL, NULL }, }; diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c index e68cbe9293..739f33db47 100644 --- a/target/i386/kvm/kvm.c +++ b/target/i386/kvm/kvm.c @@ -3715,6 +3715,7 @@ static int kvm_get_msrs(X86CPU *cpu) struct kvm_msr_entry *msrs = cpu->kvm_msr_buf->entries; int ret, i; uint64_t mtrr_top_bits; + MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine()); kvm_msr_buf_reset(cpu); @@ -4069,6 +4070,9 @@ static int kvm_get_msrs(X86CPU *cpu) break; case MSR_KVM_ASYNC_PF_EN: env->async_pf_en_msr = msrs[i].data; + if (mc->async_pf_vmexit_disable) { + env->async_pf_en_msr &= ~(1ULL << 2); + } break; case MSR_KVM_ASYNC_PF_INT: env->async_pf_int_msr = msrs[i].data; diff --git a/tests/qtest/pvpanic-test.c b/tests/qtest/pvpanic-test.c index 78f1cf8186..ac954c9b06 100644 --- a/tests/qtest/pvpanic-test.c +++ b/tests/qtest/pvpanic-test.c @@ -17,7 +17,7 @@ static void test_panic_nopause(void) QDict *response, *data; QTestState *qts; - qts = qtest_init("-device pvpanic -action panic=none"); + qts = qtest_init("-M q35 -device pvpanic -action panic=none"); val = qtest_inb(qts, 0x505); g_assert_cmpuint(val, ==, 3); @@ -40,7 +40,8 @@ static void test_panic(void) QDict *response, *data; QTestState *qts; - qts = qtest_init("-device pvpanic -action panic=pause"); + /* RHEL: Use q35 */ + qts = qtest_init("-M q35 -device pvpanic -action panic=pause"); val = qtest_inb(qts, 0x505); g_assert_cmpuint(val, ==, 3); -- 2.39.3