[pve-devel] [PATCH pve-qemu 1/1] patch: add 0001-add-cpu-models-x86-64-abi.patch
Alexandre Derumier
aderumier at odiso.com
Wed May 17 09:02:45 CEST 2023
Signed-off-by: Alexandre Derumier <aderumier at odiso.com>
---
.../pve/0001-add-cpu-models-x86-64-abi.patch | 272 ++++++++++++++++++
debian/patches/series | 1 +
2 files changed, 273 insertions(+)
create mode 100644 debian/patches/pve/0001-add-cpu-models-x86-64-abi.patch
diff --git a/debian/patches/pve/0001-add-cpu-models-x86-64-abi.patch b/debian/patches/pve/0001-add-cpu-models-x86-64-abi.patch
new file mode 100644
index 0000000..e98f862
--- /dev/null
+++ b/debian/patches/pve/0001-add-cpu-models-x86-64-abi.patch
@@ -0,0 +1,272 @@
+From 7d9ff48a96a7613a15e5427bc8987358e5529e45 Mon Sep 17 00:00:00 2001
+From: Alexandre Derumier <aderumier at odiso.com>
+Date: Tue, 16 May 2023 11:36:19 +0200
+Subject: [PATCH] target/i386: define CPU models to model x86-64 ABI levels
+
+https://lists.gnu.org/archive/html/qemu-devel/2021-05/msg07807.html
+
+To paraphrase:
+
+https://developers.redhat.com/blog/2021/01/05/building-red-hat-enterprise-linux-9-for-the-x86-64-v2-microarchitecture-level/
+
+In 2020, AMD, Intel, Red Hat, and SUSE worked together to define
+three microarchitecture levels on top of the historical x86-64
+baseline:
+
+ * x86-64: original x86_64 baseline instruction set
+ * x86-64-v2: vector instructions up to Streaming SIMD
+ Extensions 4.2 (SSE4.2) and Supplemental
+ Streaming SIMD Extensions 3 (SSSE3), the
+ POPCNT instruction, and CMPXCHG16B
+ * x86-64-v3: vector instructions up to AVX2, MOVBE,
+ and additional bit-manipulation instructions.
+ * x86-64-v4: vector instructions from some of the
+ AVX-512 variants.
+
+This list of features is defined in the doc at:
+
+ https://gitlab.com/x86-psABIs/x86-64-ABI/
+
+QEMU has historically defaulted to the "qemu64" CPU model on
+x86_64 targets, which is approximately the x86-64 baseline
+ABI, with 'SVM' added.
+
+It is thought it might be desirable if QEMU could provide CPU models
+that closely correspond to the ABI levels, while offering portability
+across the maximum number of physical CPUs.
+
+Historically we've found that defining CPU models with an arbitrary
+combination of CPU features can be problematic, as some guest OS
+will not check all features they use, and instead assume that if
+they see feature "XX", then "YY" will always exist. This is reasonable
+in bare metal, but subject to breakage in virtualization.
+
+Thus in defining the CPU models for the ABI levels, this patch attempted
+to base them off an existing CPU model.
+
+While each x86-64-abiNNN has a designated vendor, they are designed
+to be vendor agnostic models. ie they are capable of running on any
+physical x86_64 CPU model that satisfies the ABI level. eg although
+the x86-64-abi2 model is based on Nehalem, it should be able to run
+guests on an Opteron_G4/G5/EPYC host, since those CPUs support the
+features required by the x86-64 v2 ABI.
+
+More precisely the models were defined as:
+
+ * x86-64-abi1: close match for Opteron_G1, minus
+ vme
+ * x86-64-abi2: perfect match for Nehalem
+ * x86-64-abi3: close match of Haswell-noTSX, minus
+ aes pcid erms invpcid tsc-deadline
+ x2apic pclmulqdq
+ * x86-64-abi4: close match of Skylake-Server-noTSX-IBRS, minus
+ spec-ctrl
+
+None of the CPU models declare any VMX/SVM capability features.
+IOW, even if a "vmx"/"svm" flag is added, it will still be unsafe
+to attempt to live migrate the L1 guest if there are any L2
+guests running with hardware virtualization.
+
+Given their vendor agnostic design, these CPU models are primarily
+thought tobe useful as the default CPU model for machine types.
+QEMU upstream is quite conservative in mandating new hardware features,
+but a downstream vendor may choose to mandate a newer x86-64 ABI level
+for downstream only machine types.
+
+Note that TCG is not capable of supporting the 2 newest ABI levels
+currently due to missing features:
+
+* x86-64-abi3:
+
+ CPUID.01H:ECX.fma [bit 12]
+ CPUID.01H:ECX.avx [bit 28]
+ CPUID.01H:ECX.f16c [bit 29]
+ CPUID.07H:EBX.avx2 [bit 5]
+
+* x86-64-abi4:
+
+ CPUID.01H:ECX.pcid [bit 17]
+ CPUID.01H:ECX.x2apic [bit 21]
+ CPUID.01H:ECX.tsc-deadline [bit 24]
+ CPUID.07H:EBX.invpcid [bit 10]
+ CPUID.07H:EBX.avx512f [bit 16]
+ CPUID.07H:EBX.avx512dq [bit 17]
+ CPUID.07H:EBX.rdseed [bit 18]
+ CPUID.07H:EBX.avx512cd [bit 28]
+ CPUID.07H:EBX.avx512bw [bit 30]
+ CPUID.07H:EBX.avx512vl [bit 31]
+ CPUID.80000001H:ECX.3dnowprefetch [bit 8]
+ CPUID.0DH:EAX.xsavec [bit 1]
+
+---
+ target/i386/cpu.c | 162 ++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 162 insertions(+)
+
+diff --git a/target/i386/cpu.c b/target/i386/cpu.c
+index 22b681ca3..294c20c53 100644
+--- a/target/i386/cpu.c
++++ b/target/i386/cpu.c
+@@ -1853,6 +1861,160 @@ static const X86CPUDefinition builtin_x86_defs[] = {
+ .xlevel = 0x8000000A,
+ .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION,
+ },
++ /*
++ * These first few CPU models are designed to satisfy the
++ * x86_64 ABI levels defined in:
++ *
++ * https://gitlab.com/x86-psABIs/x86-64-ABI/
++ *
++ * They were constructed as follows:
++ *
++ * - Find all the CPU models which can satisfy the ABI
++ * - Calculate the lowest common denominator (LCD) of these
++ * models' features
++ * - Find the named model most closely matching the LCD
++ * - Strip its features back to the LCD
++ *
++ * The above spec uses the "x86-64-vNN" naming convention.
++ * This clashes with the "vNN" suffix QEMU uses for versioning.
++ * Thus we use "abiNNN" as a suffix.
++ */
++ {
++ /*
++ * Derived from Opteron_G1, minus
++ * vme
++ */
++ .name = "x86-64-abi1",
++ .level = 5,
++ .vendor = CPUID_VENDOR_AMD,
++ .family = 15,
++ .model = 6,
++ .stepping = 1,
++ .features[FEAT_1_EDX] =
++ CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
++ CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
++ CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
++ CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
++ CPUID_DE | CPUID_FP87,
++ .features[FEAT_1_ECX] =
++ CPUID_EXT_SSE3,
++ .features[FEAT_8000_0001_EDX] =
++ CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
++ .xlevel = 0x80000008,
++ .model_id = "QEMU x86-64 baseline ABI",
++ },
++ {
++ /* Derived from Nehalem */
++ .name = "x86-64-abi2",
++ .level = 11,
++ .vendor = CPUID_VENDOR_INTEL,
++ .family = 6,
++ .model = 26,
++ .stepping = 3,
++ .features[FEAT_1_EDX] =
++ CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
++ CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
++ CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
++ CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
++ CPUID_DE | CPUID_FP87,
++ .features[FEAT_1_ECX] =
++ CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 | CPUID_EXT_AES |
++ CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_SSE3,
++ .features[FEAT_8000_0001_EDX] =
++ CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
++ .features[FEAT_8000_0001_ECX] =
++ CPUID_EXT3_LAHF_LM,
++ .xlevel = 0x80000008,
++ .model_id = "QEMU x86-64-v2 ABI",
++ },
++ {
++ /*
++ * Derived from Haswell-noTSX, minus
++ * pcid erms invpcid tsc-deadline x2apic pclmulqdq
++ */
++ .name = "x86-64-abi3",
++ .level = 0xd,
++ .vendor = CPUID_VENDOR_INTEL,
++ .family = 6,
++ .model = 60,
++ .stepping = 1,
++ .features[FEAT_1_EDX] =
++ CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
++ CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
++ CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
++ CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
++ CPUID_DE | CPUID_FP87,
++ .features[FEAT_1_ECX] =
++ CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
++ CPUID_EXT_POPCNT | CPUID_EXT_SSE42 |
++ CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
++ CPUID_EXT_SSE3 |
++ CPUID_EXT_FMA | CPUID_EXT_MOVBE |
++ CPUID_EXT_F16C | CPUID_EXT_RDRAND,
++ .features[FEAT_8000_0001_EDX] =
++ CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
++ CPUID_EXT2_SYSCALL,
++ .features[FEAT_8000_0001_ECX] =
++ CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM,
++ .features[FEAT_7_0_EBX] =
++ CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
++ CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
++ CPUID_7_0_EBX_BMI2,
++ .features[FEAT_XSAVE] =
++ CPUID_XSAVE_XSAVEOPT,
++ .features[FEAT_6_EAX] =
++ CPUID_6_EAX_ARAT,
++ .xlevel = 0x80000008,
++ .model_id = "QEMU x86-64-v3 ABI",
++ },
++ {
++ /*
++ * Derived from Skylake-Server-noTSX-IBRS, minus:
++ * spec-ctrl
++ */
++ .name = "x86-64-abi4",
++ .level = 0xd,
++ .vendor = CPUID_VENDOR_INTEL,
++ .family = 6,
++ .model = 85,
++ .stepping = 4,
++ .features[FEAT_1_EDX] =
++ CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
++ CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
++ CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
++ CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
++ CPUID_DE | CPUID_FP87,
++ .features[FEAT_1_ECX] =
++ CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
++ CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
++ CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
++ CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
++ CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
++ CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
++ .features[FEAT_8000_0001_EDX] =
++ CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
++ CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
++ .features[FEAT_8000_0001_ECX] =
++ CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
++ .features[FEAT_7_0_EBX] =
++ CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
++ CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
++ CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
++ CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
++ CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB |
++ CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
++ CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD |
++ CPUID_7_0_EBX_AVX512VL,
++ .features[FEAT_7_0_ECX] =
++ CPUID_7_0_ECX_PKU,
++ .features[FEAT_XSAVE] =
++ CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
++ CPUID_XSAVE_XGETBV1,
++ .features[FEAT_6_EAX] =
++ CPUID_6_EAX_ARAT,
++ .xlevel = 0x80000008,
++ .model_id = "QEMU x86-64-v4 ABI",
++ },
+ {
+ .name = "phenom",
+ .level = 5,
+--
+2.30.2
+
diff --git a/debian/patches/series b/debian/patches/series
index 4e8ddd6..5273fab 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -94,3 +94,4 @@ pve/0059-vma-create-support-64KiB-unaligned-input-images.patch
pve/0060-vma-create-avoid-triggering-assertion-in-error-case.patch
pve/0061-block-alloc-track-avoid-premature-break.patch
pve/0062-PVE-Backup-allow-passing-max-workers-performance-set.patch
+pve/0001-add-cpu-models-x86-64-abi.patch
\ No newline at end of file
--
2.30.2
More information about the pve-devel
mailing list