a83cc2
From a082c53cc14afcd2ad77262575af50e164e75649 Mon Sep 17 00:00:00 2001
a83cc2
From: Miroslav Rezanina <mrezanin@redhat.com>
a83cc2
Date: Fri, 19 Oct 2018 13:10:31 +0200
a83cc2
Subject: Add x86_64 machine types
a83cc2
a83cc2
Adding changes to add RHEL machine types for x86_64 architecture.
a83cc2
a83cc2
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
a83cc2
---
a83cc2
 hw/i386/acpi-build.c       |   3 +
a83cc2
 hw/i386/pc.c               | 277 ++++++++++++++++++++++++++++++++++++-
a83cc2
 hw/i386/pc_piix.c          | 225 +++++++++++++++++++++++++++++-
a83cc2
 hw/i386/pc_q35.c           | 214 +++++++++++++++++++++++++++-
a83cc2
 include/hw/boards.h        |   2 +
a83cc2
 include/hw/i386/pc.h       |  39 ++++++
a83cc2
 target/i386/cpu.c          |   3 +-
a83cc2
 target/i386/kvm/kvm.c      |   4 +
a83cc2
 tests/qtest/pvpanic-test.c |   5 +-
a83cc2
 9 files changed, 763 insertions(+), 9 deletions(-)
a83cc2
a83cc2
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
a83cc2
index de98750aef..7bd67f7877 100644
a83cc2
--- a/hw/i386/acpi-build.c
a83cc2
+++ b/hw/i386/acpi-build.c
a83cc2
@@ -231,6 +231,9 @@ static void acpi_get_pm_info(MachineState *machine, AcpiPmInfo *pm)
a83cc2
         pm->fadt.reset_reg = r;
a83cc2
         pm->fadt.reset_val = 0xf;
a83cc2
         pm->fadt.flags |= 1 << ACPI_FADT_F_RESET_REG_SUP;
a83cc2
+        if (object_property_get_bool(lpc,
a83cc2
+                                     "__com.redhat_force-rev1-fadt", NULL))
a83cc2
+            pm->fadt.rev = 1;
a83cc2
         pm->cpu_hp_io_base = ICH9_CPU_HOTPLUG_IO_BASE;
a83cc2
         pm->smi_on_cpuhp =
a83cc2
             !!(smi_features & BIT_ULL(ICH9_LPC_SMI_F_CPU_HOTPLUG_BIT));
a83cc2
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
a83cc2
index 8a84b25a03..edc02a68ca 100644
a83cc2
--- a/hw/i386/pc.c
a83cc2
+++ b/hw/i386/pc.c
a83cc2
@@ -355,6 +355,275 @@ GlobalProperty pc_compat_1_4[] = {
a83cc2
 };
a83cc2
 const size_t pc_compat_1_4_len = G_N_ELEMENTS(pc_compat_1_4);
a83cc2
 
a83cc2
+/* This macro is for changes to properties that are RHEL specific,
a83cc2
+ * different to the current upstream and to be applied to the latest
a83cc2
+ * machine type.
a83cc2
+ */
a83cc2
+GlobalProperty pc_rhel_compat[] = {
a83cc2
+    { TYPE_X86_CPU, "host-phys-bits", "on" },
a83cc2
+    { TYPE_X86_CPU, "host-phys-bits-limit", "48" },
a83cc2
+    { TYPE_X86_CPU, "vmx-entry-load-perf-global-ctrl", "off" },
a83cc2
+    { TYPE_X86_CPU, "vmx-exit-load-perf-global-ctrl", "off" },
a83cc2
+    /* bz 1508330 */ 
a83cc2
+    { "vfio-pci", "x-no-geforce-quirks", "on" },
a83cc2
+};
a83cc2
+const size_t pc_rhel_compat_len = G_N_ELEMENTS(pc_rhel_compat);
a83cc2
+
a83cc2
+GlobalProperty pc_rhel_8_3_compat[] = {
a83cc2
+    /* pc_rhel_8_3_compat from pc_compat_5_1 */
a83cc2
+    { "ICH9-LPC", "x-smi-cpu-hotplug", "off" },
a83cc2
+};
a83cc2
+const size_t pc_rhel_8_3_compat_len = G_N_ELEMENTS(pc_rhel_8_3_compat);
a83cc2
+
a83cc2
+GlobalProperty pc_rhel_8_2_compat[] = {
a83cc2
+    /* pc_rhel_8_2_compat from pc_compat_4_2 */
a83cc2
+    { "mch", "smbase-smram", "off" },
a83cc2
+};
a83cc2
+const size_t pc_rhel_8_2_compat_len = G_N_ELEMENTS(pc_rhel_8_2_compat);
a83cc2
+
a83cc2
+/* pc_rhel_8_1_compat is empty since pc_4_1_compat is */
a83cc2
+GlobalProperty pc_rhel_8_1_compat[] = { };
a83cc2
+const size_t pc_rhel_8_1_compat_len = G_N_ELEMENTS(pc_rhel_8_1_compat);
a83cc2
+
a83cc2
+GlobalProperty pc_rhel_8_0_compat[] = {
a83cc2
+    /* pc_rhel_8_0_compat from pc_compat_3_1 */
a83cc2
+    { "intel-iommu", "dma-drain", "off" },
a83cc2
+    /* pc_rhel_8_0_compat from pc_compat_3_1 */
a83cc2
+    { "Opteron_G3" "-" TYPE_X86_CPU, "rdtscp", "off" },
a83cc2
+    /* pc_rhel_8_0_compat from pc_compat_3_1 */
a83cc2
+    { "Opteron_G4" "-" TYPE_X86_CPU, "rdtscp", "off" },
a83cc2
+    /* pc_rhel_8_0_compat from pc_compat_3_1 */
a83cc2
+    { "Opteron_G4" "-" TYPE_X86_CPU, "npt", "off" },
a83cc2
+    /* pc_rhel_8_0_compat from pc_compat_3_1 */
a83cc2
+    { "Opteron_G4" "-" TYPE_X86_CPU, "nrip-save", "off" },
a83cc2
+    /* pc_rhel_8_0_compat from pc_compat_3_1 */
a83cc2
+    { "Opteron_G5" "-" TYPE_X86_CPU, "rdtscp", "off" },
a83cc2
+    /* pc_rhel_8_0_compat from pc_compat_3_1 */
a83cc2
+    { "Opteron_G5" "-" TYPE_X86_CPU, "npt", "off" },
a83cc2
+    /* pc_rhel_8_0_compat from pc_compat_3_1 */
a83cc2
+    { "Opteron_G5" "-" TYPE_X86_CPU, "nrip-save", "off" },
a83cc2
+    /* pc_rhel_8_0_compat from pc_compat_3_1 */
a83cc2
+    { "EPYC" "-" TYPE_X86_CPU, "npt", "off" },
a83cc2
+    /* pc_rhel_8_0_compat from pc_compat_3_1 */
a83cc2
+    { "EPYC" "-" TYPE_X86_CPU, "nrip-save", "off" },
a83cc2
+    /* pc_rhel_8_0_compat from pc_compat_3_1 */
a83cc2
+    { "EPYC-IBPB" "-" TYPE_X86_CPU, "npt", "off" },
a83cc2
+    /* pc_rhel_8_0_compat from pc_compat_3_1 */
a83cc2
+    { "EPYC-IBPB" "-" TYPE_X86_CPU, "nrip-save", "off" },
a83cc2
+    /** The mpx=on entries from pc_compat_3_1 are in pc_rhel_7_6_compat **/
a83cc2
+    /* pc_rhel_8_0_compat from pc_compat_3_1 */
a83cc2
+    { "Cascadelake-Server" "-" TYPE_X86_CPU, "stepping", "5" },
a83cc2
+    /* pc_rhel_8_0_compat from pc_compat_3_1 */
a83cc2
+    { TYPE_X86_CPU, "x-intel-pt-auto-level", "off" },
a83cc2
+};
a83cc2
+const size_t pc_rhel_8_0_compat_len = G_N_ELEMENTS(pc_rhel_8_0_compat);
a83cc2
+
a83cc2
+/* Similar to PC_COMPAT_3_0 + PC_COMPAT_2_12, but:
a83cc2
+ * all of the 2_12 stuff was already in 7.6 from bz 1481253
a83cc2
+ * x-migrate-smi-count comes from PC_COMPAT_2_11 but
a83cc2
+ * is really tied to kernel version so keep it off on 7.x
a83cc2
+ * machine types irrespective of host.
a83cc2
+ */
a83cc2
+GlobalProperty pc_rhel_7_6_compat[] = {
a83cc2
+    /* pc_rhel_7_6_compat from pc_compat_3_0 */ 
a83cc2
+    { TYPE_X86_CPU, "x-hv-synic-kvm-only", "on" },
a83cc2
+    /* pc_rhel_7_6_compat from pc_compat_3_0 */ 
a83cc2
+    { "Skylake-Server" "-" TYPE_X86_CPU, "pku", "off" },
a83cc2
+    /* pc_rhel_7_6_compat from pc_compat_3_0 */ 
a83cc2
+    { "Skylake-Server-IBRS" "-" TYPE_X86_CPU, "pku", "off" },
a83cc2
+    /* pc_rhel_7_6_compat from pc_compat_2_11 */ 
a83cc2
+    { TYPE_X86_CPU, "x-migrate-smi-count", "off" },
a83cc2
+    /* pc_rhel_7_6_compat from pc_compat_2_11 */ 
a83cc2
+    { "Skylake-Client" "-" TYPE_X86_CPU, "mpx", "on" },
a83cc2
+    /* pc_rhel_7_6_compat from pc_compat_2_11 */ 
a83cc2
+    { "Skylake-Client-IBRS" "-" TYPE_X86_CPU, "mpx", "on" },
a83cc2
+    /* pc_rhel_7_6_compat from pc_compat_2_11 */ 
a83cc2
+    { "Skylake-Server" "-" TYPE_X86_CPU, "mpx", "on" },
a83cc2
+    /* pc_rhel_7_6_compat from pc_compat_2_11 */ 
a83cc2
+    { "Skylake-Server-IBRS" "-" TYPE_X86_CPU, "mpx", "on" },
a83cc2
+    /* pc_rhel_7_6_compat from pc_compat_2_11 */ 
a83cc2
+    { "Cascadelake-Server" "-" TYPE_X86_CPU, "mpx", "on" },
a83cc2
+    /* pc_rhel_7_6_compat from pc_compat_2_11 */ 
a83cc2
+    { "Icelake-Client" "-" TYPE_X86_CPU, "mpx", "on" },
a83cc2
+    /* pc_rhel_7_6_compat from pc_compat_2_11 */ 
a83cc2
+    { "Icelake-Server" "-" TYPE_X86_CPU, "mpx", "on" },
a83cc2
+};
a83cc2
+const size_t pc_rhel_7_6_compat_len = G_N_ELEMENTS(pc_rhel_7_6_compat);
a83cc2
+
a83cc2
+/* Similar to PC_COMPAT_2_11 + PC_COMPAT_2_10, but:
a83cc2
+ * - x-hv-max-vps was backported to 7.5
a83cc2
+ * - x-pci-hole64-fix was backported to 7.5
a83cc2
+ */
a83cc2
+GlobalProperty pc_rhel_7_5_compat[] = {
a83cc2
+    /* pc_rhel_7_5_compat from pc_compat_2_11 */  
a83cc2
+    { "Skylake-Server" "-" TYPE_X86_CPU, "clflushopt", "off" },
a83cc2
+    /* pc_rhel_7_5_compat from pc_compat_2_12 */  
a83cc2
+    { TYPE_X86_CPU, "legacy-cache", "on" },
a83cc2
+    /* pc_rhel_7_5_compat from pc_compat_2_12 */  
a83cc2
+    { TYPE_X86_CPU, "topoext", "off" },
a83cc2
+    /* pc_rhel_7_5_compat from pc_compat_2_12 */  
a83cc2
+    { "EPYC-" TYPE_X86_CPU, "xlevel", stringify(0x8000000a) },
a83cc2
+    /* pc_rhel_7_5_compat from pc_compat_2_12 */  
a83cc2
+    { "EPYC-IBPB-" TYPE_X86_CPU, "xlevel", stringify(0x8000000a) },
a83cc2
+};
a83cc2
+const size_t pc_rhel_7_5_compat_len = G_N_ELEMENTS(pc_rhel_7_5_compat);
a83cc2
+
a83cc2
+GlobalProperty pc_rhel_7_4_compat[] = {
a83cc2
+    /* pc_rhel_7_4_compat from pc_compat_2_9 */ 
a83cc2
+    { "mch", "extended-tseg-mbytes", stringify(0) },
a83cc2
+    /* bz 1489800 */ 
a83cc2
+    { "ICH9-LPC", "__com.redhat_force-rev1-fadt", "on" },
a83cc2
+    /* pc_rhel_7_4_compat from pc_compat_2_10 */ 
a83cc2
+    { "i440FX-pcihost", "x-pci-hole64-fix", "off" },
a83cc2
+    /* pc_rhel_7_4_compat from pc_compat_2_10 */ 
a83cc2
+    { "q35-pcihost", "x-pci-hole64-fix", "off" },
a83cc2
+    /* pc_rhel_7_4_compat from pc_compat_2_10 */ 
a83cc2
+    { TYPE_X86_CPU, "x-hv-max-vps", "0x40" },
a83cc2
+};
a83cc2
+const size_t pc_rhel_7_4_compat_len = G_N_ELEMENTS(pc_rhel_7_4_compat);
a83cc2
+
a83cc2
+GlobalProperty pc_rhel_7_3_compat[] = {
a83cc2
+    /* pc_rhel_7_3_compat from pc_compat_2_8 */ 
a83cc2
+    { "kvmclock", "x-mach-use-reliable-get-clock", "off" },
a83cc2
+    /* pc_rhel_7_3_compat from pc_compat_2_7 */ 
a83cc2
+    { TYPE_X86_CPU, "l3-cache", "off" },
a83cc2
+    /* pc_rhel_7_3_compat from pc_compat_2_7 */ 
a83cc2
+    { TYPE_X86_CPU, "full-cpuid-auto-level", "off" },
a83cc2
+    /* pc_rhel_7_3_compat from pc_compat_2_7 */ 
a83cc2
+    { "Opteron_G3" "-" TYPE_X86_CPU, "family", "15" },
a83cc2
+    /* pc_rhel_7_3_compat from pc_compat_2_7 */ 
a83cc2
+    { "Opteron_G3" "-" TYPE_X86_CPU, "model", "6" },
a83cc2
+    /* pc_rhel_7_3_compat from pc_compat_2_7 */ 
a83cc2
+    { "Opteron_G3" "-" TYPE_X86_CPU, "stepping", "1" },
a83cc2
+    /* pc_rhel_7_3_compat from pc_compat_2_7 */ 
a83cc2
+    { "isa-pcspk", "migrate", "off" },
a83cc2
+    /* pc_rhel_7_3_compat from pc_compat_2_6 */ 
a83cc2
+    { TYPE_X86_CPU, "cpuid-0xb", "off" },
a83cc2
+    /* pc_rhel_7_3_compat from pc_compat_2_8 */ 
a83cc2
+    { "ICH9-LPC", "x-smi-broadcast", "off" },
a83cc2
+    /* pc_rhel_7_3_compat from pc_compat_2_8 */ 
a83cc2
+    { TYPE_X86_CPU, "vmware-cpuid-freq", "off" },
a83cc2
+    /* pc_rhel_7_3_compat from pc_compat_2_8 */ 
a83cc2
+    { "Haswell-" TYPE_X86_CPU, "stepping", "1" },
a83cc2
+    /* pc_rhel_7_3_compat from pc_compat_2_3 added in 2.9*/ 
a83cc2
+    { TYPE_X86_CPU, "kvm-no-smi-migration", "on" },
a83cc2
+};
a83cc2
+const size_t pc_rhel_7_3_compat_len = G_N_ELEMENTS(pc_rhel_7_3_compat);
a83cc2
+
a83cc2
+GlobalProperty pc_rhel_7_2_compat[] = {
a83cc2
+    { "phenom" "-" TYPE_X86_CPU, "rdtscp", "off"},
a83cc2
+    { "qemu64" "-" TYPE_X86_CPU, "sse4a", "on" },
a83cc2
+    { "qemu64" "-" TYPE_X86_CPU, "abm", "on" },
a83cc2
+    { "Haswell-" TYPE_X86_CPU, "abm", "off" },
a83cc2
+    { "Haswell-IBRS" "-" TYPE_X86_CPU, "abm", "off" },
a83cc2
+    { "Haswell-noTSX-" TYPE_X86_CPU, "abm", "off" },
a83cc2
+    { "Haswell-noTSX-IBRS" "-" TYPE_X86_CPU, "abm", "off" },
a83cc2
+    { "Broadwell-" TYPE_X86_CPU, "abm", "off" },
a83cc2
+    { "Broadwell-IBRS" "-" TYPE_X86_CPU, "abm", "off" },
a83cc2
+    { "Broadwell-noTSX-" TYPE_X86_CPU, "abm", "off" },
a83cc2
+    { "Broadwell-noTSX-IBRS" "-" TYPE_X86_CPU, "abm", "off" },
a83cc2
+    { "host" "-" TYPE_X86_CPU, "host-cache-info", "on" },
a83cc2
+    { TYPE_X86_CPU, "check", "off" },
a83cc2
+    { "qemu32" "-" TYPE_X86_CPU, "popcnt", "on" },
a83cc2
+    { TYPE_X86_CPU, "arat", "off" },
a83cc2
+    { "usb-redir", "streams", "off" },
a83cc2
+    { TYPE_X86_CPU, "fill-mtrr-mask", "off" },
a83cc2
+    { "apic-common", "legacy-instance-id", "on" },
a83cc2
+};
a83cc2
+const size_t pc_rhel_7_2_compat_len = G_N_ELEMENTS(pc_rhel_7_2_compat);
a83cc2
+
a83cc2
+GlobalProperty pc_rhel_7_1_compat[] = {
a83cc2
+    { "kvm64" "-" TYPE_X86_CPU, "vme", "off" },
a83cc2
+    { "kvm32" "-" TYPE_X86_CPU, "vme", "off" },
a83cc2
+    { "Conroe" "-" TYPE_X86_CPU, "vme", "off" },
a83cc2
+    { "Penryn" "-" TYPE_X86_CPU, "vme", "off" },
a83cc2
+    { "Nehalem" "-" TYPE_X86_CPU, "vme", "off" },
a83cc2
+    { "Nehalem-IBRS" "-" TYPE_X86_CPU, "vme", "off" },
a83cc2
+    { "Westmere" "-" TYPE_X86_CPU, "vme", "off" },
a83cc2
+    { "Westmere-IBRS" "-" TYPE_X86_CPU, "vme", "off" },
a83cc2
+    { "SandyBridge" "-" TYPE_X86_CPU, "vme", "off" },
a83cc2
+    { "SandyBridge-IBRS" "-" TYPE_X86_CPU, "vme", "off" },
a83cc2
+    { "Haswell" "-" TYPE_X86_CPU, "vme", "off" },
a83cc2
+    { "Haswell-IBRS" "-" TYPE_X86_CPU, "vme", "off" },
a83cc2
+    { "Broadwell" "-" TYPE_X86_CPU, "vme", "off" },
a83cc2
+    { "Broadwell-IBRS" "-" TYPE_X86_CPU, "vme", "off" },
a83cc2
+    { "Opteron_G1" "-" TYPE_X86_CPU, "vme", "off" },
a83cc2
+    { "Opteron_G2" "-" TYPE_X86_CPU, "vme", "off" },
a83cc2
+    { "Opteron_G3" "-" TYPE_X86_CPU, "vme", "off" },
a83cc2
+    { "Opteron_G4" "-" TYPE_X86_CPU, "vme", "off" },
a83cc2
+    { "Opteron_G5" "-" TYPE_X86_CPU, "vme", "off" },
a83cc2
+    { "Haswell" "-" TYPE_X86_CPU,  "f16c", "off" },
a83cc2
+    { "Haswell-IBRS" "-" TYPE_X86_CPU, "f16c", "off" },
a83cc2
+    { "Haswell" "-" TYPE_X86_CPU, "rdrand", "off" },
a83cc2
+    { "Haswell-IBRS" "-" TYPE_X86_CPU, "rdrand", "off" },
a83cc2
+    { "Broadwell" "-" TYPE_X86_CPU, "f16c", "off" },
a83cc2
+    { "Broadwell-IBRS" "-" TYPE_X86_CPU, "f16c", "off" },
a83cc2
+    { "Broadwell" "-" TYPE_X86_CPU, "rdrand", "off" },
a83cc2
+    { "Broadwell-IBRS" "-" TYPE_X86_CPU, "rdrand", "off" },
a83cc2
+    { "coreduo" "-" TYPE_X86_CPU, "vmx", "on" },
a83cc2
+    { "core2duo" "-" TYPE_X86_CPU, "vmx", "on" },
a83cc2
+    { "qemu64" "-" TYPE_X86_CPU, "min-level", stringify(4) },
a83cc2
+    { "kvm64" "-" TYPE_X86_CPU, "min-level", stringify(5) },
a83cc2
+    { "pentium3" "-" TYPE_X86_CPU, "min-level", stringify(2) },
a83cc2
+    { "n270" "-" TYPE_X86_CPU, "min-level", stringify(5) },
a83cc2
+    { "Conroe" "-" TYPE_X86_CPU, "min-level", stringify(4) },
a83cc2
+    { "Penryn" "-" TYPE_X86_CPU, "min-level", stringify(4) },
a83cc2
+    { "Nehalem" "-" TYPE_X86_CPU, "min-level", stringify(4) },
a83cc2
+    { "n270" "-" TYPE_X86_CPU, "min-xlevel", stringify(0x8000000a) },
a83cc2
+    { "Penryn" "-" TYPE_X86_CPU, "min-xlevel", stringify(0x8000000a) },
a83cc2
+    { "Conroe" "-" TYPE_X86_CPU, "min-xlevel", stringify(0x8000000a) },
a83cc2
+    { "Nehalem" "-" TYPE_X86_CPU, "min-xlevel", stringify(0x8000000a) },
a83cc2
+    { "Westmere" "-" TYPE_X86_CPU, "min-xlevel", stringify(0x8000000a) },
a83cc2
+    { "SandyBridge" "-" TYPE_X86_CPU, "min-xlevel", stringify(0x8000000a) },
a83cc2
+    { "IvyBridge" "-" TYPE_X86_CPU, "min-xlevel", stringify(0x8000000a) },
a83cc2
+    { "Haswell" "-" TYPE_X86_CPU, "min-xlevel", stringify(0x8000000a) },
a83cc2
+    { "Haswell-noTSX" "-" TYPE_X86_CPU, "min-xlevel", stringify(0x8000000a) },
a83cc2
+    { "Broadwell" "-" TYPE_X86_CPU, "min-xlevel", stringify(0x8000000a) },
a83cc2
+    { "Broadwell-noTSX" "-" TYPE_X86_CPU, "min-xlevel", stringify(0x8000000a) },
a83cc2
+};
a83cc2
+const size_t pc_rhel_7_1_compat_len = G_N_ELEMENTS(pc_rhel_7_1_compat);
a83cc2
+
a83cc2
+/*
a83cc2
+ * The PC_RHEL_*_COMPAT serve the same purpose for RHEL-7 machine
a83cc2
+ * types as the PC_COMPAT_* do for upstream types.
a83cc2
+ * PC_RHEL_7_*_COMPAT apply both to i440fx and q35 types.
a83cc2
+ */
a83cc2
+
a83cc2
+/*
a83cc2
+ * RHEL-7 is based on QEMU 1.5.3, so this needs the PC_COMPAT_*
a83cc2
+ * between our base and 1.5, less stuff backported to RHEL-7.0
a83cc2
+ * (usb-device.msos-desc), less stuff for devices we changed
a83cc2
+ * (qemu64-x86_64-cpu) or don't support (hpet, pci-serial-2x,
a83cc2
+ * pci-serial-4x) in 7.0.
a83cc2
+ */
a83cc2
+GlobalProperty pc_rhel_7_0_compat[] = {
a83cc2
+    { "virtio-scsi-pci", "any_layout", "off" },
a83cc2
+    { "PIIX4_PM", "memory-hotplug-support", "off" },
a83cc2
+    { "apic", "version", stringify(0x11) },
a83cc2
+    { "nec-usb-xhci", "superspeed-ports-first", "off" },
a83cc2
+    { "nec-usb-xhci", "force-pcie-endcap", "on" },
a83cc2
+    { "pci-serial", "prog_if", stringify(0) },
a83cc2
+    { "virtio-net-pci", "guest_announce", "off" },
a83cc2
+    { "ICH9-LPC", "memory-hotplug-support", "off" },
a83cc2
+    { "xio3130-downstream", COMPAT_PROP_PCP, "off" },
a83cc2
+    { "ioh3420", COMPAT_PROP_PCP, "off" },
a83cc2
+    { "PIIX4_PM", "acpi-pci-hotplug-with-bridge-support", "off" },
a83cc2
+    { "e1000", "mitigation", "off" },
a83cc2
+    { "virtio-net-pci", "ctrl_guest_offloads", "off" },
a83cc2
+    { "Conroe" "-" TYPE_X86_CPU, "x2apic", "on" },
a83cc2
+    { "Penryn" "-" TYPE_X86_CPU, "x2apic", "on" },
a83cc2
+    { "Nehalem" "-" TYPE_X86_CPU, "x2apic", "on" },
a83cc2
+    { "Nehalem-IBRS" "-" TYPE_X86_CPU, "x2apic", "on" },
a83cc2
+    { "Westmere" "-" TYPE_X86_CPU, "x2apic", "on" },
a83cc2
+    { "Westmere-IBRS" "-" TYPE_X86_CPU, "x2apic", "on" },
a83cc2
+    { "Opteron_G1" "-" TYPE_X86_CPU, "x2apic", "on" },
a83cc2
+    { "Opteron_G2" "-" TYPE_X86_CPU, "x2apic", "on" },
a83cc2
+    { "Opteron_G3" "-" TYPE_X86_CPU, "x2apic", "on" },
a83cc2
+    { "Opteron_G4" "-" TYPE_X86_CPU, "x2apic", "on" },
a83cc2
+    { "Opteron_G5" "-" TYPE_X86_CPU, "x2apic", "on" },
a83cc2
+};
a83cc2
+const size_t pc_rhel_7_0_compat_len = G_N_ELEMENTS(pc_rhel_7_0_compat);
a83cc2
+
a83cc2
 GSIState *pc_gsi_create(qemu_irq **irqs, bool pci_enabled)
a83cc2
 {
a83cc2
     GSIState *s;
a83cc2
@@ -952,7 +1221,8 @@ void pc_memory_init(PCMachineState *pcms,
a83cc2
     option_rom_mr = g_malloc(sizeof(*option_rom_mr));
a83cc2
     memory_region_init_ram(option_rom_mr, NULL, "pc.rom", PC_ROM_SIZE,
a83cc2
                            &error_fatal);
a83cc2
-    if (pcmc->pci_enabled) {
a83cc2
+    /* RH difference: See bz 1489800, explicitly make ROM ro */
a83cc2
+    if (pcmc->pc_rom_ro) {
a83cc2
         memory_region_set_readonly(option_rom_mr, true);
a83cc2
     }
a83cc2
     memory_region_add_subregion_overlap(rom_memory,
a83cc2
@@ -1702,6 +1972,8 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
a83cc2
     pcmc->pvh_enabled = true;
a83cc2
     pcmc->kvmclock_create_always = true;
a83cc2
     assert(!mc->get_hotplug_handler);
a83cc2
+    pcmc->pc_rom_ro = true;
a83cc2
+    mc->async_pf_vmexit_disable = false;
a83cc2
     mc->get_hotplug_handler = pc_get_hotplug_handler;
a83cc2
     mc->hotplug_allowed = pc_hotplug_allowed;
a83cc2
     mc->cpu_index_to_instance_props = x86_cpu_index_to_props;
a83cc2
@@ -1713,7 +1985,8 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
a83cc2
     mc->default_boot_order = "cad";
a83cc2
     mc->smp_parse = pc_smp_parse;
a83cc2
     mc->block_default_type = IF_IDE;
a83cc2
-    mc->max_cpus = 255;
a83cc2
+    /* 240: max CPU count for RHEL */
a83cc2
+    mc->max_cpus = 240;
a83cc2
     mc->reset = pc_machine_reset;
a83cc2
     mc->wakeup = pc_machine_wakeup;
a83cc2
     hc->pre_plug = pc_machine_device_pre_plug_cb;
a83cc2
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
a83cc2
index 62433d8022..d9c5df16d8 100644
a83cc2
--- a/hw/i386/pc_piix.c
a83cc2
+++ b/hw/i386/pc_piix.c
a83cc2
@@ -54,6 +54,7 @@
a83cc2
 #include "qapi/error.h"
a83cc2
 #include "qemu/error-report.h"
a83cc2
 #include "sysemu/xen.h"
a83cc2
+#include "migration/migration.h"
a83cc2
 #ifdef CONFIG_XEN
a83cc2
 #include <xen/hvm/hvm_info_table.h>
a83cc2
 #include "hw/xen/xen_pt.h"
a83cc2
@@ -176,8 +177,8 @@ static void pc_init1(MachineState *machine,
a83cc2
     if (pcmc->smbios_defaults) {
a83cc2
         MachineClass *mc = MACHINE_GET_CLASS(machine);
a83cc2
         /* These values are guest ABI, do not change */
a83cc2
-        smbios_set_defaults("QEMU", "Standard PC (i440FX + PIIX, 1996)",
a83cc2
-                            mc->name, pcmc->smbios_legacy_mode,
a83cc2
+        smbios_set_defaults("Red Hat", "KVM",
a83cc2
+                            mc->desc, pcmc->smbios_legacy_mode,
a83cc2
                             pcmc->smbios_uuid_encoded,
a83cc2
                             pcmc->smbios_stream_product,
a83cc2
                             pcmc->smbios_stream_version,
a83cc2
@@ -316,6 +317,7 @@ static void pc_init1(MachineState *machine,
a83cc2
  * hw_compat_*, pc_compat_*, or * pc_*_machine_options().
a83cc2
  */
a83cc2
 
a83cc2
+#if 0 /* Disabled for Red Hat Enterprise Linux */
a83cc2
 static void pc_compat_2_3_fn(MachineState *machine)
a83cc2
 {
a83cc2
     X86MachineState *x86ms = X86_MACHINE(machine);
a83cc2
@@ -927,3 +929,222 @@ static void xenfv_3_1_machine_options(MachineClass *m)
a83cc2
 DEFINE_PC_MACHINE(xenfv, "xenfv-3.1", pc_xen_hvm_init,
a83cc2
                   xenfv_3_1_machine_options);
a83cc2
 #endif
a83cc2
+#endif  /* Disabled for Red Hat Enterprise Linux */
a83cc2
+
a83cc2
+/* Red Hat Enterprise Linux machine types */
a83cc2
+
a83cc2
+/* Options for the latest rhel7 machine type */
a83cc2
+static void pc_machine_rhel7_options(MachineClass *m)
a83cc2
+{
a83cc2
+    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
a83cc2
+    m->family = "pc_piix_Y";
a83cc2
+    m->default_machine_opts = "firmware=bios-256k.bin,hpet=off";
a83cc2
+    pcmc->default_nic_model = "e1000";
a83cc2
+    pcmc->pci_root_uid = 0;
a83cc2
+    m->default_display = "std";
a83cc2
+    m->no_parallel = 1;
a83cc2
+    m->numa_mem_supported = true;
a83cc2
+    m->auto_enable_numa_with_memdev = false;
a83cc2
+    machine_class_allow_dynamic_sysbus_dev(m, TYPE_RAMFB_DEVICE);
a83cc2
+    compat_props_add(m->compat_props, pc_rhel_compat, pc_rhel_compat_len);
a83cc2
+    m->alias = "pc";
a83cc2
+    m->is_default = 1;
a83cc2
+}
a83cc2
+
a83cc2
+static void pc_init_rhel760(MachineState *machine)
a83cc2
+{
a83cc2
+    pc_init1(machine, TYPE_I440FX_PCI_HOST_BRIDGE, \
a83cc2
+             TYPE_I440FX_PCI_DEVICE);
a83cc2
+}
a83cc2
+
a83cc2
+static void pc_machine_rhel760_options(MachineClass *m)
a83cc2
+{
a83cc2
+    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
a83cc2
+    pc_machine_rhel7_options(m);
a83cc2
+    m->desc = "RHEL 7.6.0 PC (i440FX + PIIX, 1996)";
a83cc2
+    m->async_pf_vmexit_disable = true;
a83cc2
+    m->smbus_no_migration_support = true;
a83cc2
+    pcmc->pvh_enabled = false;
a83cc2
+    pcmc->default_cpu_version = CPU_VERSION_LEGACY;
a83cc2
+    pcmc->kvmclock_create_always = false;
a83cc2
+    /* From pc_i440fx_5_1_machine_options() */
a83cc2
+    pcmc->pci_root_uid = 1;
a83cc2
+    compat_props_add(m->compat_props, hw_compat_rhel_8_4,
a83cc2
+                     hw_compat_rhel_8_4_len);
a83cc2
+    compat_props_add(m->compat_props, hw_compat_rhel_8_3,
a83cc2
+                     hw_compat_rhel_8_3_len);
a83cc2
+    compat_props_add(m->compat_props, pc_rhel_8_3_compat,
a83cc2
+                     pc_rhel_8_3_compat_len);
a83cc2
+    compat_props_add(m->compat_props, hw_compat_rhel_8_2,
a83cc2
+                     hw_compat_rhel_8_2_len);
a83cc2
+    compat_props_add(m->compat_props, pc_rhel_8_2_compat,
a83cc2
+                     pc_rhel_8_2_compat_len);
a83cc2
+    compat_props_add(m->compat_props, hw_compat_rhel_8_1, hw_compat_rhel_8_1_len);
a83cc2
+    compat_props_add(m->compat_props, pc_rhel_8_1_compat, pc_rhel_8_1_compat_len);
a83cc2
+    compat_props_add(m->compat_props, hw_compat_rhel_8_0, hw_compat_rhel_8_0_len);
a83cc2
+    compat_props_add(m->compat_props, pc_rhel_8_0_compat, pc_rhel_8_0_compat_len);
a83cc2
+    compat_props_add(m->compat_props, hw_compat_rhel_7_6, hw_compat_rhel_7_6_len);
a83cc2
+    compat_props_add(m->compat_props, pc_rhel_7_6_compat, pc_rhel_7_6_compat_len);
a83cc2
+}
a83cc2
+
a83cc2
+DEFINE_PC_MACHINE(rhel760, "pc-i440fx-rhel7.6.0", pc_init_rhel760,
a83cc2
+                  pc_machine_rhel760_options);
a83cc2
+
a83cc2
+static void pc_init_rhel750(MachineState *machine)
a83cc2
+{
a83cc2
+    pc_init1(machine, TYPE_I440FX_PCI_HOST_BRIDGE, \
a83cc2
+             TYPE_I440FX_PCI_DEVICE);
a83cc2
+}
a83cc2
+
a83cc2
+static void pc_machine_rhel750_options(MachineClass *m)
a83cc2
+{
a83cc2
+    pc_machine_rhel760_options(m);
a83cc2
+    m->alias = NULL;
a83cc2
+    m->is_default = 0;
a83cc2
+    m->desc = "RHEL 7.5.0 PC (i440FX + PIIX, 1996)";
a83cc2
+    m->auto_enable_numa_with_memhp = false;
a83cc2
+    compat_props_add(m->compat_props, hw_compat_rhel_7_5, hw_compat_rhel_7_5_len);
a83cc2
+    compat_props_add(m->compat_props, pc_rhel_7_5_compat, pc_rhel_7_5_compat_len);
a83cc2
+}
a83cc2
+
a83cc2
+DEFINE_PC_MACHINE(rhel750, "pc-i440fx-rhel7.5.0", pc_init_rhel750,
a83cc2
+                  pc_machine_rhel750_options);
a83cc2
+
a83cc2
+static void pc_init_rhel740(MachineState *machine)
a83cc2
+{
a83cc2
+    pc_init1(machine, TYPE_I440FX_PCI_HOST_BRIDGE, \
a83cc2
+             TYPE_I440FX_PCI_DEVICE);
a83cc2
+}
a83cc2
+
a83cc2
+static void pc_machine_rhel740_options(MachineClass *m)
a83cc2
+{
a83cc2
+    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
a83cc2
+    pc_machine_rhel750_options(m);
a83cc2
+    m->desc = "RHEL 7.4.0 PC (i440FX + PIIX, 1996)";
a83cc2
+    pcmc->pc_rom_ro = false;
a83cc2
+    compat_props_add(m->compat_props, hw_compat_rhel_7_4, hw_compat_rhel_7_4_len);
a83cc2
+    compat_props_add(m->compat_props, pc_rhel_7_4_compat, pc_rhel_7_4_compat_len);
a83cc2
+}
a83cc2
+
a83cc2
+DEFINE_PC_MACHINE(rhel740, "pc-i440fx-rhel7.4.0", pc_init_rhel740,
a83cc2
+                  pc_machine_rhel740_options);
a83cc2
+
a83cc2
+static void pc_init_rhel730(MachineState *machine)
a83cc2
+{
a83cc2
+    pc_init1(machine, TYPE_I440FX_PCI_HOST_BRIDGE, \
a83cc2
+             TYPE_I440FX_PCI_DEVICE);
a83cc2
+}
a83cc2
+
a83cc2
+static void pc_machine_rhel730_options(MachineClass *m)
a83cc2
+{
a83cc2
+    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
a83cc2
+    pc_machine_rhel740_options(m);
a83cc2
+    m->desc = "RHEL 7.3.0 PC (i440FX + PIIX, 1996)";
a83cc2
+    pcmc->linuxboot_dma_enabled = false;
a83cc2
+    compat_props_add(m->compat_props, hw_compat_rhel_7_3, hw_compat_rhel_7_3_len);
a83cc2
+    compat_props_add(m->compat_props, pc_rhel_7_3_compat, pc_rhel_7_3_compat_len);
a83cc2
+}
a83cc2
+
a83cc2
+DEFINE_PC_MACHINE(rhel730, "pc-i440fx-rhel7.3.0", pc_init_rhel730,
a83cc2
+                  pc_machine_rhel730_options);
a83cc2
+
a83cc2
+
a83cc2
+static void pc_init_rhel720(MachineState *machine)
a83cc2
+{
a83cc2
+    pc_init1(machine, TYPE_I440FX_PCI_HOST_BRIDGE, \
a83cc2
+             TYPE_I440FX_PCI_DEVICE);
a83cc2
+}
a83cc2
+
a83cc2
+static void pc_machine_rhel720_options(MachineClass *m)
a83cc2
+{
a83cc2
+    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
a83cc2
+    X86MachineClass *x86mc = X86_MACHINE_CLASS(m);
a83cc2
+    pc_machine_rhel730_options(m);
a83cc2
+    m->desc = "RHEL 7.2.0 PC (i440FX + PIIX, 1996)";
a83cc2
+    /* From pc_i440fx_2_5_machine_options */
a83cc2
+    x86mc->save_tsc_khz = false;
a83cc2
+    m->legacy_fw_cfg_order = 1;
a83cc2
+    /* Note: broken_reserved_end was already in 7.2 */
a83cc2
+    /* From pc_i440fx_2_6_machine_options */
a83cc2
+    pcmc->legacy_cpu_hotplug = true;
a83cc2
+    compat_props_add(m->compat_props, hw_compat_rhel_7_2, hw_compat_rhel_7_2_len);
a83cc2
+    compat_props_add(m->compat_props, pc_rhel_7_2_compat, pc_rhel_7_2_compat_len);
a83cc2
+}
a83cc2
+
a83cc2
+DEFINE_PC_MACHINE(rhel720, "pc-i440fx-rhel7.2.0", pc_init_rhel720,
a83cc2
+                  pc_machine_rhel720_options);
a83cc2
+
a83cc2
+static void pc_compat_rhel710(MachineState *machine)
a83cc2
+{
a83cc2
+    PCMachineState *pcms = PC_MACHINE(machine);
a83cc2
+    PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
a83cc2
+
a83cc2
+    /* From pc_compat_2_2 */
a83cc2
+    pcmc->rsdp_in_ram = false;
a83cc2
+    machine->suppress_vmdesc = true;
a83cc2
+
a83cc2
+    /* From pc_compat_2_1 */
a83cc2
+    pcmc->smbios_uuid_encoded = false;
a83cc2
+    x86_cpu_change_kvm_default("svm", NULL);
a83cc2
+    pcmc->enforce_aligned_dimm = false;
a83cc2
+
a83cc2
+    /* Disable all the extra subsections that were added in 2.2 */
a83cc2
+    migrate_pre_2_2 = true;
a83cc2
+
a83cc2
+    /* From pc_i440fx_2_4_machine_options */
a83cc2
+    pcmc->broken_reserved_end = true;
a83cc2
+}
a83cc2
+
a83cc2
+static void pc_init_rhel710(MachineState *machine)
a83cc2
+{
a83cc2
+    pc_compat_rhel710(machine);
a83cc2
+    pc_init1(machine, TYPE_I440FX_PCI_HOST_BRIDGE, \
a83cc2
+             TYPE_I440FX_PCI_DEVICE);
a83cc2
+}
a83cc2
+
a83cc2
+static void pc_machine_rhel710_options(MachineClass *m)
a83cc2
+{
a83cc2
+    pc_machine_rhel720_options(m);
a83cc2
+    m->family = "pc_piix_Y";
a83cc2
+    m->desc = "RHEL 7.1.0 PC (i440FX + PIIX, 1996)";
a83cc2
+    m->default_display = "cirrus";
a83cc2
+    compat_props_add(m->compat_props, hw_compat_rhel_7_1, hw_compat_rhel_7_1_len);
a83cc2
+    compat_props_add(m->compat_props, pc_rhel_7_1_compat, pc_rhel_7_1_compat_len);
a83cc2
+}
a83cc2
+
a83cc2
+DEFINE_PC_MACHINE(rhel710, "pc-i440fx-rhel7.1.0", pc_init_rhel710,
a83cc2
+                  pc_machine_rhel710_options);
a83cc2
+
a83cc2
+static void pc_compat_rhel700(MachineState *machine)
a83cc2
+{
a83cc2
+    PCMachineState *pcms = PC_MACHINE(machine);
a83cc2
+    PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
a83cc2
+
a83cc2
+    pc_compat_rhel710(machine);
a83cc2
+
a83cc2
+    /* Upstream enables it for everyone, we're a little more selective */
a83cc2
+    x86_cpu_change_kvm_default("x2apic", NULL);
a83cc2
+    x86_cpu_change_kvm_default("svm", NULL);
a83cc2
+    pcmc->legacy_acpi_table_size = 6418; /* see pc_compat_2_0() */
a83cc2
+    pcmc->smbios_legacy_mode = true;
a83cc2
+    pcmc->has_reserved_memory = false;
a83cc2
+    migrate_cve_2014_5263_xhci_fields = true;
a83cc2
+}
a83cc2
+
a83cc2
+static void pc_init_rhel700(MachineState *machine)
a83cc2
+{
a83cc2
+    pc_compat_rhel700(machine);
a83cc2
+    pc_init1(machine, TYPE_I440FX_PCI_HOST_BRIDGE, \
a83cc2
+             TYPE_I440FX_PCI_DEVICE);
a83cc2
+}
a83cc2
+
a83cc2
+static void pc_machine_rhel700_options(MachineClass *m)
a83cc2
+{
a83cc2
+    pc_machine_rhel710_options(m);
a83cc2
+    m->family = "pc_piix_Y";
a83cc2
+    m->desc = "RHEL 7.0.0 PC (i440FX + PIIX, 1996)";
a83cc2
+    compat_props_add(m->compat_props, pc_rhel_7_0_compat, pc_rhel_7_0_compat_len);
a83cc2
+}
a83cc2
+
a83cc2
+DEFINE_PC_MACHINE(rhel700, "pc-i440fx-rhel7.0.0", pc_init_rhel700,
a83cc2
+                  pc_machine_rhel700_options);
a83cc2
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
a83cc2
index fce52ca70b..44109e4876 100644
a83cc2
--- a/hw/i386/pc_q35.c
a83cc2
+++ b/hw/i386/pc_q35.c
a83cc2
@@ -195,8 +195,8 @@ static void pc_q35_init(MachineState *machine)
a83cc2
 
a83cc2
     if (pcmc->smbios_defaults) {
a83cc2
         /* These values are guest ABI, do not change */
a83cc2
-        smbios_set_defaults("QEMU", "Standard PC (Q35 + ICH9, 2009)",
a83cc2
-                            mc->name, pcmc->smbios_legacy_mode,
a83cc2
+        smbios_set_defaults("Red Hat", "KVM",
a83cc2
+                            mc->desc, pcmc->smbios_legacy_mode,
a83cc2
                             pcmc->smbios_uuid_encoded,
a83cc2
                             pcmc->smbios_stream_product,
a83cc2
                             pcmc->smbios_stream_version,
a83cc2
@@ -327,6 +327,7 @@ static void pc_q35_init(MachineState *machine)
a83cc2
     DEFINE_PC_MACHINE(suffix, name, pc_init_##suffix, optionfn)
a83cc2
 
a83cc2
 
a83cc2
+#if 0 /* Disabled for Red Hat Enterprise Linux */
a83cc2
 static void pc_q35_machine_options(MachineClass *m)
a83cc2
 {
a83cc2
     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
a83cc2
@@ -581,3 +582,212 @@ static void pc_q35_2_4_machine_options(MachineClass *m)
a83cc2
 
a83cc2
 DEFINE_Q35_MACHINE(v2_4, "pc-q35-2.4", NULL,
a83cc2
                    pc_q35_2_4_machine_options);
a83cc2
+#endif  /* Disabled for Red Hat Enterprise Linux */
a83cc2
+
a83cc2
+/* Red Hat Enterprise Linux machine types */
a83cc2
+
a83cc2
+/* Options for the latest rhel q35 machine type */
a83cc2
+static void pc_q35_machine_rhel_options(MachineClass *m)
a83cc2
+{
a83cc2
+    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
a83cc2
+    pcmc->default_nic_model = "e1000e";
a83cc2
+    pcmc->pci_root_uid = 0;
a83cc2
+    m->family = "pc_q35_Z";
a83cc2
+    m->units_per_default_bus = 1;
a83cc2
+    m->default_machine_opts = "firmware=bios-256k.bin,hpet=off";
a83cc2
+    m->default_display = "std";
a83cc2
+    m->no_floppy = 1;
a83cc2
+    m->no_parallel = 1;
a83cc2
+    pcmc->default_cpu_version = 1;
a83cc2
+    machine_class_allow_dynamic_sysbus_dev(m, TYPE_AMD_IOMMU_DEVICE);
a83cc2
+    machine_class_allow_dynamic_sysbus_dev(m, TYPE_INTEL_IOMMU_DEVICE);
a83cc2
+    machine_class_allow_dynamic_sysbus_dev(m, TYPE_RAMFB_DEVICE);
a83cc2
+    m->alias = "q35";
a83cc2
+    m->max_cpus = 710;
a83cc2
+    compat_props_add(m->compat_props, pc_rhel_compat, pc_rhel_compat_len);
a83cc2
+}
a83cc2
+
a83cc2
+static void pc_q35_init_rhel840(MachineState *machine)
a83cc2
+{
a83cc2
+    pc_q35_init(machine);
a83cc2
+}
a83cc2
+
a83cc2
+static void pc_q35_machine_rhel840_options(MachineClass *m)
a83cc2
+{
a83cc2
+    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
a83cc2
+    pc_q35_machine_rhel_options(m);
a83cc2
+    m->desc = "RHEL-8.4.0 PC (Q35 + ICH9, 2009)";
a83cc2
+    pcmc->smbios_stream_product = "RHEL-AV";
a83cc2
+    pcmc->smbios_stream_version = "8.4.0";
a83cc2
+    compat_props_add(m->compat_props, hw_compat_rhel_8_4,
a83cc2
+                     hw_compat_rhel_8_4_len);
a83cc2
+}
a83cc2
+
a83cc2
+DEFINE_PC_MACHINE(q35_rhel840, "pc-q35-rhel8.4.0", pc_q35_init_rhel840,
a83cc2
+                  pc_q35_machine_rhel840_options);
a83cc2
+
a83cc2
+
a83cc2
+static void pc_q35_init_rhel830(MachineState *machine)
a83cc2
+{
a83cc2
+    pc_q35_init(machine);
a83cc2
+}
a83cc2
+
a83cc2
+static void pc_q35_machine_rhel830_options(MachineClass *m)
a83cc2
+{
a83cc2
+    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
a83cc2
+    pc_q35_machine_rhel840_options(m);
a83cc2
+    m->desc = "RHEL-8.3.0 PC (Q35 + ICH9, 2009)";
a83cc2
+    m->alias = NULL;
a83cc2
+    pcmc->smbios_stream_product = "RHEL-AV";
a83cc2
+    pcmc->smbios_stream_version = "8.3.0";
a83cc2
+    compat_props_add(m->compat_props, hw_compat_rhel_8_3,
a83cc2
+                     hw_compat_rhel_8_3_len);
a83cc2
+    compat_props_add(m->compat_props, pc_rhel_8_3_compat,
a83cc2
+                     pc_rhel_8_3_compat_len);
a83cc2
+    /* From pc_q35_5_1_machine_options() */
a83cc2
+    pcmc->kvmclock_create_always = false;
a83cc2
+    /* From pc_q35_5_1_machine_options() */
a83cc2
+    pcmc->pci_root_uid = 1;
a83cc2
+}
a83cc2
+
a83cc2
+DEFINE_PC_MACHINE(q35_rhel830, "pc-q35-rhel8.3.0", pc_q35_init_rhel830,
a83cc2
+                  pc_q35_machine_rhel830_options);
a83cc2
+
a83cc2
+static void pc_q35_init_rhel820(MachineState *machine)
a83cc2
+{
a83cc2
+    pc_q35_init(machine);
a83cc2
+}
a83cc2
+
a83cc2
+static void pc_q35_machine_rhel820_options(MachineClass *m)
a83cc2
+{
a83cc2
+    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
a83cc2
+    pc_q35_machine_rhel830_options(m);
a83cc2
+    m->desc = "RHEL-8.2.0 PC (Q35 + ICH9, 2009)";
a83cc2
+    m->numa_mem_supported = true;
a83cc2
+    m->auto_enable_numa_with_memdev = false;
a83cc2
+    pcmc->smbios_stream_product = "RHEL-AV";
a83cc2
+    pcmc->smbios_stream_version = "8.2.0";
a83cc2
+    compat_props_add(m->compat_props, hw_compat_rhel_8_2,
a83cc2
+                     hw_compat_rhel_8_2_len);
a83cc2
+    compat_props_add(m->compat_props, pc_rhel_8_2_compat,
a83cc2
+                     pc_rhel_8_2_compat_len);
a83cc2
+}
a83cc2
+
a83cc2
+DEFINE_PC_MACHINE(q35_rhel820, "pc-q35-rhel8.2.0", pc_q35_init_rhel820,
a83cc2
+                  pc_q35_machine_rhel820_options);
a83cc2
+
a83cc2
+static void pc_q35_init_rhel810(MachineState *machine)
a83cc2
+{
a83cc2
+    pc_q35_init(machine);
a83cc2
+}
a83cc2
+
a83cc2
+static void pc_q35_machine_rhel810_options(MachineClass *m)
a83cc2
+{
a83cc2
+    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
a83cc2
+    pc_q35_machine_rhel820_options(m);
a83cc2
+    m->desc = "RHEL-8.1.0 PC (Q35 + ICH9, 2009)";
a83cc2
+    m->alias = NULL;
a83cc2
+    pcmc->smbios_stream_product = NULL;
a83cc2
+    pcmc->smbios_stream_version = NULL;
a83cc2
+    compat_props_add(m->compat_props, hw_compat_rhel_8_1, hw_compat_rhel_8_1_len);
a83cc2
+    compat_props_add(m->compat_props, pc_rhel_8_1_compat, pc_rhel_8_1_compat_len);
a83cc2
+}
a83cc2
+
a83cc2
+DEFINE_PC_MACHINE(q35_rhel810, "pc-q35-rhel8.1.0", pc_q35_init_rhel810,
a83cc2
+                  pc_q35_machine_rhel810_options);
a83cc2
+
a83cc2
+static void pc_q35_init_rhel800(MachineState *machine)
a83cc2
+{
a83cc2
+    pc_q35_init(machine);
a83cc2
+}
a83cc2
+
a83cc2
+static void pc_q35_machine_rhel800_options(MachineClass *m)
a83cc2
+{
a83cc2
+    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
a83cc2
+    pc_q35_machine_rhel810_options(m);
a83cc2
+    m->desc = "RHEL-8.0.0 PC (Q35 + ICH9, 2009)";
a83cc2
+    m->smbus_no_migration_support = true;
a83cc2
+    m->alias = NULL;
a83cc2
+    pcmc->pvh_enabled = false;
a83cc2
+    pcmc->default_cpu_version = CPU_VERSION_LEGACY;
a83cc2
+    compat_props_add(m->compat_props, hw_compat_rhel_8_0, hw_compat_rhel_8_0_len);
a83cc2
+    compat_props_add(m->compat_props, pc_rhel_8_0_compat, pc_rhel_8_0_compat_len);
a83cc2
+}
a83cc2
+
a83cc2
+DEFINE_PC_MACHINE(q35_rhel800, "pc-q35-rhel8.0.0", pc_q35_init_rhel800,
a83cc2
+                  pc_q35_machine_rhel800_options);
a83cc2
+
a83cc2
+static void pc_q35_init_rhel760(MachineState *machine)
a83cc2
+{
a83cc2
+    pc_q35_init(machine);
a83cc2
+}
a83cc2
+
a83cc2
+static void pc_q35_machine_rhel760_options(MachineClass *m)
a83cc2
+{
a83cc2
+    pc_q35_machine_rhel800_options(m);
a83cc2
+    m->alias = NULL;
a83cc2
+    m->desc = "RHEL-7.6.0 PC (Q35 + ICH9, 2009)";
a83cc2
+    m->async_pf_vmexit_disable = true;
a83cc2
+    compat_props_add(m->compat_props, hw_compat_rhel_7_6, hw_compat_rhel_7_6_len);
a83cc2
+    compat_props_add(m->compat_props, pc_rhel_7_6_compat, pc_rhel_7_6_compat_len);
a83cc2
+}
a83cc2
+
a83cc2
+DEFINE_PC_MACHINE(q35_rhel760, "pc-q35-rhel7.6.0", pc_q35_init_rhel760,
a83cc2
+                  pc_q35_machine_rhel760_options);
a83cc2
+
a83cc2
+static void pc_q35_init_rhel750(MachineState *machine)
a83cc2
+{
a83cc2
+    pc_q35_init(machine);
a83cc2
+}
a83cc2
+
a83cc2
+static void pc_q35_machine_rhel750_options(MachineClass *m)
a83cc2
+{
a83cc2
+    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
a83cc2
+    pc_q35_machine_rhel760_options(m);
a83cc2
+    m->alias = NULL;
a83cc2
+    m->desc = "RHEL-7.5.0 PC (Q35 + ICH9, 2009)";
a83cc2
+    m->auto_enable_numa_with_memhp = false;
a83cc2
+    pcmc->default_nic_model = "e1000";
a83cc2
+    compat_props_add(m->compat_props, hw_compat_rhel_7_5, hw_compat_rhel_7_5_len);
a83cc2
+    compat_props_add(m->compat_props, pc_rhel_7_5_compat, pc_rhel_7_5_compat_len);
a83cc2
+}
a83cc2
+
a83cc2
+DEFINE_PC_MACHINE(q35_rhel750, "pc-q35-rhel7.5.0", pc_q35_init_rhel750,
a83cc2
+                  pc_q35_machine_rhel750_options);
a83cc2
+
a83cc2
+static void pc_q35_init_rhel740(MachineState *machine)
a83cc2
+{
a83cc2
+    pc_q35_init(machine);
a83cc2
+}
a83cc2
+
a83cc2
+static void pc_q35_machine_rhel740_options(MachineClass *m)
a83cc2
+{
a83cc2
+    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
a83cc2
+    pc_q35_machine_rhel750_options(m);
a83cc2
+    m->desc = "RHEL-7.4.0 PC (Q35 + ICH9, 2009)";
a83cc2
+    pcmc->pc_rom_ro = false;
a83cc2
+    compat_props_add(m->compat_props, hw_compat_rhel_7_4, hw_compat_rhel_7_4_len);
a83cc2
+    compat_props_add(m->compat_props, pc_rhel_7_4_compat, pc_rhel_7_4_compat_len);
a83cc2
+}
a83cc2
+
a83cc2
+DEFINE_PC_MACHINE(q35_rhel740, "pc-q35-rhel7.4.0", pc_q35_init_rhel740,
a83cc2
+                  pc_q35_machine_rhel740_options);
a83cc2
+
a83cc2
+static void pc_q35_init_rhel730(MachineState *machine)
a83cc2
+{
a83cc2
+    pc_q35_init(machine);
a83cc2
+}
a83cc2
+
a83cc2
+static void pc_q35_machine_rhel730_options(MachineClass *m)
a83cc2
+{
a83cc2
+    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
a83cc2
+    pc_q35_machine_rhel740_options(m);
a83cc2
+    m->desc = "RHEL-7.3.0 PC (Q35 + ICH9, 2009)";
a83cc2
+    m->max_cpus = 255;
a83cc2
+    pcmc->linuxboot_dma_enabled = false;
a83cc2
+    compat_props_add(m->compat_props, hw_compat_rhel_7_3, hw_compat_rhel_7_3_len);
a83cc2
+    compat_props_add(m->compat_props, pc_rhel_7_3_compat, pc_rhel_7_3_compat_len);
a83cc2
+}
a83cc2
+
a83cc2
+DEFINE_PC_MACHINE(q35_rhel730, "pc-q35-rhel7.3.0", pc_q35_init_rhel730,
a83cc2
+                  pc_q35_machine_rhel730_options);
a83cc2
diff --git a/include/hw/boards.h b/include/hw/boards.h
a83cc2
index 2d7a65724a..90ae100bfc 100644
a83cc2
--- a/include/hw/boards.h
a83cc2
+++ b/include/hw/boards.h
a83cc2
@@ -243,6 +243,8 @@ struct MachineClass {
a83cc2
     strList *allowed_dynamic_sysbus_devices;
a83cc2
     bool auto_enable_numa_with_memhp;
a83cc2
     bool auto_enable_numa_with_memdev;
a83cc2
+    /* RHEL only */
a83cc2
+    bool async_pf_vmexit_disable;
a83cc2
     bool ignore_boot_device_suffixes;
a83cc2
     bool smbus_no_migration_support;
a83cc2
     bool nvdimm_supported;
a83cc2
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
a83cc2
index 93c012ac95..79a7803a2f 100644
a83cc2
--- a/include/hw/i386/pc.h
a83cc2
+++ b/include/hw/i386/pc.h
a83cc2
@@ -128,6 +128,9 @@ struct PCMachineClass {
a83cc2
 
a83cc2
     /* create kvmclock device even when KVM PV features are not exposed */
a83cc2
     bool kvmclock_create_always;
a83cc2
+
a83cc2
+    /* RH only, see bz 1489800 */
a83cc2
+    bool pc_rom_ro;
a83cc2
 };
a83cc2
 
a83cc2
 #define TYPE_PC_MACHINE "generic-pc-machine"
a83cc2
@@ -275,6 +278,42 @@ extern const size_t pc_compat_1_5_len;
a83cc2
 extern GlobalProperty pc_compat_1_4[];
a83cc2
 extern const size_t pc_compat_1_4_len;
a83cc2
 
a83cc2
+extern GlobalProperty pc_rhel_compat[];
a83cc2
+extern const size_t pc_rhel_compat_len;
a83cc2
+
a83cc2
+extern GlobalProperty pc_rhel_8_3_compat[];
a83cc2
+extern const size_t pc_rhel_8_3_compat_len;
a83cc2
+
a83cc2
+extern GlobalProperty pc_rhel_8_2_compat[];
a83cc2
+extern const size_t pc_rhel_8_2_compat_len;
a83cc2
+
a83cc2
+extern GlobalProperty pc_rhel_8_1_compat[];
a83cc2
+extern const size_t pc_rhel_8_1_compat_len;
a83cc2
+
a83cc2
+extern GlobalProperty pc_rhel_8_0_compat[];
a83cc2
+extern const size_t pc_rhel_8_0_compat_len;
a83cc2
+
a83cc2
+extern GlobalProperty pc_rhel_7_6_compat[];
a83cc2
+extern const size_t pc_rhel_7_6_compat_len;
a83cc2
+
a83cc2
+extern GlobalProperty pc_rhel_7_5_compat[];
a83cc2
+extern const size_t pc_rhel_7_5_compat_len;
a83cc2
+
a83cc2
+extern GlobalProperty pc_rhel_7_4_compat[];
a83cc2
+extern const size_t pc_rhel_7_4_compat_len;
a83cc2
+
a83cc2
+extern GlobalProperty pc_rhel_7_3_compat[];
a83cc2
+extern const size_t pc_rhel_7_3_compat_len;
a83cc2
+
a83cc2
+extern GlobalProperty pc_rhel_7_2_compat[];
a83cc2
+extern const size_t pc_rhel_7_2_compat_len;
a83cc2
+
a83cc2
+extern GlobalProperty pc_rhel_7_1_compat[];
a83cc2
+extern const size_t pc_rhel_7_1_compat_len;
a83cc2
+
a83cc2
+extern GlobalProperty pc_rhel_7_0_compat[];
a83cc2
+extern const size_t pc_rhel_7_0_compat_len;
a83cc2
+
a83cc2
 /* Helper for setting model-id for CPU models that changed model-id
a83cc2
  * depending on QEMU versions up to QEMU 2.4.
a83cc2
  */
a83cc2
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
a83cc2
index ad99cad0e7..c30bb2a6b0 100644
a83cc2
--- a/target/i386/cpu.c
a83cc2
+++ b/target/i386/cpu.c
a83cc2
@@ -1882,7 +1882,7 @@ static X86CPUDefinition builtin_x86_defs[] = {
a83cc2
         .level = 0xd,
a83cc2
         .vendor = CPUID_VENDOR_AMD,
a83cc2
         .family = 6,
a83cc2
-        .model = 6,
a83cc2
+        .model = 13,
a83cc2
         .stepping = 3,
a83cc2
         .features[FEAT_1_EDX] =
a83cc2
             PPRO_FEATURES |
a83cc2
@@ -4264,6 +4264,7 @@ static PropValue kvm_default_props[] = {
a83cc2
     { "acpi", "off" },
a83cc2
     { "monitor", "off" },
a83cc2
     { "svm", "off" },
a83cc2
+    { "kvm-pv-unhalt", "on" },
a83cc2
     { NULL, NULL },
a83cc2
 };
a83cc2
 
a83cc2
diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
a83cc2
index 7fe9f52710..4c69c2cb4b 100644
a83cc2
--- a/target/i386/kvm/kvm.c
a83cc2
+++ b/target/i386/kvm/kvm.c
a83cc2
@@ -3181,6 +3181,7 @@ static int kvm_get_msrs(X86CPU *cpu)
a83cc2
     struct kvm_msr_entry *msrs = cpu->kvm_msr_buf->entries;
a83cc2
     int ret, i;
a83cc2
     uint64_t mtrr_top_bits;
a83cc2
+    MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
a83cc2
 
a83cc2
     kvm_msr_buf_reset(cpu);
a83cc2
 
a83cc2
@@ -3499,6 +3500,9 @@ static int kvm_get_msrs(X86CPU *cpu)
a83cc2
             break;
a83cc2
         case MSR_KVM_ASYNC_PF_EN:
a83cc2
             env->async_pf_en_msr = msrs[i].data;
a83cc2
+            if (mc->async_pf_vmexit_disable) {
a83cc2
+                env->async_pf_en_msr &= ~(1ULL << 2);
a83cc2
+            }
a83cc2
             break;
a83cc2
         case MSR_KVM_ASYNC_PF_INT:
a83cc2
             env->async_pf_int_msr = msrs[i].data;
a83cc2
diff --git a/tests/qtest/pvpanic-test.c b/tests/qtest/pvpanic-test.c
a83cc2
index 6dcad2db49..580c2c43d2 100644
a83cc2
--- a/tests/qtest/pvpanic-test.c
a83cc2
+++ b/tests/qtest/pvpanic-test.c
a83cc2
@@ -17,7 +17,7 @@ static void test_panic_nopause(void)
a83cc2
     QDict *response, *data;
a83cc2
     QTestState *qts;
a83cc2
 
a83cc2
-    qts = qtest_init("-device pvpanic -action panic=none");
a83cc2
+    qts = qtest_init("-M q35 -device pvpanic -action panic=none");
a83cc2
 
a83cc2
     val = qtest_inb(qts, 0x505);
a83cc2
     g_assert_cmpuint(val, ==, 3);
a83cc2
@@ -40,7 +40,8 @@ static void test_panic(void)
a83cc2
     QDict *response, *data;
a83cc2
     QTestState *qts;
a83cc2
 
a83cc2
-    qts = qtest_init("-device pvpanic -action panic=pause");
a83cc2
+    /* RHEL: Use q35 */
a83cc2
+    qts = qtest_init("-M q35 -device pvpanic -action panic=pause");
a83cc2
 
a83cc2
     val = qtest_inb(qts, 0x505);
a83cc2
     g_assert_cmpuint(val, ==, 3);
a83cc2
-- 
a83cc2
2.27.0
a83cc2