369 lines
15 KiB
Diff
369 lines
15 KiB
Diff
|
From a2e5218bbe2e39712e06c5d8a51f836807c1cae9 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||
|
Date: Wed, 3 Jul 2024 13:25:47 +0100
|
||
|
Subject: Add downstream aarch64 versioned 'virt' machine types
|
||
|
|
||
|
Adding changes to add RHEL machine types for aarch64 architecture.
|
||
|
|
||
|
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||
|
---
|
||
|
Rebase notes (6.1.0):
|
||
|
- Use CONFIG_TPM check when using TPM structures
|
||
|
- Add support for default_bus_bypass_iommu
|
||
|
- ea4c0b32d9 arm/virt: Register highmem and gic-version as class properties
|
||
|
- 895e1fa86a hw/arm/virt: Add 8.5 and 9.0 machine types and remove older ones
|
||
|
|
||
|
Rebase notes (7.0.0):
|
||
|
- Added dtb-kaslr-seed option
|
||
|
- Set no_tcg_lpa2 to true
|
||
|
|
||
|
Rebase notes (7.1.0):
|
||
|
- replace dtb_kaslr_seed by dtb_randomness
|
||
|
- Updated dtb_randomness comment
|
||
|
|
||
|
Rebase notes (7.2.0):
|
||
|
- Disabled cortex-a35
|
||
|
|
||
|
Rebase notes (8.0.0):
|
||
|
- Moved changed code from target/arm/helper.c to target/arm/arm-qmp-cmds.c
|
||
|
|
||
|
Rebase notes (8.1.0):
|
||
|
- Added setting default_nic
|
||
|
|
||
|
Rebase notes (9.0.0 rc0):
|
||
|
- call arm_virt_compat_set on rhel type class_init
|
||
|
|
||
|
Rebase notes (9.1.0 rc0):
|
||
|
- Merge copy+pasted base machine definition back with upstream
|
||
|
base machine definition to reduce RHEL delta, as is done with
|
||
|
other targets
|
||
|
- Convert to new DEFINE_VIRT_MACHINE macros
|
||
|
|
||
|
Rebase notes (9.1.0 rc1):
|
||
|
- do not remove cpu_valid_types
|
||
|
|
||
|
Rebase notes (9.1.0 rc2):
|
||
|
- Use preprocessing to remove unwanted code instead of removal
|
||
|
|
||
|
Merged patches (6.2.0):
|
||
|
- 9a3d4fde0e hw/arm/virt: Remove 9.0 machine type
|
||
|
- f7d04d6695 hw: arm: virt: Add hw_compat_rhel_8_5 to 8.5 machine type
|
||
|
|
||
|
Merged patches (7.0.0):
|
||
|
- 3b82be3dd3 redhat: virt-rhel8.5.0: Update machine type compatibility for QEMU 6.2.0 update
|
||
|
- c354a86c9b hw/arm/virt: Register "iommu" as a class property
|
||
|
- c1a2630dc9 hw/arm/virt: Register "its" as a class property
|
||
|
- 9d8c61dc93 hw/arm/virt: Rename default_bus_bypass_iommu
|
||
|
- a1d1b6eeb6 hw/arm/virt: Expose the 'RAS' option
|
||
|
- 47f8fe1b82 hw/arm/virt: Add 9.0 machine type and remove 8.5 one
|
||
|
- ed2346788f hw/arm/virt: Check no_tcg_its and minor style changes
|
||
|
|
||
|
Merged patches (7.0.0):
|
||
|
- f79b31bdef hw/arm/virt: Remove the dtb-kaslr-seed machine option
|
||
|
- b6fca85f4a hw/arm/virt: Fix missing initialization in instance/class_init()
|
||
|
|
||
|
Merged patches (7.1.0):
|
||
|
- ac97dd4f9f RHEL-only: AArch64: Drop unsupported CPU types
|
||
|
- e9c0a70664 target/arm: deprecate named CPU models
|
||
|
|
||
|
Merged patches (7.2.0):
|
||
|
- 0be2889fa2 Introduce upstream 7.0 compat changes (only applicable parts)
|
||
|
|
||
|
Merged patches (8.0.0):
|
||
|
- c1a21266d8 redhat: aarch64: add rhel9.2.0 virt machine type
|
||
|
- d97cd7c513 redhat: fix virt-rhel9.2.0 compat props
|
||
|
|
||
|
Merged patches (8.1.0):
|
||
|
- bd5d81d286 Add RHEL 9.2.0 compat structure (arm part)
|
||
|
- c07f666086 hw/arm/virt: Validate cluster and NUMA node boundary for RHEL machines
|
||
|
|
||
|
Merged patches (8.2.0):
|
||
|
- 4ee284aca9 Add machine types compat bits. (partial)
|
||
|
|
||
|
Merged patches (9.0.0 rc0):
|
||
|
- 117068376a hw/arm/virt: Fix compats
|
||
|
- 8bcccfabc4 hw/arm/virt: Add properties to disable high memory regions
|
||
|
0005a8b93a hw/arm/virt: deprecate virt-rhel9.{0,2}.0 machine types
|
||
|
|
||
|
Merged patches (9.1.0 rc0):
|
||
|
- 043ad5ce97 Add upstream compatibility bits (partial)
|
||
|
- 092cb319ea hw/arm/virt: Fix spurious call to arm_virt_compat_set()
|
||
|
---
|
||
|
hw/arm/virt.c | 101 ++++++++++++++++++++++++++++++++++++++++----------
|
||
|
1 file changed, 81 insertions(+), 20 deletions(-)
|
||
|
|
||
|
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||
|
index 5396e7cb24..903c0f2e9f 100644
|
||
|
--- a/hw/arm/virt.c
|
||
|
+++ b/hw/arm/virt.c
|
||
|
@@ -90,6 +90,22 @@ static GlobalProperty arm_virt_compat[] = {
|
||
|
};
|
||
|
static const size_t arm_virt_compat_len = G_N_ELEMENTS(arm_virt_compat);
|
||
|
|
||
|
+/*
|
||
|
+ * This variable is for changes to properties that are RHEL specific,
|
||
|
+ * different to the current upstream and to be applied to the latest
|
||
|
+ * machine type. They may be overriden by older machine compats.
|
||
|
+ *
|
||
|
+ * virtio-net-pci variant romfiles are not needed because edk2 does
|
||
|
+ * fully support the pxe boot. Besides virtio romfiles are not shipped
|
||
|
+ * on rhel/aarch64.
|
||
|
+ */
|
||
|
+GlobalProperty arm_rhel_compat[] = {
|
||
|
+ {"virtio-net-pci", "romfile", "" },
|
||
|
+ {"virtio-net-pci-transitional", "romfile", "" },
|
||
|
+ {"virtio-net-pci-non-transitional", "romfile", "" },
|
||
|
+};
|
||
|
+const size_t arm_rhel_compat_len = G_N_ELEMENTS(arm_rhel_compat);
|
||
|
+
|
||
|
/*
|
||
|
* This cannot be called from the virt_machine_class_init() because
|
||
|
* TYPE_VIRT_MACHINE is abstract and mc->compat_props g_ptr_array_new()
|
||
|
@@ -99,6 +115,8 @@ static void arm_virt_compat_set(MachineClass *mc)
|
||
|
{
|
||
|
compat_props_add(mc->compat_props, arm_virt_compat,
|
||
|
arm_virt_compat_len);
|
||
|
+ compat_props_add(mc->compat_props, arm_rhel_compat,
|
||
|
+ arm_rhel_compat_len);
|
||
|
}
|
||
|
|
||
|
#define DEFINE_VIRT_MACHINE_IMPL(latest, ...) \
|
||
|
@@ -109,10 +127,11 @@ static void arm_virt_compat_set(MachineClass *mc)
|
||
|
MachineClass *mc = MACHINE_CLASS(oc); \
|
||
|
arm_virt_compat_set(mc); \
|
||
|
MACHINE_VER_SYM(options, virt, __VA_ARGS__)(mc); \
|
||
|
- mc->desc = "QEMU " MACHINE_VER_STR(__VA_ARGS__) " ARM Virtual Machine"; \
|
||
|
+ mc->desc = "RHEL " MACHINE_VER_STR(__VA_ARGS__) " ARM Virtual Machine"; \
|
||
|
MACHINE_VER_DEPRECATION(__VA_ARGS__); \
|
||
|
if (latest) { \
|
||
|
mc->alias = "virt"; \
|
||
|
+ mc->is_default = 1; \
|
||
|
} \
|
||
|
} \
|
||
|
static const TypeInfo MACHINE_VER_SYM(info, virt, __VA_ARGS__) = \
|
||
|
@@ -128,10 +147,10 @@ static void arm_virt_compat_set(MachineClass *mc)
|
||
|
} \
|
||
|
type_init(MACHINE_VER_SYM(register, virt, __VA_ARGS__));
|
||
|
|
||
|
-#define DEFINE_VIRT_MACHINE_AS_LATEST(major, minor) \
|
||
|
- DEFINE_VIRT_MACHINE_IMPL(true, major, minor)
|
||
|
-#define DEFINE_VIRT_MACHINE(major, minor) \
|
||
|
- DEFINE_VIRT_MACHINE_IMPL(false, major, minor)
|
||
|
+#define DEFINE_VIRT_MACHINE_AS_LATEST(major, minor, micro) \
|
||
|
+ DEFINE_VIRT_MACHINE_IMPL(true, major, minor, micro)
|
||
|
+#define DEFINE_VIRT_MACHINE(major, minor, micro) \
|
||
|
+ DEFINE_VIRT_MACHINE_IMPL(false, major, minor, micro)
|
||
|
|
||
|
|
||
|
/* Number of external interrupt lines to configure the GIC with */
|
||
|
@@ -2434,6 +2453,7 @@ static void machvirt_init(MachineState *machine)
|
||
|
qemu_add_machine_init_done_notifier(&vms->machine_done);
|
||
|
}
|
||
|
|
||
|
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||
|
static bool virt_get_secure(Object *obj, Error **errp)
|
||
|
{
|
||
|
VirtMachineState *vms = VIRT_MACHINE(obj);
|
||
|
@@ -2461,6 +2481,7 @@ static void virt_set_virt(Object *obj, bool value, Error **errp)
|
||
|
|
||
|
vms->virt = value;
|
||
|
}
|
||
|
+#endif /* disabled for RHEL */
|
||
|
|
||
|
static bool virt_get_highmem(Object *obj, Error **errp)
|
||
|
{
|
||
|
@@ -2476,6 +2497,7 @@ static void virt_set_highmem(Object *obj, bool value, Error **errp)
|
||
|
vms->highmem = value;
|
||
|
}
|
||
|
|
||
|
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||
|
static bool virt_get_compact_highmem(Object *obj, Error **errp)
|
||
|
{
|
||
|
VirtMachineState *vms = VIRT_MACHINE(obj);
|
||
|
@@ -2489,6 +2511,7 @@ static void virt_set_compact_highmem(Object *obj, bool value, Error **errp)
|
||
|
|
||
|
vms->highmem_compact = value;
|
||
|
}
|
||
|
+#endif /* disabled for RHEL */
|
||
|
|
||
|
static bool virt_get_highmem_redists(Object *obj, Error **errp)
|
||
|
{
|
||
|
@@ -2547,6 +2570,7 @@ static void virt_set_its(Object *obj, bool value, Error **errp)
|
||
|
vms->its = value;
|
||
|
}
|
||
|
|
||
|
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||
|
static bool virt_get_dtb_randomness(Object *obj, Error **errp)
|
||
|
{
|
||
|
VirtMachineState *vms = VIRT_MACHINE(obj);
|
||
|
@@ -2560,6 +2584,7 @@ static void virt_set_dtb_randomness(Object *obj, bool value, Error **errp)
|
||
|
|
||
|
vms->dtb_randomness = value;
|
||
|
}
|
||
|
+#endif /* disabled for RHEL */
|
||
|
|
||
|
static char *virt_get_oem_id(Object *obj, Error **errp)
|
||
|
{
|
||
|
@@ -2643,6 +2668,7 @@ static void virt_set_ras(Object *obj, bool value, Error **errp)
|
||
|
vms->ras = value;
|
||
|
}
|
||
|
|
||
|
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||
|
static bool virt_get_mte(Object *obj, Error **errp)
|
||
|
{
|
||
|
VirtMachineState *vms = VIRT_MACHINE(obj);
|
||
|
@@ -2656,6 +2682,7 @@ static void virt_set_mte(Object *obj, bool value, Error **errp)
|
||
|
|
||
|
vms->mte = value;
|
||
|
}
|
||
|
+#endif /* disabled for RHEL */
|
||
|
|
||
|
static char *virt_get_gic_version(Object *obj, Error **errp)
|
||
|
{
|
||
|
@@ -3063,16 +3090,10 @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
|
||
|
NULL
|
||
|
};
|
||
|
|
||
|
+ mc->family = "virt-rhel-Z";
|
||
|
mc->init = machvirt_init;
|
||
|
- /* Start with max_cpus set to 512, which is the maximum supported by KVM.
|
||
|
- * The value may be reduced later when we have more information about the
|
||
|
- * configuration of the particular instance.
|
||
|
- */
|
||
|
- mc->max_cpus = 512;
|
||
|
- machine_class_allow_dynamic_sysbus_dev(mc, TYPE_VFIO_CALXEDA_XGMAC);
|
||
|
- machine_class_allow_dynamic_sysbus_dev(mc, TYPE_VFIO_AMD_XGBE);
|
||
|
- machine_class_allow_dynamic_sysbus_dev(mc, TYPE_RAMFB_DEVICE);
|
||
|
- machine_class_allow_dynamic_sysbus_dev(mc, TYPE_VFIO_PLATFORM);
|
||
|
+ /* Maximum supported VCPU count for all virt-rhel* machines */
|
||
|
+ mc->max_cpus = 384;
|
||
|
#ifdef CONFIG_TPM
|
||
|
machine_class_allow_dynamic_sysbus_dev(mc, TYPE_TPM_TIS_SYSBUS);
|
||
|
#endif
|
||
|
@@ -3083,11 +3104,7 @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
|
||
|
mc->minimum_page_bits = 12;
|
||
|
mc->possible_cpu_arch_ids = virt_possible_cpu_arch_ids;
|
||
|
mc->cpu_index_to_instance_props = virt_cpu_index_to_props;
|
||
|
-#ifdef CONFIG_TCG
|
||
|
- mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a15");
|
||
|
-#else
|
||
|
- mc->default_cpu_type = ARM_CPU_TYPE_NAME("max");
|
||
|
-#endif
|
||
|
+ mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a57");
|
||
|
mc->valid_cpu_types = valid_cpu_types;
|
||
|
mc->get_default_cpu_node_id = virt_get_default_cpu_node_id;
|
||
|
mc->kvm_type = virt_kvm_type;
|
||
|
@@ -3111,6 +3128,7 @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
|
||
|
NULL, NULL);
|
||
|
object_class_property_set_description(oc, "acpi",
|
||
|
"Enable ACPI");
|
||
|
+#if 0 /* disabled for RHEL */
|
||
|
object_class_property_add_bool(oc, "secure", virt_get_secure,
|
||
|
virt_set_secure);
|
||
|
object_class_property_set_description(oc, "secure",
|
||
|
@@ -3123,6 +3141,7 @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
|
||
|
"Set on/off to enable/disable emulating a "
|
||
|
"guest CPU which implements the ARM "
|
||
|
"Virtualization Extensions");
|
||
|
+#endif /* disabled for RHEL */
|
||
|
|
||
|
object_class_property_add_bool(oc, "highmem", virt_get_highmem,
|
||
|
virt_set_highmem);
|
||
|
@@ -3130,12 +3149,14 @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
|
||
|
"Set on/off to enable/disable using "
|
||
|
"physical address space above 32 bits");
|
||
|
|
||
|
+#if 0 /* disabled for RHEL */
|
||
|
object_class_property_add_bool(oc, "compact-highmem",
|
||
|
virt_get_compact_highmem,
|
||
|
virt_set_compact_highmem);
|
||
|
object_class_property_set_description(oc, "compact-highmem",
|
||
|
"Set on/off to enable/disable compact "
|
||
|
"layout for high memory regions");
|
||
|
+#endif /* disabled for RHEL */
|
||
|
|
||
|
object_class_property_add_bool(oc, "highmem-redists",
|
||
|
virt_get_highmem_redists,
|
||
|
@@ -3163,7 +3184,7 @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
|
||
|
virt_set_gic_version);
|
||
|
object_class_property_set_description(oc, "gic-version",
|
||
|
"Set GIC version. "
|
||
|
- "Valid values are 2, 3, 4, host and max");
|
||
|
+ "Valid values are 2, 3, host and max");
|
||
|
|
||
|
object_class_property_add_str(oc, "iommu", virt_get_iommu, virt_set_iommu);
|
||
|
object_class_property_set_description(oc, "iommu",
|
||
|
@@ -3183,11 +3204,13 @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
|
||
|
"Set on/off to enable/disable reporting host memory errors "
|
||
|
"to a KVM guest using ACPI and guest external abort exceptions");
|
||
|
|
||
|
+#if 0 /* disabled for RHEL */
|
||
|
object_class_property_add_bool(oc, "mte", virt_get_mte, virt_set_mte);
|
||
|
object_class_property_set_description(oc, "mte",
|
||
|
"Set on/off to enable/disable emulating a "
|
||
|
"guest CPU which implements the ARM "
|
||
|
"Memory Tagging Extension");
|
||
|
+#endif /* disabled for RHEL */
|
||
|
|
||
|
object_class_property_add_bool(oc, "its", virt_get_its,
|
||
|
virt_set_its);
|
||
|
@@ -3195,6 +3218,7 @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
|
||
|
"Set on/off to enable/disable "
|
||
|
"ITS instantiation");
|
||
|
|
||
|
+#if 0 /* disabled for RHEL */
|
||
|
object_class_property_add_bool(oc, "dtb-randomness",
|
||
|
virt_get_dtb_randomness,
|
||
|
virt_set_dtb_randomness);
|
||
|
@@ -3207,6 +3231,7 @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
|
||
|
virt_set_dtb_randomness);
|
||
|
object_class_property_set_description(oc, "dtb-kaslr-seed",
|
||
|
"Deprecated synonym of dtb-randomness");
|
||
|
+#endif /* disabled for RHEL */
|
||
|
|
||
|
object_class_property_add_str(oc, "x-oem-id",
|
||
|
virt_get_oem_id,
|
||
|
@@ -3554,3 +3579,39 @@ static void virt_machine_2_6_options(MachineClass *mc)
|
||
|
}
|
||
|
DEFINE_VIRT_MACHINE(2, 6)
|
||
|
#endif /* disabled for RHEL */
|
||
|
+
|
||
|
+static void virt_rhel_machine_9_4_0_options(MachineClass *mc)
|
||
|
+{
|
||
|
+ compat_props_add(mc->compat_props, hw_compat_rhel_9_5, hw_compat_rhel_9_5_len);
|
||
|
+}
|
||
|
+DEFINE_VIRT_MACHINE_AS_LATEST(9, 4, 0)
|
||
|
+
|
||
|
+static void virt_rhel_machine_9_2_0_options(MachineClass *mc)
|
||
|
+{
|
||
|
+ virt_rhel_machine_9_4_0_options(mc);
|
||
|
+
|
||
|
+ compat_props_add(mc->compat_props, hw_compat_rhel_9_4, hw_compat_rhel_9_4_len);
|
||
|
+ compat_props_add(mc->compat_props, hw_compat_rhel_9_3, hw_compat_rhel_9_3_len);
|
||
|
+ compat_props_add(mc->compat_props, hw_compat_rhel_9_2, hw_compat_rhel_9_2_len);
|
||
|
+
|
||
|
+ /* RHEL 9.4 is the first supported release */
|
||
|
+ mc->deprecation_reason =
|
||
|
+ "machine types for versions prior to 9.4 are deprecated";
|
||
|
+}
|
||
|
+DEFINE_VIRT_MACHINE(9, 2, 0)
|
||
|
+
|
||
|
+static void virt_rhel_machine_9_0_0_options(MachineClass *mc)
|
||
|
+{
|
||
|
+ VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
|
||
|
+
|
||
|
+ virt_rhel_machine_9_2_0_options(mc);
|
||
|
+
|
||
|
+ compat_props_add(mc->compat_props, hw_compat_rhel_9_1, hw_compat_rhel_9_1_len);
|
||
|
+ compat_props_add(mc->compat_props, hw_compat_rhel_9_0, hw_compat_rhel_9_0_len);
|
||
|
+
|
||
|
+ /* Disable FEAT_LPA2 since old kernels (<= v5.12) don't boot with that feature */
|
||
|
+ vmc->no_tcg_lpa2 = true;
|
||
|
+ /* Compact layout for high memory regions was introduced with 9.2.0 */
|
||
|
+ vmc->no_highmem_compact = true;
|
||
|
+}
|
||
|
+DEFINE_VIRT_MACHINE(9, 0, 0)
|
||
|
--
|
||
|
2.39.3
|
||
|
|