qemu-kvm/0010-Add-x86_64-machine-typ...

1209 lines
40 KiB
Diff

From 3c0a8f41da22fe3b88b6f4811b58b0fec6d09d8e Mon Sep 17 00:00:00 2001
From: Miroslav Rezanina <mrezanin@redhat.com>
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 <mrezanin@redhat.com>
Rebase changes (weekly-190111):
- Use upstream compat handling
Rebase notes (3.1.0):
- Removed xsave changes
Merged patches (weekly-190104):
- f4dc802 pc: 7.5 compat entries
- 456ed3e pc: PC_RHEL7_6_COMPAT
- 04119ee pc: Add compat for pc-i440fx-rhel7.6.0 machine type
- b3b3687 pc: Add pc-q35-8.0.0 machine type
- 8d46fc6 pc: Add x-migrate-smi-count=off to PC_RHEL7_6_COMPAT
- 1de7949 kvm: clear out KVM_ASYNC_PF_DELIVERY_AS_PF_VMEXIT for older machine types
Merged patches (weekly-190301):
- 18cf0d7 target/i386: Disable MPX support on named CPU models (partialy)
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
---
hw/i386/acpi-build.c | 3 +
hw/i386/pc.c | 645 ++++++++++++++++++++++++++++++++++++++++++-
hw/i386/pc_piix.c | 200 +++++++++++++-
hw/i386/pc_q35.c | 114 +++++++-
include/hw/boards.h | 2 +
include/hw/i386/pc.h | 27 ++
target/i386/cpu.c | 9 +-
target/i386/kvm.c | 4 +
8 files changed, 997 insertions(+), 7 deletions(-)
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index 416da318ae..4cad5645b2 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -190,6 +190,9 @@ static void acpi_get_pm_info(AcpiPmInfo *pm)
pm->fadt.reset_reg = r;
pm->fadt.reset_val = 0xf;
pm->fadt.flags |= 1 << ACPI_FADT_F_RESET_REG_SUP;
+ if (object_property_get_bool(lpc,
+ "__com.redhat_force-rev1-fadt", NULL))
+ pm->fadt.rev = 1;
pm->cpu_hp_io_base = ICH9_CPU_HOTPLUG_IO_BASE;
}
assert(obj);
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index f2c15bf1f2..03497eed9a 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -350,6 +350,643 @@ GlobalProperty pc_compat_1_4[] = {
};
const size_t pc_compat_1_4_len = G_N_ELEMENTS(pc_compat_1_4);
+/* 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[] = {
+ { /* PC_RHEL_COMPAT */
+ .driver = TYPE_X86_CPU,
+ .property = "host-phys-bits",
+ .value = "on",
+ },
+ { /* PC_RHEL_COMPAT bz 1508330 */
+ .driver = "vfio-pci",
+ .property = "x-no-geforce-quirks",
+ .value = "on",
+ },
+};
+const size_t pc_rhel_compat_len = G_N_ELEMENTS(pc_rhel_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_RHEL7_6_COMPAT from PC_COMPAT_3_0 */
+ .driver = TYPE_X86_CPU,
+ .property = "x-hv-synic-kvm-only",
+ .value = "on",
+ },{ /* PC_RHEL7_6_COMPAT from PC_COMPAT_3_0 */
+ .driver = "Skylake-Server" "-" TYPE_X86_CPU,
+ .property = "pku",
+ .value = "off",
+ },{ /* PC_RHEL7_6_COMPAT from PC_COMPAT_3_0 */
+ .driver = "Skylake-Server-IBRS" "-" TYPE_X86_CPU,
+ .property = "pku",
+ .value = "off",
+ },{ /* PC_RHEL7_6_COMPAT from PC_COMPAT_2_11 */
+ .driver = TYPE_X86_CPU,
+ .property = "x-migrate-smi-count",
+ .value = "off",
+ },{ /* PC_RHEL7_6_COMPAT from pc_compat_3_1 */
+ .driver = "Skylake-Client" "-" TYPE_X86_CPU,
+ .property = "mpx",
+ .value = "on",
+ },{ /* PC_RHEL7_6_COMPAT from pc_compat_3_1 */
+ .driver = "Skylake-Client-IBRS" "-" TYPE_X86_CPU,
+ .property = "mpx",
+ .value = "on",
+ },{ /* PC_RHEL7_6_COMPAT from pc_compat_3_1 */
+ .driver = "Skylake-Server" "-" TYPE_X86_CPU,
+ .property = "mpx",
+ .value = "on",
+ },{ /* PC_RHEL7_6_COMPAT from pc_compat_3_1 */
+ .driver = "Skylake-Server-IBRS" "-" TYPE_X86_CPU,
+ .property = "mpx",
+ .value = "on",
+ },{ /* PC_RHEL7_6_COMPAT from pc_compat_3_1 */
+ .driver = "Cascadelake-Server" "-" TYPE_X86_CPU,
+ .property = "mpx",
+ .value = "on",
+ },{ /* PC_RHEL7_6_COMPAT from pc_compat_3_1 */
+ .driver = "Icelake-Client" "-" TYPE_X86_CPU,
+ .property = "mpx",
+ .value = "on",
+ },{ /* PC_RHEL7_6_COMPAT from pc_compat_3_1 */
+ .driver = "Icelake-Server" "-" TYPE_X86_CPU,
+ .property = "mpx",
+ .value = "on",
+ },
+};
+const size_t pc_rhel_7_6_compat_len = G_N_ELEMENTS(pc_rhel_7_6_compat);
+
+/* Similar to PC_COMPAT_2_11 + PC_COMPAT_2_10, but:
+ * - x-hv-max-vps was backported to 7.5
+ * - x-pci-hole64-fix was backported to 7.5
+ */
+GlobalProperty pc_rhel_7_5_compat[] = {
+ { /* PC_RHEL7_5_COMPAT from PC_COMPAT_2_11 */
+ .driver = "Skylake-Server" "-" TYPE_X86_CPU,
+ .property = "clflushopt",
+ .value = "off",
+ },{ /* PC_RHEL7_5_COMPAT from PC_COMPAT_2_12 */
+ .driver = TYPE_X86_CPU,
+ .property = "legacy-cache",
+ .value = "on",
+ },{ /* PC_RHEL7_5_COMPAT from PC_COMPAT_2_12 */
+ .driver = TYPE_X86_CPU,
+ .property = "topoext",
+ .value = "off",
+ },{ /* PC_RHEL7_5_COMPAT from PC_COMPAT_2_12 */
+ .driver = "EPYC-" TYPE_X86_CPU,
+ .property = "xlevel",
+ .value = stringify(0x8000000a),
+ },{ /* PC_RHEL7_5_COMPAT from PC_COMPAT_2_12 */
+ .driver = "EPYC-IBPB-" TYPE_X86_CPU,
+ .property = "xlevel",
+ .value = stringify(0x8000000a),
+ },
+};
+const size_t pc_rhel_7_5_compat_len = G_N_ELEMENTS(pc_rhel_7_5_compat);
+
+
+GlobalProperty pc_rhel_7_4_compat[] = {
+ { /* PC_RHEL7_4_COMPAT from PC_COMPAT_2_9 */
+ .driver = "mch",
+ .property = "extended-tseg-mbytes",
+ .value = stringify(0),
+ },
+ { /* PC_RHEL7_4_COMPAT bz 1489800 */
+ .driver = "ICH9-LPC",
+ .property = "__com.redhat_force-rev1-fadt",
+ .value = "on",
+ },
+ { /* PC_RHEL7_4_COMPAT from PC_COMPAT_2_10 */
+ .driver = "i440FX-pcihost",
+ .property = "x-pci-hole64-fix",
+ .value = "off",
+ },
+ { /* PC_RHEL7_4_COMPAT from PC_COMPAT_2_10 */
+ .driver = "q35-pcihost",
+ .property = "x-pci-hole64-fix",
+ .value = "off",
+ },
+ { /* PC_RHEL7_4_COMPAT from PC_COMPAT_2_10 */
+ .driver = TYPE_X86_CPU,
+ .property = "x-hv-max-vps",
+ .value = "0x40",
+ },
+};
+const size_t pc_rhel_7_4_compat_len = G_N_ELEMENTS(pc_rhel_7_4_compat);
+
+GlobalProperty pc_rhel_7_3_compat[] = {
+ { /* PC_RHEL7_3_COMPAT from PC_COMPAT_2_8 */
+ .driver = "kvmclock",
+ .property = "x-mach-use-reliable-get-clock",
+ .value = "off",
+ },
+ { /* PC_RHEL7_3_COMPAT from PC_COMPAT_2_7 */
+ .driver = TYPE_X86_CPU,
+ .property = "l3-cache",
+ .value = "off",
+ },
+ { /* PC_RHEL7_3_COMPAT from PC_COMPAT_2_7 */
+ .driver = TYPE_X86_CPU,
+ .property = "full-cpuid-auto-level",
+ .value = "off",
+ },
+ { /* PC_RHEL7_3_COMPAT from PC_COMPAT_2_7 */
+ .driver = "Opteron_G3" "-" TYPE_X86_CPU,
+ .property = "family",
+ .value = "15",
+ },
+ { /* PC_RHEL7_3_COMPAT from PC_COMPAT_2_7 */
+ .driver = "Opteron_G3" "-" TYPE_X86_CPU,
+ .property = "model",
+ .value = "6",
+ },
+ { /* PC_RHEL7_3_COMPAT from PC_COMPAT_2_7 */
+ .driver = "Opteron_G3" "-" TYPE_X86_CPU,
+ .property = "stepping",
+ .value = "1",
+ },
+ { /* PC_RHEL7_3_COMPAT from PC_COMPAT_2_7 */
+ .driver = "isa-pcspk",
+ .property = "migrate",
+ .value = "off",
+ },
+ { /* PC_RHEL7_3_COMPAT from PC_COMPAT_2_6 */
+ .driver = TYPE_X86_CPU,
+ .property = "cpuid-0xb",
+ .value = "off",
+ },
+ { /* PC_RHEL7_3_COMPAT from PC_COMPAT_2_8 */
+ .driver = "ICH9-LPC",
+ .property = "x-smi-broadcast",
+ .value = "off",
+ },
+ { /* PC_RHEL7_3_COMPAT from PC_COMPAT_2_8 */
+ .driver = TYPE_X86_CPU,
+ .property = "vmware-cpuid-freq",
+ .value = "off",
+ },
+ { /* PC_RHEL7_3_COMPAT from PC_COMPAT_2_8 */
+ .driver = "Haswell-" TYPE_X86_CPU,
+ .property = "stepping",
+ .value = "1",
+ },
+ {/* PC_RHEL7_3_COMPAT from PC_COMPAT_2_3 added in 2.9 */
+ .driver = TYPE_X86_CPU,
+ .property = "kvm-no-smi-migration",
+ .value = "on",
+ },
+};
+const size_t pc_rhel_7_3_compat_len = G_N_ELEMENTS(pc_rhel_7_3_compat);
+
+GlobalProperty pc_rhel_7_2_compat[] = {
+ {
+ .driver = "phenom" "-" TYPE_X86_CPU,
+ .property = "rdtscp",
+ .value = "off",
+ },
+ { /* PC_RHEL7_2_COMPAT */
+ .driver = "qemu64" "-" TYPE_X86_CPU,
+ .property = "sse4a",
+ .value = "on",
+ },
+ { /* PC_RHEL7_2_COMPAT */
+ .driver = "qemu64" "-" TYPE_X86_CPU,
+ .property = "abm",
+ .value = "on",
+ },
+ { /* PC_RHEL7_2_COMPAT */
+ .driver = "Haswell-" TYPE_X86_CPU,
+ .property = "abm",
+ .value = "off",
+ },
+ { /* PC_RHEL7_2_COMPAT (copied from the entry above) */
+ .driver = "Haswell-IBRS" "-" TYPE_X86_CPU,
+ .property = "abm",
+ .value = "off",
+ },
+ { /* PC_RHEL7_2_COMPAT */
+ .driver = "Haswell-noTSX-" TYPE_X86_CPU,
+ .property = "abm",
+ .value = "off",
+ },
+ { /* PC_RHEL7_2_COMPAT (copied from the entry above) */
+ .driver = "Haswell-noTSX-IBRS" "-" TYPE_X86_CPU,
+ .property = "abm",
+ .value = "off",
+ },
+ { /* PC_RHEL7_2_COMPAT */
+ .driver = "Broadwell-" TYPE_X86_CPU,
+ .property = "abm",
+ .value = "off",
+ },
+ { /* PC_RHEL7_2_COMPAT (copied from the entry above) */
+ .driver = "Broadwell-IBRS" "-" TYPE_X86_CPU,
+ .property = "abm",
+ .value = "off",
+ },
+ { /* PC_RHEL7_2_COMPAT */
+ .driver = "Broadwell-noTSX-" TYPE_X86_CPU,
+ .property = "abm",
+ .value = "off",
+ },
+ { /* PC_RHEL7_2_COMPAT (copied from the entry above) */
+ .driver = "Broadwell-noTSX-IBRS" "-" TYPE_X86_CPU,
+ .property = "abm",
+ .value = "off",
+ },
+ { /* PC_RHEL7_2_COMPAT */
+ .driver = "host" "-" TYPE_X86_CPU,
+ .property = "host-cache-info",
+ .value = "on",
+ },
+ { /* PC_RHEL7_2_COMPAT */
+ .driver = TYPE_X86_CPU,
+ .property = "check",
+ .value = "off",
+ },
+ { /* PC_RHEL7_2_COMPAT */
+ .driver = "qemu32" "-" TYPE_X86_CPU,
+ .property = "popcnt",
+ .value = "on",
+ },
+ { /* PC_RHEL7_2_COMPAT */
+ .driver = TYPE_X86_CPU,
+ .property = "arat",
+ .value = "off",
+ },
+ { /* PC_RHEL7_2_COMPAT */
+ .driver = "usb-redir",
+ .property = "streams",
+ .value = "off",
+ },
+ { /* PC_RHEL7_2_COMPAT */
+ .driver = TYPE_X86_CPU,
+ .property = "fill-mtrr-mask",
+ .value = "off",
+ },
+ { /* PC_RHEL7_2_COMPAT */
+ .driver = "apic-common",
+ .property = "legacy-instance-id",
+ .value = "on",
+ },
+};
+const size_t pc_rhel_7_2_compat_len = G_N_ELEMENTS(pc_rhel_7_2_compat);
+
+GlobalProperty pc_rhel_7_1_compat[] = {
+ {
+ .driver = "kvm64" "-" TYPE_X86_CPU,
+ .property = "vme",
+ .value = "off",
+ },
+ {
+ .driver = "kvm32" "-" TYPE_X86_CPU,
+ .property = "vme",
+ .value = "off",
+ },
+ {
+ .driver = "Conroe" "-" TYPE_X86_CPU,
+ .property = "vme",
+ .value = "off",
+ },
+ {
+ .driver = "Penryn" "-" TYPE_X86_CPU,
+ .property = "vme",
+ .value = "off",
+ },
+ {
+ .driver = "Nehalem" "-" TYPE_X86_CPU,
+ .property = "vme",
+ .value = "off",
+ },
+ { /* PC_RHEL7_1_COMPAT (copied from the entry above) */
+ .driver = "Nehalem-IBRS" "-" TYPE_X86_CPU,
+ .property = "vme",
+ .value = "off",
+ },
+ {
+ .driver = "Westmere" "-" TYPE_X86_CPU,
+ .property = "vme",
+ .value = "off",
+ },
+ { /* PC_RHEL7_1_COMPAT (copied from the entry above) */
+ .driver = "Westmere-IBRS" "-" TYPE_X86_CPU,
+ .property = "vme",
+ .value = "off",
+ },
+ {
+ .driver = "SandyBridge" "-" TYPE_X86_CPU,
+ .property = "vme",
+ .value = "off",
+ },
+ { /* PC_RHEL7_1_COMPAT (copied from the entry above) */
+ .driver = "SandyBridge-IBRS" "-" TYPE_X86_CPU,
+ .property = "vme",
+ .value = "off",
+ },
+ {
+ .driver = "Haswell" "-" TYPE_X86_CPU,
+ .property = "vme",
+ .value = "off",
+ },
+ { /* PC_RHEL7_1_COMPAT (copied from the entry above) */
+ .driver = "Haswell-IBRS" "-" TYPE_X86_CPU,
+ .property = "vme",
+ .value = "off",
+ },
+ {
+ .driver = "Broadwell" "-" TYPE_X86_CPU,
+ .property = "vme",
+ .value = "off",
+ },
+ { /* PC_RHEL7_1_COMPAT (copied from the entry above) */
+ .driver = "Broadwell-IBRS" "-" TYPE_X86_CPU,
+ .property = "vme",
+ .value = "off",
+ },
+ {
+ .driver = "Opteron_G1" "-" TYPE_X86_CPU,
+ .property = "vme",
+ .value = "off",
+ },
+ {
+ .driver = "Opteron_G2" "-" TYPE_X86_CPU,
+ .property = "vme",
+ .value = "off",
+ },
+ {
+ .driver = "Opteron_G3" "-" TYPE_X86_CPU,
+ .property = "vme",
+ .value = "off",
+ },
+ {
+ .driver = "Opteron_G4" "-" TYPE_X86_CPU,
+ .property = "vme",
+ .value = "off",
+ },
+ {
+ .driver = "Opteron_G5" "-" TYPE_X86_CPU,
+ .property = "vme",
+ .value = "off",
+ },
+ {
+ .driver = "Haswell" "-" TYPE_X86_CPU,
+ .property = "f16c",
+ .value = "off",
+ },
+ { /* PC_RHEL7_1_COMPAT (copied from the entry above) */
+ .driver = "Haswell-IBRS" "-" TYPE_X86_CPU,
+ .property = "f16c",
+ .value = "off",
+ },
+ {
+ .driver = "Haswell" "-" TYPE_X86_CPU,
+ .property = "rdrand",
+ .value = "off",
+ },
+ { /* PC_RHEL7_1_COMPAT (copied from the entry above) */
+ .driver = "Haswell-IBRS" "-" TYPE_X86_CPU,
+ .property = "rdrand",
+ .value = "off",
+ },
+ {
+ .driver = "Broadwell" "-" TYPE_X86_CPU,
+ .property = "f16c",
+ .value = "off",
+ },
+ { /* PC_RHEL7_1_COMPAT (copied from the entry above) */
+ .driver = "Broadwell-IBRS" "-" TYPE_X86_CPU,
+ .property = "f16c",
+ .value = "off",
+ },
+ {
+ .driver = "Broadwell" "-" TYPE_X86_CPU,
+ .property = "rdrand",
+ .value = "off",
+ },
+ { /* PC_RHEL7_1_COMPAT (copied from the entry above) */
+ .driver = "Broadwell-IBRS" "-" TYPE_X86_CPU,
+ .property = "rdrand",
+ .value = "off",
+ },
+ {
+ .driver = "coreduo" "-" TYPE_X86_CPU,
+ .property = "vmx",
+ .value = "on",
+ },
+ {
+ .driver = "core2duo" "-" TYPE_X86_CPU,
+ .property = "vmx",
+ .value = "on",
+ },
+ { /* PC_RHEL7_1_COMPAT */
+ .driver = "qemu64" "-" TYPE_X86_CPU,
+ .property = "min-level",
+ .value = stringify(4),
+ },{ /* PC_RHEL7_1_COMPAT */
+ .driver = "kvm64" "-" TYPE_X86_CPU,
+ .property = "min-level",
+ .value = stringify(5),
+ },{ /* PC_RHEL7_1_COMPAT */
+ .driver = "pentium3" "-" TYPE_X86_CPU,
+ .property = "min-level",
+ .value = stringify(2),
+ },{ /* PC_RHEL7_1_COMPAT */
+ .driver = "n270" "-" TYPE_X86_CPU,
+ .property = "min-level",
+ .value = stringify(5),
+ },{ /* PC_RHEL7_1_COMPAT */
+ .driver = "Conroe" "-" TYPE_X86_CPU,
+ .property = "min-level",
+ .value = stringify(4),
+ },{ /* PC_RHEL7_1_COMPAT */
+ .driver = "Penryn" "-" TYPE_X86_CPU,
+ .property = "min-level",
+ .value = stringify(4),
+ },{ /* PC_RHEL7_1_COMPAT */
+ .driver = "Nehalem" "-" TYPE_X86_CPU,
+ .property = "min-level",
+ .value = stringify(4),
+ },{ /* PC_RHEL7_1_COMPAT */
+ .driver = "n270" "-" TYPE_X86_CPU,
+ .property = "min-xlevel",
+ .value = stringify(0x8000000a),
+ },{ /* PC_RHEL7_1_COMPAT */
+ .driver = "Penryn" "-" TYPE_X86_CPU,
+ .property = "min-xlevel",
+ .value = stringify(0x8000000a),
+ },{ /* PC_RHEL7_1_COMPAT */
+ .driver = "Conroe" "-" TYPE_X86_CPU,
+ .property = "min-xlevel",
+ .value = stringify(0x8000000a),
+ },{ /* PC_RHEL7_1_COMPAT */
+ .driver = "Nehalem" "-" TYPE_X86_CPU,
+ .property = "min-xlevel",
+ .value = stringify(0x8000000a),
+ },{ /* PC_RHEL7_1_COMPAT */
+ .driver = "Westmere" "-" TYPE_X86_CPU,
+ .property = "min-xlevel",
+ .value = stringify(0x8000000a),
+ },{ /* PC_RHEL7_1_COMPAT */
+ .driver = "SandyBridge" "-" TYPE_X86_CPU,
+ .property = "min-xlevel",
+ .value = stringify(0x8000000a),
+ },{ /* PC_RHEL7_1_COMPAT */
+ .driver = "IvyBridge" "-" TYPE_X86_CPU,
+ .property = "min-xlevel",
+ .value = stringify(0x8000000a),
+ },{ /* PC_RHEL7_1_COMPAT */
+ .driver = "Haswell" "-" TYPE_X86_CPU,
+ .property = "min-xlevel",
+ .value = stringify(0x8000000a),
+ },{ /* PC_RHEL7_1_COMPAT */
+ .driver = "Haswell-noTSX" "-" TYPE_X86_CPU,
+ .property = "min-xlevel",
+ .value = stringify(0x8000000a),
+ },{ /* PC_RHEL7_1_COMPAT */
+ .driver = "Broadwell" "-" TYPE_X86_CPU,
+ .property = "min-xlevel",
+ .value = stringify(0x8000000a),
+ },{ /* PC_RHEL7_1_COMPAT */
+ .driver = "Broadwell-noTSX" "-" TYPE_X86_CPU,
+ .property = "min-xlevel",
+ .value = stringify(0x8000000a),
+ },
+};
+const size_t pc_rhel_7_1_compat_len = G_N_ELEMENTS(pc_rhel_7_1_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.
+ */
+
+/*
+ * RHEL-7 is based on QEMU 1.5.3, so this needs the PC_COMPAT_*
+ * between our base and 1.5, less stuff backported to RHEL-7.0
+ * (usb-device.msos-desc), less stuff for devices we changed
+ * (qemu64-x86_64-cpu) or don't support (hpet, pci-serial-2x,
+ * pci-serial-4x) in 7.0.
+ */
+GlobalProperty pc_rhel_7_0_compat[] = {
+ {
+ .driver = "virtio-scsi-pci",
+ .property = "any_layout",
+ .value = "off",
+ },{
+ .driver = "PIIX4_PM",
+ .property = "memory-hotplug-support",
+ .value = "off",
+ },{
+ .driver = "apic",
+ .property = "version",
+ .value = stringify(0x11),
+ },{
+ .driver = "nec-usb-xhci",
+ .property = "superspeed-ports-first",
+ .value = "off",
+ },{
+ .driver = "nec-usb-xhci",
+ .property = "force-pcie-endcap",
+ .value = "on",
+ },{
+ .driver = "pci-serial",
+ .property = "prog_if",
+ .value = stringify(0),
+ },{
+ .driver = "virtio-net-pci",
+ .property = "guest_announce",
+ .value = "off",
+ },{
+ .driver = "ICH9-LPC",
+ .property = "memory-hotplug-support",
+ .value = "off",
+ },{
+ .driver = "xio3130-downstream",
+ .property = COMPAT_PROP_PCP,
+ .value = "off",
+ },{
+ .driver = "ioh3420",
+ .property = COMPAT_PROP_PCP,
+ .value = "off",
+ },{
+ .driver = "PIIX4_PM",
+ .property = "acpi-pci-hotplug-with-bridge-support",
+ .value = "off",
+ },{
+ .driver = "e1000",
+ .property = "mitigation",
+ .value = "off",
+ },{
+ .driver = "virtio-net-pci",
+ .property = "ctrl_guest_offloads",
+ .value = "off",
+ },
+ {
+ .driver = "Conroe" "-" TYPE_X86_CPU,
+ .property = "x2apic",
+ .value = "on",
+ },
+ {
+ .driver = "Penryn" "-" TYPE_X86_CPU,
+ .property = "x2apic",
+ .value = "on",
+ },
+ {
+ .driver = "Nehalem" "-" TYPE_X86_CPU,
+ .property = "x2apic",
+ .value = "on",
+ },
+ { /* PC_RHEL7_0_COMPAT (copied from the entry above) */
+ .driver = "Nehalem-IBRS" "-" TYPE_X86_CPU,
+ .property = "x2apic",
+ .value = "on",
+ },
+ {
+ .driver = "Westmere" "-" TYPE_X86_CPU,
+ .property = "x2apic",
+ .value = "on",
+ },
+ { /* PC_RHEL7_0_COMPAT (copied from the entry above) */
+ .driver = "Westmere-IBRS" "-" TYPE_X86_CPU,
+ .property = "x2apic",
+ .value = "on",
+ },
+ {
+ .driver = "Opteron_G1" "-" TYPE_X86_CPU,
+ .property = "x2apic",
+ .value = "on",
+ },
+ {
+ .driver = "Opteron_G2" "-" TYPE_X86_CPU,
+ .property = "x2apic",
+ .value = "on",
+ },
+ {
+ .driver = "Opteron_G3" "-" TYPE_X86_CPU,
+ .property = "x2apic",
+ .value = "on",
+ },
+ {
+ .driver = "Opteron_G4" "-" TYPE_X86_CPU,
+ .property = "x2apic",
+ .value = "on",
+ },
+ {
+ .driver = "Opteron_G5" "-" TYPE_X86_CPU,
+ .property = "x2apic",
+ .value = "on",
+ }
+};
+const size_t pc_rhel_7_0_compat_len = G_N_ELEMENTS(pc_rhel_7_0_compat);
+
void gsi_handler(void *opaque, int n, int level)
{
GSIState *s = opaque;
@@ -1814,7 +2451,8 @@ void pc_memory_init(PCMachineState *pcms,
option_rom_mr = g_malloc(sizeof(*option_rom_mr));
memory_region_init_ram(option_rom_mr, NULL, "pc.rom", PC_ROM_SIZE,
&error_fatal);
- if (pcmc->pci_enabled) {
+ /* RH difference: See bz 1489800, explicitly make ROM ro */
+ if (pcmc->pc_rom_ro) {
memory_region_set_readonly(option_rom_mr, true);
}
memory_region_add_subregion_overlap(rom_memory,
@@ -2731,6 +3369,8 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
pcmc->linuxboot_dma_enabled = true;
pcmc->pvh_enabled = true;
assert(!mc->get_hotplug_handler);
+ pcmc->pc_rom_ro = true;
+ mc->async_pf_vmexit_disable = false;
mc->get_hotplug_handler = pc_get_hotplug_handler;
mc->cpu_index_to_instance_props = pc_cpu_index_to_props;
mc->get_default_cpu_node_id = pc_get_default_cpu_node_id;
@@ -2740,7 +3380,8 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
mc->default_boot_order = "cad";
mc->hot_add_cpu = pc_hot_add_cpu;
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;
hc->pre_plug = pc_machine_device_pre_plug_cb;
hc->plug = pc_machine_device_plug_cb;
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 8ad8e885c6..37907fe76a 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -50,6 +50,7 @@
#include "cpu.h"
#include "qapi/error.h"
#include "qemu/error-report.h"
+#include "migration/migration.h"
#ifdef CONFIG_XEN
#include <xen/hvm/hvm_info_table.h>
#include "hw/xen/xen_pt.h"
@@ -170,8 +171,8 @@ static void pc_init1(MachineState *machine,
if (pcmc->smbios_defaults) {
MachineClass *mc = MACHINE_GET_CLASS(machine);
/* These values are guest ABI, do not change */
- smbios_set_defaults("QEMU", "Standard PC (i440FX + PIIX, 1996)",
- mc->name, pcmc->smbios_legacy_mode,
+ smbios_set_defaults("Red Hat", "KVM",
+ mc->desc, pcmc->smbios_legacy_mode,
pcmc->smbios_uuid_encoded,
SMBIOS_ENTRY_POINT_21);
}
@@ -310,6 +311,7 @@ static void pc_init1(MachineState *machine,
* 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)
{
PCMachineState *pcms = PC_MACHINE(machine);
@@ -998,3 +1000,197 @@ static void xenfv_machine_options(MachineClass *m)
DEFINE_PC_MACHINE(xenfv, "xenfv", pc_xen_hvm_init,
xenfv_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";
+ pcmc->default_nic_model = "e1000";
+ m->default_display = "std";
+ m->no_parallel = 1;
+ compat_props_add(m->compat_props, pc_rhel_compat, pc_rhel_compat_len);
+ m->alias = "pc";
+ m->is_default = 1;
+}
+
+static void pc_init_rhel760(MachineState *machine)
+{
+ pc_init1(machine, TYPE_I440FX_PCI_HOST_BRIDGE, \
+ TYPE_I440FX_PCI_DEVICE);
+}
+
+static void pc_machine_rhel760_options(MachineClass *m)
+{
+ pc_machine_rhel7_options(m);
+ m->desc = "RHEL 7.6.0 PC (i440FX + PIIX, 1996)";
+ 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(rhel760, "pc-i440fx-rhel7.6.0", pc_init_rhel760,
+ pc_machine_rhel760_options);
+
+static void pc_init_rhel750(MachineState *machine)
+{
+ pc_init1(machine, TYPE_I440FX_PCI_HOST_BRIDGE, \
+ TYPE_I440FX_PCI_DEVICE);
+}
+
+static void pc_machine_rhel750_options(MachineClass *m)
+{
+ pc_machine_rhel760_options(m);
+ m->alias = NULL;
+ m->is_default = 0;
+ m->desc = "RHEL 7.5.0 PC (i440FX + PIIX, 1996)";
+ m->auto_enable_numa_with_memhp = false;
+ compat_props_add(m->compat_props, hw_compat_rhel_7_5, hw_compat_rhel_7_5_len);
+ compat_props_add(m->compat_props, pc_rhel_7_5_compat, pc_rhel_7_5_compat_len);
+}
+
+DEFINE_PC_MACHINE(rhel750, "pc-i440fx-rhel7.5.0", pc_init_rhel750,
+ pc_machine_rhel750_options);
+
+static void pc_init_rhel740(MachineState *machine)
+{
+ pc_init1(machine, TYPE_I440FX_PCI_HOST_BRIDGE, \
+ TYPE_I440FX_PCI_DEVICE);
+}
+
+static void pc_machine_rhel740_options(MachineClass *m)
+{
+ PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
+ pc_machine_rhel750_options(m);
+ m->desc = "RHEL 7.4.0 PC (i440FX + PIIX, 1996)";
+ m->numa_auto_assign_ram = numa_legacy_auto_assign_ram;
+ pcmc->pc_rom_ro = false;
+ compat_props_add(m->compat_props, hw_compat_rhel_7_4, hw_compat_rhel_7_4_len);
+ compat_props_add(m->compat_props, pc_rhel_7_4_compat, pc_rhel_7_4_compat_len);
+}
+
+DEFINE_PC_MACHINE(rhel740, "pc-i440fx-rhel7.4.0", pc_init_rhel740,
+ pc_machine_rhel740_options);
+
+static void pc_init_rhel730(MachineState *machine)
+{
+ pc_init1(machine, TYPE_I440FX_PCI_HOST_BRIDGE, \
+ TYPE_I440FX_PCI_DEVICE);
+}
+
+static void pc_machine_rhel730_options(MachineClass *m)
+{
+ PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
+ pc_machine_rhel740_options(m);
+ m->desc = "RHEL 7.3.0 PC (i440FX + PIIX, 1996)";
+ pcmc->linuxboot_dma_enabled = false;
+ compat_props_add(m->compat_props, hw_compat_rhel_7_3, hw_compat_rhel_7_3_len);
+ compat_props_add(m->compat_props, pc_rhel_7_3_compat, pc_rhel_7_3_compat_len);
+}
+
+DEFINE_PC_MACHINE(rhel730, "pc-i440fx-rhel7.3.0", pc_init_rhel730,
+ pc_machine_rhel730_options);
+
+
+static void pc_init_rhel720(MachineState *machine)
+{
+ pc_init1(machine, TYPE_I440FX_PCI_HOST_BRIDGE, \
+ TYPE_I440FX_PCI_DEVICE);
+}
+
+static void pc_machine_rhel720_options(MachineClass *m)
+{
+ PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
+ pc_machine_rhel730_options(m);
+ m->desc = "RHEL 7.2.0 PC (i440FX + PIIX, 1996)";
+ /* From pc_i440fx_2_5_machine_options */
+ pcmc->save_tsc_khz = false;
+ m->legacy_fw_cfg_order = 1;
+ /* Note: broken_reserved_end was already in 7.2 */
+ /* From pc_i440fx_2_6_machine_options */
+ pcmc->legacy_cpu_hotplug = true;
+ compat_props_add(m->compat_props, hw_compat_rhel_7_2, hw_compat_rhel_7_2_len);
+ compat_props_add(m->compat_props, pc_rhel_7_2_compat, pc_rhel_7_2_compat_len);
+}
+
+DEFINE_PC_MACHINE(rhel720, "pc-i440fx-rhel7.2.0", pc_init_rhel720,
+ pc_machine_rhel720_options);
+
+static void pc_compat_rhel710(MachineState *machine)
+{
+ PCMachineState *pcms = PC_MACHINE(machine);
+ PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
+
+ /* From pc_compat_2_2 */
+ pcmc->rsdp_in_ram = false;
+ machine->suppress_vmdesc = true;
+
+ /* From pc_compat_2_1 */
+ pcmc->smbios_uuid_encoded = false;
+ x86_cpu_change_kvm_default("svm", NULL);
+ pcmc->enforce_aligned_dimm = false;
+
+ /* Disable all the extra subsections that were added in 2.2 */
+ migrate_pre_2_2 = true;
+
+ /* From pc_i440fx_2_4_machine_options */
+ pcmc->broken_reserved_end = true;
+}
+
+static void pc_init_rhel710(MachineState *machine)
+{
+ pc_compat_rhel710(machine);
+ pc_init1(machine, TYPE_I440FX_PCI_HOST_BRIDGE, \
+ TYPE_I440FX_PCI_DEVICE);
+}
+
+static void pc_machine_rhel710_options(MachineClass *m)
+{
+ pc_machine_rhel720_options(m);
+ m->family = "pc_piix_Y";
+ m->desc = "RHEL 7.1.0 PC (i440FX + PIIX, 1996)";
+ m->default_display = "cirrus";
+ compat_props_add(m->compat_props, hw_compat_rhel_7_1, hw_compat_rhel_7_1_len);
+ compat_props_add(m->compat_props, pc_rhel_7_1_compat, pc_rhel_7_1_compat_len);
+}
+
+DEFINE_PC_MACHINE(rhel710, "pc-i440fx-rhel7.1.0", pc_init_rhel710,
+ pc_machine_rhel710_options);
+
+static void pc_compat_rhel700(MachineState *machine)
+{
+ PCMachineState *pcms = PC_MACHINE(machine);
+ PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
+
+ pc_compat_rhel710(machine);
+
+ /* Upstream enables it for everyone, we're a little more selective */
+ x86_cpu_change_kvm_default("x2apic", NULL);
+ x86_cpu_change_kvm_default("svm", NULL);
+ pcmc->legacy_acpi_table_size = 6418; /* see pc_compat_2_0() */
+ pcmc->smbios_legacy_mode = true;
+ pcmc->has_reserved_memory = false;
+ migrate_cve_2014_5263_xhci_fields = true;
+}
+
+static void pc_init_rhel700(MachineState *machine)
+{
+ pc_compat_rhel700(machine);
+ pc_init1(machine, TYPE_I440FX_PCI_HOST_BRIDGE, \
+ TYPE_I440FX_PCI_DEVICE);
+}
+
+static void pc_machine_rhel700_options(MachineClass *m)
+{
+ pc_machine_rhel710_options(m);
+ m->family = "pc_piix_Y";
+ m->desc = "RHEL 7.0.0 PC (i440FX + PIIX, 1996)";
+ compat_props_add(m->compat_props, pc_rhel_7_0_compat, pc_rhel_7_0_compat_len);
+}
+
+DEFINE_PC_MACHINE(rhel700, "pc-i440fx-rhel7.0.0", pc_init_rhel700,
+ pc_machine_rhel700_options);
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index 372c6b73be..4b7df48919 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -198,8 +198,8 @@ static void pc_q35_init(MachineState *machine)
if (pcmc->smbios_defaults) {
/* These values are guest ABI, do not change */
- smbios_set_defaults("QEMU", "Standard PC (Q35 + ICH9, 2009)",
- mc->name, pcmc->smbios_legacy_mode,
+ smbios_set_defaults("Red Hat", "KVM",
+ mc->desc, pcmc->smbios_legacy_mode,
pcmc->smbios_uuid_encoded,
SMBIOS_ENTRY_POINT_21);
}
@@ -347,6 +347,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);
@@ -507,3 +508,112 @@ 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->default_nic_model = "e1000e";
+ m->family = "pc_q35_Z";
+ m->default_machine_opts = "firmware=bios-256k.bin";
+ m->default_display = "std";
+ m->no_floppy = 1;
+ m->no_parallel = 1;
+ machine_class_allow_dynamic_sysbus_dev(m, TYPE_SYS_BUS_DEVICE);
+ m->alias = "q35";
+ m->max_cpus = 384;
+ compat_props_add(m->compat_props, pc_rhel_compat, pc_rhel_compat_len);
+}
+
+static void pc_q35_init_rhel800(MachineState *machine)
+{
+ pc_q35_init(machine);
+}
+
+static void pc_q35_machine_rhel800_options(MachineClass *m)
+{
+ pc_q35_machine_rhel_options(m);
+ m->desc = "RHEL-8.0.0 PC (Q35 + ICH9, 2009)";
+}
+
+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);
+
+static void pc_q35_init_rhel750(MachineState *machine)
+{
+ pc_q35_init(machine);
+}
+
+static void pc_q35_machine_rhel750_options(MachineClass *m)
+{
+ PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
+ pc_q35_machine_rhel760_options(m);
+ m->alias = NULL;
+ m->desc = "RHEL-7.5.0 PC (Q35 + ICH9, 2009)";
+ m->auto_enable_numa_with_memhp = false;
+ pcmc->default_nic_model = "e1000";
+ compat_props_add(m->compat_props, hw_compat_rhel_7_5, hw_compat_rhel_7_5_len);
+ compat_props_add(m->compat_props, pc_rhel_7_5_compat, pc_rhel_7_5_compat_len);
+}
+
+DEFINE_PC_MACHINE(q35_rhel750, "pc-q35-rhel7.5.0", pc_q35_init_rhel750,
+ pc_q35_machine_rhel750_options);
+
+static void pc_q35_init_rhel740(MachineState *machine)
+{
+ pc_q35_init(machine);
+}
+
+static void pc_q35_machine_rhel740_options(MachineClass *m)
+{
+ PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
+ pc_q35_machine_rhel750_options(m);
+ m->desc = "RHEL-7.4.0 PC (Q35 + ICH9, 2009)";
+ m->numa_auto_assign_ram = numa_legacy_auto_assign_ram;
+ pcmc->pc_rom_ro = false;
+ compat_props_add(m->compat_props, hw_compat_rhel_7_4, hw_compat_rhel_7_4_len);
+ compat_props_add(m->compat_props, pc_rhel_7_4_compat, pc_rhel_7_4_compat_len);
+}
+
+DEFINE_PC_MACHINE(q35_rhel740, "pc-q35-rhel7.4.0", pc_q35_init_rhel740,
+ pc_q35_machine_rhel740_options);
+
+static void pc_q35_init_rhel730(MachineState *machine)
+{
+ pc_q35_init(machine);
+}
+
+static void pc_q35_machine_rhel730_options(MachineClass *m)
+{
+ PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
+ pc_q35_machine_rhel740_options(m);
+ m->desc = "RHEL-7.3.0 PC (Q35 + ICH9, 2009)";
+ m->max_cpus = 255;
+ pcmc->linuxboot_dma_enabled = false;
+ compat_props_add(m->compat_props, hw_compat_rhel_7_3, hw_compat_rhel_7_3_len);
+ compat_props_add(m->compat_props, pc_rhel_7_3_compat, pc_rhel_7_3_compat_len);
+}
+
+DEFINE_PC_MACHINE(q35_rhel730, "pc-q35-rhel7.3.0", pc_q35_init_rhel730,
+ pc_q35_machine_rhel730_options);
diff --git a/include/hw/boards.h b/include/hw/boards.h
index 456e4a944c..b292365bfa 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -206,6 +206,8 @@ struct MachineClass {
const char **valid_cpu_types;
strList *allowed_dynamic_sysbus_devices;
bool auto_enable_numa_with_memhp;
+ /* RHEL only */
+ bool async_pf_vmexit_disable;
void (*numa_auto_assign_ram)(MachineClass *mc, NodeInfo *nodes,
int nb_nodes, ram_addr_t size);
bool ignore_boot_device_suffixes;
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index ca65ef18af..b066f0a539 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -134,6 +134,9 @@ typedef struct PCMachineClass {
/* use PVH to load kernels that support this feature */
bool pvh_enabled;
+
+ /* RH only, see bz 1489800 */
+ bool pc_rom_ro;
} PCMachineClass;
#define TYPE_PC_MACHINE "generic-pc-machine"
@@ -350,6 +353,30 @@ extern const size_t pc_compat_1_5_len;
extern GlobalProperty pc_compat_1_4[];
extern const size_t pc_compat_1_4_len;
+extern GlobalProperty pc_rhel_compat[];
+extern const size_t pc_rhel_compat_len;
+
+extern GlobalProperty pc_rhel_7_6_compat[];
+extern const size_t pc_rhel_7_6_compat_len;
+
+extern GlobalProperty pc_rhel_7_5_compat[];
+extern const size_t pc_rhel_7_5_compat_len;
+
+extern GlobalProperty pc_rhel_7_4_compat[];
+extern const size_t pc_rhel_7_4_compat_len;
+
+extern GlobalProperty pc_rhel_7_3_compat[];
+extern const size_t pc_rhel_7_3_compat_len;
+
+extern GlobalProperty pc_rhel_7_2_compat[];
+extern const size_t pc_rhel_7_2_compat_len;
+
+extern GlobalProperty pc_rhel_7_1_compat[];
+extern const size_t pc_rhel_7_1_compat_len;
+
+extern GlobalProperty pc_rhel_7_0_compat[];
+extern const size_t pc_rhel_7_0_compat_len;
+
/* Helper for setting model-id for CPU models that changed model-id
* depending on QEMU versions up to QEMU 2.4.
*/
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index 6616303782..6472cd21f8 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -1474,11 +1474,17 @@ static CPUCaches epyc_cache_info = {
static X86CPUDefinition builtin_x86_defs[] = {
{
+ /* qemu64 is the default CPU model for all *-rhel7.* machine-types.
+ * The default on RHEL-6 was cpu64-rhel6.
+ * libvirt assumes that qemu64 is the default for _all_ machine-types,
+ * so we should try to keep qemu64 and cpu64-rhel6 as similar as
+ * possible.
+ */
.name = "qemu64",
.level = 0xd,
.vendor = CPUID_VENDOR_AMD,
.family = 6,
- .model = 6,
+ .model = 13,
.stepping = 3,
.features[FEAT_1_EDX] = CPUID_SSE2 | CPUID_SSE | CPUID_FXSR |
CPUID_MMX | CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV |
@@ -2973,6 +2979,7 @@ static PropValue kvm_default_props[] = {
{ "acpi", "off" },
{ "monitor", "off" },
{ "svm", "off" },
+ { "kvm-pv-unhalt", "on" },
{ NULL, NULL },
};
diff --git a/target/i386/kvm.c b/target/i386/kvm.c
index 3b29ce5c0d..478942187a 100644
--- a/target/i386/kvm.c
+++ b/target/i386/kvm.c
@@ -2373,6 +2373,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);
@@ -2670,6 +2671,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_PV_EOI_EN:
env->pv_eoi_en_msr = msrs[i].data;
--
2.20.1