f788c1346a
- Rebase to QEMU 6.1.0 [bz#1997408] - Resolves: #bz#1997408 (Rebase to QEMU 6.1.0)
575 lines
22 KiB
Diff
575 lines
22 KiB
Diff
From afc727ec3b2ad5a5c4033f25a63c877500b0194d 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 notes (210609):
|
|
- Update qemu64 cpu spec
|
|
|
|
Merged patches (6.1.0 RC1):
|
|
- 59c284ad3b x86: Add x86 rhel8.5 machine types
|
|
- a8868b42fe redhat: x86: Enable 'kvm-asyncpf-int' by default
|
|
|
|
Merged patches (6.1.0):
|
|
- 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)
|
|
---
|
|
hw/i386/pc.c | 114 +++++++++++++++++++++++-
|
|
hw/i386/pc_piix.c | 68 +++++++++++++-
|
|
hw/i386/pc_q35.c | 177 ++++++++++++++++++++++++++++++++++++-
|
|
include/hw/boards.h | 2 +
|
|
include/hw/i386/pc.h | 21 +++++
|
|
target/i386/kvm/kvm-cpu.c | 1 +
|
|
target/i386/kvm/kvm.c | 4 +
|
|
tests/qtest/pvpanic-test.c | 5 +-
|
|
8 files changed, 385 insertions(+), 7 deletions(-)
|
|
|
|
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
|
|
index c2b9d62a35..719cedaa4b 100644
|
|
--- a/hw/i386/pc.c
|
|
+++ b/hw/i386/pc.c
|
|
@@ -362,6 +362,116 @@ 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[] = {
|
|
+ { 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_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;
|
|
@@ -1713,6 +1823,7 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
|
|
pcmc->pvh_enabled = true;
|
|
pcmc->kvmclock_create_always = 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;
|
|
@@ -1724,7 +1835,8 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
|
|
mc->default_boot_order = "cad";
|
|
mc->smp_parse = pc_smp_parse;
|
|
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 eebb4f3141..19d6721f3d 100644
|
|
--- a/hw/i386/pc_piix.c
|
|
+++ b/hw/i386/pc_piix.c
|
|
@@ -51,6 +51,7 @@
|
|
#include "qapi/error.h"
|
|
#include "qemu/error-report.h"
|
|
#include "sysemu/xen.h"
|
|
+#include "migration/migration.h"
|
|
#ifdef CONFIG_XEN
|
|
#include <xen/hvm/hvm_info_table.h>
|
|
#include "hw/xen/xen_pt.h"
|
|
@@ -174,8 +175,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,
|
|
pcmc->smbios_stream_product,
|
|
pcmc->smbios_stream_version,
|
|
@@ -314,6 +315,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)
|
|
{
|
|
X86MachineState *x86ms = X86_MACHINE(machine);
|
|
@@ -937,3 +939,65 @@ 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->default_nic_model = "e1000";
|
|
+ pcmc->pci_root_uid = 0;
|
|
+ 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;
|
|
+}
|
|
+
|
|
+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)
|
|
+{
|
|
+ PCMachineClass *pcmc = PC_MACHINE_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;
|
|
+ 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;
|
|
+ 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 e7724fd02c..8032babda5 100644
|
|
--- a/hw/i386/pc_q35.c
|
|
+++ b/hw/i386/pc_q35.c
|
|
@@ -196,8 +196,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,
|
|
pcmc->smbios_stream_product,
|
|
pcmc->smbios_stream_version,
|
|
@@ -337,6 +337,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);
|
|
@@ -602,3 +603,175 @@ 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";
|
|
+ pcmc->pci_root_uid = 0;
|
|
+ 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);
|
|
+}
|
|
+
|
|
+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_rhel_options(m);
|
|
+ m->desc = "RHEL-8.5.0 PC (Q35 + ICH9, 2009)";
|
|
+ pcmc->smbios_stream_product = "RHEL-AV";
|
|
+ pcmc->smbios_stream_version = "8.5.0";
|
|
+}
|
|
+
|
|
+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)";
|
|
+ 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->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 f5423f351a..a2b1681027 100644
|
|
--- a/include/hw/boards.h
|
|
+++ b/include/hw/boards.h
|
|
@@ -242,6 +242,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 17ad7bfc3a..75b338d66d 100644
|
|
--- a/include/hw/i386/pc.h
|
|
+++ b/include/hw/i386/pc.h
|
|
@@ -277,6 +277,27 @@ 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_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;
|
|
+
|
|
/* 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/kvm/kvm-cpu.c b/target/i386/kvm/kvm-cpu.c
|
|
index d95028018e..7b004065ae 100644
|
|
--- a/target/i386/kvm/kvm-cpu.c
|
|
+++ b/target/i386/kvm/kvm-cpu.c
|
|
@@ -131,6 +131,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 e69abe48e3..4a3077b3f0 100644
|
|
--- a/target/i386/kvm/kvm.c
|
|
+++ b/target/i386/kvm/kvm.c
|
|
@@ -3261,6 +3261,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);
|
|
|
|
@@ -3579,6 +3580,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 6dcad2db49..580c2c43d2 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.27.0
|
|
|