abb18f
From 8f7e267c7b98b378e301519b10aa3d18f0ceb45c Mon Sep 17 00:00:00 2001
abb18f
Message-Id: <8f7e267c7b98b378e301519b10aa3d18f0ceb45c@dist-git>
abb18f
From: Jiri Denemark <jdenemar@redhat.com>
abb18f
Date: Thu, 21 Apr 2022 18:25:15 +0200
abb18f
Subject: [PATCH] cputest: Add some real world baseline tests
abb18f
abb18f
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
abb18f
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
abb18f
(cherry picked from commit 63d633b9a4fc42da7e2acaf45501914607d968a5)
abb18f
abb18f
https://bugzilla.redhat.com/show_bug.cgi?id=2084030
abb18f
abb18f
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
abb18f
---
abb18f
 tests/cputest.c                               | 118 +++++++++++++++---
abb18f
 ...id-baseline-Broadwell-IBRS+Cascadelake.xml |  11 ++
abb18f
 ..._64-cpuid-baseline-Cascadelake+Icelake.xml |  14 +++
abb18f
 ...puid-baseline-Cascadelake+Skylake-IBRS.xml |  12 ++
abb18f
 ..._64-cpuid-baseline-Cascadelake+Skylake.xml |   8 ++
abb18f
 ...-cpuid-baseline-Cooperlake+Cascadelake.xml |  17 +++
abb18f
 ...6_64-cpuid-baseline-Cooperlake+Icelake.xml |  14 +++
abb18f
 .../x86_64-cpuid-baseline-EPYC+Rome.xml       |  13 ++
abb18f
 .../x86_64-cpuid-baseline-Haswell+Skylake.xml |  14 +++
abb18f
 ...-baseline-Haswell-noTSX-IBRS+Broadwell.xml |  14 +++
abb18f
 ...seline-Haswell-noTSX-IBRS+Skylake-IBRS.xml |  14 +++
abb18f
 ...id-baseline-Haswell-noTSX-IBRS+Skylake.xml |  14 +++
abb18f
 .../x86_64-cpuid-baseline-Ryzen+Rome.xml      |  13 ++
abb18f
 ...4-cpuid-baseline-Skylake-Client+Server.xml |   9 ++
abb18f
 14 files changed, 271 insertions(+), 14 deletions(-)
abb18f
 create mode 100644 tests/cputestdata/x86_64-cpuid-baseline-Broadwell-IBRS+Cascadelake.xml
abb18f
 create mode 100644 tests/cputestdata/x86_64-cpuid-baseline-Cascadelake+Icelake.xml
abb18f
 create mode 100644 tests/cputestdata/x86_64-cpuid-baseline-Cascadelake+Skylake-IBRS.xml
abb18f
 create mode 100644 tests/cputestdata/x86_64-cpuid-baseline-Cascadelake+Skylake.xml
abb18f
 create mode 100644 tests/cputestdata/x86_64-cpuid-baseline-Cooperlake+Cascadelake.xml
abb18f
 create mode 100644 tests/cputestdata/x86_64-cpuid-baseline-Cooperlake+Icelake.xml
abb18f
 create mode 100644 tests/cputestdata/x86_64-cpuid-baseline-EPYC+Rome.xml
abb18f
 create mode 100644 tests/cputestdata/x86_64-cpuid-baseline-Haswell+Skylake.xml
abb18f
 create mode 100644 tests/cputestdata/x86_64-cpuid-baseline-Haswell-noTSX-IBRS+Broadwell.xml
abb18f
 create mode 100644 tests/cputestdata/x86_64-cpuid-baseline-Haswell-noTSX-IBRS+Skylake-IBRS.xml
abb18f
 create mode 100644 tests/cputestdata/x86_64-cpuid-baseline-Haswell-noTSX-IBRS+Skylake.xml
abb18f
 create mode 100644 tests/cputestdata/x86_64-cpuid-baseline-Ryzen+Rome.xml
abb18f
 create mode 100644 tests/cputestdata/x86_64-cpuid-baseline-Skylake-Client+Server.xml
abb18f
abb18f
diff --git a/tests/cputest.c b/tests/cputest.c
abb18f
index b939e20718..b39ec7e18b 100644
abb18f
--- a/tests/cputest.c
abb18f
+++ b/tests/cputest.c
abb18f
@@ -58,6 +58,8 @@ struct data {
abb18f
     const char *name;
abb18f
     virDomainCapsCPUModels *models;
abb18f
     const char *modelsName;
abb18f
+    const char **cpus;
abb18f
+    int ncpus;
abb18f
     unsigned int flags;
abb18f
     int result;
abb18f
 };
abb18f
@@ -561,6 +563,60 @@ cpuTestCPUID(bool guest, const void *arg)
abb18f
 }
abb18f
 
abb18f
 
abb18f
+static int
abb18f
+cpuTestCPUIDBaseline(const void *arg)
abb18f
+{
abb18f
+    const struct data *data = arg;
abb18f
+    int ret = -1;
abb18f
+    virCPUDef **cpus = NULL;
abb18f
+    virCPUDef *baseline = NULL;
abb18f
+    g_autofree char *result = NULL;
abb18f
+    size_t i;
abb18f
+
abb18f
+    cpus = g_new0(virCPUDef *, data->ncpus);
abb18f
+    for (i = 0; i < data->ncpus; i++) {
abb18f
+        g_autofree char *name = NULL;
abb18f
+
abb18f
+        name = g_strdup_printf("cpuid-%s-json", data->cpus[i]);
abb18f
+        if (!(cpus[i] = cpuTestLoadXML(data->arch, name)))
abb18f
+            goto cleanup;
abb18f
+    }
abb18f
+
abb18f
+    baseline = virCPUBaseline(data->arch, cpus, data->ncpus, NULL, NULL, false);
abb18f
+    if (!baseline)
abb18f
+        goto cleanup;
abb18f
+
abb18f
+    result = g_strdup_printf("cpuid-baseline-%s", data->name);
abb18f
+
abb18f
+    if (cpuTestCompareXML(data->arch, baseline, result) < 0)
abb18f
+        goto cleanup;
abb18f
+
abb18f
+    for (i = 0; i < data->ncpus; i++) {
abb18f
+        virCPUCompareResult cmp;
abb18f
+
abb18f
+        cmp = virCPUCompare(data->arch, cpus[i], baseline, false);
abb18f
+        if (cmp != VIR_CPU_COMPARE_SUPERSET &&
abb18f
+            cmp != VIR_CPU_COMPARE_IDENTICAL) {
abb18f
+            VIR_TEST_VERBOSE("\nbaseline CPU is incompatible with CPU %zu", i);
abb18f
+            VIR_TEST_VERBOSE("%74s", "... ");
abb18f
+            ret = -1;
abb18f
+            goto cleanup;
abb18f
+        }
abb18f
+    }
abb18f
+
abb18f
+    ret = 0;
abb18f
+
abb18f
+ cleanup:
abb18f
+    if (cpus) {
abb18f
+        for (i = 0; i < data->ncpus; i++)
abb18f
+            virCPUDefFree(cpus[i]);
abb18f
+        VIR_FREE(cpus);
abb18f
+    }
abb18f
+    virCPUDefFree(baseline);
abb18f
+    return ret;
abb18f
+}
abb18f
+
abb18f
+
abb18f
 static int
abb18f
 cpuTestHostCPUID(const void *arg)
abb18f
 {
abb18f
@@ -888,13 +944,13 @@ mymain(void)
abb18f
         goto cleanup;
abb18f
     }
abb18f
 
abb18f
-#define DO_TEST(arch, api, name, host, cpu, \
abb18f
+#define DO_TEST(arch, api, name, host, cpu, cpus, ncpus, \
abb18f
                 models, flags, result) \
abb18f
     do { \
abb18f
         struct data data = { \
abb18f
             arch, host, cpu, models, \
abb18f
             models == NULL ? NULL : #models, \
abb18f
-            flags, result \
abb18f
+            cpus, ncpus, flags, result \
abb18f
         }; \
abb18f
         g_autofree char *testLabel = NULL; \
abb18f
  \
abb18f
@@ -907,12 +963,12 @@ mymain(void)
abb18f
 #define DO_TEST_COMPARE(arch, host, cpu, result) \
abb18f
     DO_TEST(arch, cpuTestCompare, \
abb18f
             host "/" cpu " (" #result ")", \
abb18f
-            host, cpu, NULL, 0, result)
abb18f
+            host, cpu, NULL, 0, NULL, 0, result)
abb18f
 
abb18f
 #define DO_TEST_UPDATE_ONLY(arch, host, cpu) \
abb18f
     DO_TEST(arch, cpuTestUpdate, \
abb18f
             cpu " on " host, \
abb18f
-            host, cpu, NULL, 0, 0)
abb18f
+            host, cpu, NULL, 0, NULL, 0, 0)
abb18f
 
abb18f
 #define DO_TEST_UPDATE(arch, host, cpu, result) \
abb18f
     do { \
abb18f
@@ -930,31 +986,31 @@ mymain(void)
abb18f
             suffix = " (migratable)"; \
abb18f
         label = g_strdup_printf("%s%s", name, suffix); \
abb18f
         DO_TEST(arch, cpuTestBaseline, label, NULL, \
abb18f
-                "baseline-" name, NULL, flags, result); \
abb18f
+                "baseline-" name, NULL, 0, NULL, flags, result); \
abb18f
     } while (0)
abb18f
 
abb18f
 #define DO_TEST_HASFEATURE(arch, host, feature, result) \
abb18f
     DO_TEST(arch, cpuTestHasFeature, \
abb18f
             host "/" feature " (" #result ")", \
abb18f
-            host, feature, NULL, 0, result)
abb18f
+            host, feature, NULL, 0, NULL, 0, result)
abb18f
 
abb18f
 #define DO_TEST_GUESTCPU(arch, host, cpu, models, result) \
abb18f
     DO_TEST(arch, cpuTestGuestCPU, \
abb18f
             host "/" cpu " (" #models ")", \
abb18f
-            host, cpu, models, 0, result)
abb18f
+            host, cpu, NULL, 0, models, 0, result)
abb18f
 
abb18f
 #if WITH_QEMU
abb18f
 # define DO_TEST_JSON(arch, host, json) \
abb18f
     do { \
abb18f
         if (json == JSON_MODELS) { \
abb18f
             DO_TEST(arch, cpuTestGuestCPUID, host, host, \
abb18f
-                    NULL, NULL, 0, 0); \
abb18f
+                    NULL, NULL, 0, NULL, 0, 0); \
abb18f
         } \
abb18f
         if (json != JSON_NONE) { \
abb18f
             DO_TEST(arch, cpuTestJSONCPUID, host, host, \
abb18f
-                    NULL, NULL, json, 0); \
abb18f
+                    NULL, NULL, 0, NULL, json, 0); \
abb18f
             DO_TEST(arch, cpuTestJSONSignature, host, host, \
abb18f
-                    NULL, NULL, 0, 0); \
abb18f
+                    NULL, NULL, 0, NULL, 0, 0); \
abb18f
         } \
abb18f
     } while (0)
abb18f
 #else
abb18f
@@ -964,18 +1020,26 @@ mymain(void)
abb18f
 #define DO_TEST_CPUID(arch, host, json) \
abb18f
     do { \
abb18f
         DO_TEST(arch, cpuTestHostCPUID, host, host, \
abb18f
-                NULL, NULL, 0, 0); \
abb18f
+                NULL, NULL, 0, NULL, 0, 0); \
abb18f
         DO_TEST(arch, cpuTestGuestCPUID, host, host, \
abb18f
-                NULL, NULL, json, 0); \
abb18f
+                NULL, NULL, 0, NULL, json, 0); \
abb18f
         DO_TEST(arch, cpuTestCPUIDSignature, host, host, \
abb18f
-                NULL, NULL, 0, 0); \
abb18f
+                NULL, NULL, 0, NULL, 0, 0); \
abb18f
         DO_TEST_JSON(arch, host, json); \
abb18f
         if (json != JSON_NONE) { \
abb18f
             DO_TEST(arch, cpuTestUpdateLive, host, host, \
abb18f
-                    NULL, NULL, json, 0); \
abb18f
+                    NULL, NULL, 0, NULL, json, 0); \
abb18f
         } \
abb18f
     } while (0)
abb18f
 
abb18f
+#define DO_TEST_CPUID_BASELINE(arch, label, cpu1, cpu2) \
abb18f
+    do { \
abb18f
+        const char *cpus[] = {cpu1, cpu2}; \
abb18f
+        DO_TEST(arch, cpuTestCPUIDBaseline, \
abb18f
+                label " (" cpu1 ", " cpu2 ")", \
abb18f
+                NULL, label, cpus, 2, NULL, 0, 0); \
abb18f
+    } while (0)
abb18f
+
abb18f
     /* host to host comparison */
abb18f
     DO_TEST_COMPARE(VIR_ARCH_X86_64, "host", "host", VIR_CPU_COMPARE_IDENTICAL);
abb18f
     DO_TEST_COMPARE(VIR_ARCH_X86_64, "host", "host-better", VIR_CPU_COMPARE_INCOMPATIBLE);
abb18f
@@ -1157,6 +1221,32 @@ mymain(void)
abb18f
     DO_TEST_CPUID(VIR_ARCH_X86_64, "Ice-Lake-Server", JSON_MODELS);
abb18f
     DO_TEST_CPUID(VIR_ARCH_X86_64, "Cooperlake", JSON_MODELS);
abb18f
 
abb18f
+    DO_TEST_CPUID_BASELINE(VIR_ARCH_X86_64, "Ryzen+Rome",
abb18f
+                           "Ryzen-7-1800X-Eight-Core", "Ryzen-9-3900X-12-Core");
abb18f
+    DO_TEST_CPUID_BASELINE(VIR_ARCH_X86_64, "EPYC+Rome",
abb18f
+                           "EPYC-7601-32-Core", "EPYC-7502-32-Core");
abb18f
+    DO_TEST_CPUID_BASELINE(VIR_ARCH_X86_64, "Haswell-noTSX-IBRS+Skylake",
abb18f
+                           "Xeon-E5-2609-v3", "Xeon-Gold-6148");
abb18f
+    DO_TEST_CPUID_BASELINE(VIR_ARCH_X86_64, "Haswell-noTSX-IBRS+Skylake-IBRS",
abb18f
+                           "Xeon-E5-2609-v3", "Xeon-Gold-6130");
abb18f
+    DO_TEST_CPUID_BASELINE(VIR_ARCH_X86_64, "Broadwell-IBRS+Cascadelake",
abb18f
+                           "Xeon-E5-2623-v4", "Xeon-Platinum-8268");
abb18f
+    DO_TEST_CPUID_BASELINE(VIR_ARCH_X86_64, "Cascadelake+Skylake-IBRS",
abb18f
+                           "Xeon-Platinum-8268", "Xeon-Gold-6130");
abb18f
+    DO_TEST_CPUID_BASELINE(VIR_ARCH_X86_64, "Cascadelake+Skylake",
abb18f
+                           "Xeon-Platinum-9242", "Xeon-Gold-6148");
abb18f
+    DO_TEST_CPUID_BASELINE(VIR_ARCH_X86_64, "Cascadelake+Icelake",
abb18f
+                           "Xeon-Platinum-9242", "Ice-Lake-Server");
abb18f
+    DO_TEST_CPUID_BASELINE(VIR_ARCH_X86_64, "Cooperlake+Icelake",
abb18f
+                           "Cooperlake", "Ice-Lake-Server");
abb18f
+    DO_TEST_CPUID_BASELINE(VIR_ARCH_X86_64, "Cooperlake+Cascadelake",
abb18f
+                           "Cooperlake", "Xeon-Platinum-9242");
abb18f
+    DO_TEST_CPUID_BASELINE(VIR_ARCH_X86_64, "Skylake-Client+Server",
abb18f
+                           "Core-i5-6600", "Xeon-Gold-6148");
abb18f
+    DO_TEST_CPUID_BASELINE(VIR_ARCH_X86_64, "Haswell-noTSX-IBRS+Broadwell",
abb18f
+                           "Xeon-E5-2609-v3", "Xeon-E5-2650-v4");
abb18f
+    DO_TEST_CPUID_BASELINE(VIR_ARCH_X86_64, "Haswell+Skylake",
abb18f
+                           "Xeon-E7-8890-v3", "Xeon-Gold-5115");
abb18f
  cleanup:
abb18f
 #if WITH_QEMU
abb18f
     qemuTestDriverFree(&driver);
abb18f
diff --git a/tests/cputestdata/x86_64-cpuid-baseline-Broadwell-IBRS+Cascadelake.xml b/tests/cputestdata/x86_64-cpuid-baseline-Broadwell-IBRS+Cascadelake.xml
abb18f
new file mode 100644
abb18f
index 0000000000..4e3f253e9b
abb18f
--- /dev/null
abb18f
+++ b/tests/cputestdata/x86_64-cpuid-baseline-Broadwell-IBRS+Cascadelake.xml
abb18f
@@ -0,0 +1,11 @@
abb18f
+<cpu mode='custom' match='exact'>
abb18f
+  <model fallback='allow'>Skylake-Client-IBRS</model>
abb18f
+  <vendor>Intel</vendor>
abb18f
+  <feature policy='require' name='ss'/>
abb18f
+  <feature policy='require' name='hypervisor'/>
abb18f
+  <feature policy='require' name='tsc_adjust'/>
abb18f
+  <feature policy='require' name='pdpe1gb'/>
abb18f
+  <feature policy='disable' name='mpx'/>
abb18f
+  <feature policy='disable' name='xsavec'/>
abb18f
+  <feature policy='disable' name='xgetbv1'/>
abb18f
+</cpu>
abb18f
diff --git a/tests/cputestdata/x86_64-cpuid-baseline-Cascadelake+Icelake.xml b/tests/cputestdata/x86_64-cpuid-baseline-Cascadelake+Icelake.xml
abb18f
new file mode 100644
abb18f
index 0000000000..e372a3e446
abb18f
--- /dev/null
abb18f
+++ b/tests/cputestdata/x86_64-cpuid-baseline-Cascadelake+Icelake.xml
abb18f
@@ -0,0 +1,14 @@
abb18f
+<cpu mode='custom' match='exact'>
abb18f
+  <model fallback='allow'>Cooperlake</model>
abb18f
+  <vendor>Intel</vendor>
abb18f
+  <feature policy='require' name='ss'/>
abb18f
+  <feature policy='require' name='hypervisor'/>
abb18f
+  <feature policy='require' name='tsc_adjust'/>
abb18f
+  <feature policy='require' name='mpx'/>
abb18f
+  <feature policy='require' name='umip'/>
abb18f
+  <feature policy='require' name='xsaves'/>
abb18f
+  <feature policy='disable' name='avx512-bf16'/>
abb18f
+  <feature policy='disable' name='mds-no'/>
abb18f
+  <feature policy='disable' name='pschange-mc-no'/>
abb18f
+  <feature policy='disable' name='taa-no'/>
abb18f
+</cpu>
abb18f
diff --git a/tests/cputestdata/x86_64-cpuid-baseline-Cascadelake+Skylake-IBRS.xml b/tests/cputestdata/x86_64-cpuid-baseline-Cascadelake+Skylake-IBRS.xml
abb18f
new file mode 100644
abb18f
index 0000000000..e559e01583
abb18f
--- /dev/null
abb18f
+++ b/tests/cputestdata/x86_64-cpuid-baseline-Cascadelake+Skylake-IBRS.xml
abb18f
@@ -0,0 +1,12 @@
abb18f
+<cpu mode='custom' match='exact'>
abb18f
+  <model fallback='allow'>Cascadelake-Server</model>
abb18f
+  <vendor>Intel</vendor>
abb18f
+  <feature policy='require' name='ss'/>
abb18f
+  <feature policy='require' name='hypervisor'/>
abb18f
+  <feature policy='require' name='tsc_adjust'/>
abb18f
+  <feature policy='require' name='umip'/>
abb18f
+  <feature policy='require' name='pku'/>
abb18f
+  <feature policy='require' name='xsaves'/>
abb18f
+  <feature policy='require' name='skip-l1dfl-vmentry'/>
abb18f
+  <feature policy='disable' name='avx512vnni'/>
abb18f
+</cpu>
abb18f
diff --git a/tests/cputestdata/x86_64-cpuid-baseline-Cascadelake+Skylake.xml b/tests/cputestdata/x86_64-cpuid-baseline-Cascadelake+Skylake.xml
abb18f
new file mode 100644
abb18f
index 0000000000..906259df0b
abb18f
--- /dev/null
abb18f
+++ b/tests/cputestdata/x86_64-cpuid-baseline-Cascadelake+Skylake.xml
abb18f
@@ -0,0 +1,8 @@
abb18f
+<cpu mode='custom' match='exact'>
abb18f
+  <model fallback='allow'>Skylake-Server</model>
abb18f
+  <vendor>Intel</vendor>
abb18f
+  <feature policy='require' name='ss'/>
abb18f
+  <feature policy='require' name='hypervisor'/>
abb18f
+  <feature policy='require' name='tsc_adjust'/>
abb18f
+  <feature policy='require' name='clflushopt'/>
abb18f
+</cpu>
abb18f
diff --git a/tests/cputestdata/x86_64-cpuid-baseline-Cooperlake+Cascadelake.xml b/tests/cputestdata/x86_64-cpuid-baseline-Cooperlake+Cascadelake.xml
abb18f
new file mode 100644
abb18f
index 0000000000..46c32c996f
abb18f
--- /dev/null
abb18f
+++ b/tests/cputestdata/x86_64-cpuid-baseline-Cooperlake+Cascadelake.xml
abb18f
@@ -0,0 +1,17 @@
abb18f
+<cpu mode='custom' match='exact'>
abb18f
+  <model fallback='allow'>Cooperlake</model>
abb18f
+  <vendor>Intel</vendor>
abb18f
+  <feature policy='require' name='ss'/>
abb18f
+  <feature policy='require' name='vmx'/>
abb18f
+  <feature policy='require' name='hypervisor'/>
abb18f
+  <feature policy='require' name='tsc_adjust'/>
abb18f
+  <feature policy='require' name='mpx'/>
abb18f
+  <feature policy='require' name='umip'/>
abb18f
+  <feature policy='require' name='md-clear'/>
abb18f
+  <feature policy='require' name='xsaves'/>
abb18f
+  <feature policy='require' name='ibpb'/>
abb18f
+  <feature policy='require' name='amd-ssbd'/>
abb18f
+  <feature policy='require' name='tsx-ctrl'/>
abb18f
+  <feature policy='disable' name='avx512-bf16'/>
abb18f
+  <feature policy='disable' name='taa-no'/>
abb18f
+</cpu>
abb18f
diff --git a/tests/cputestdata/x86_64-cpuid-baseline-Cooperlake+Icelake.xml b/tests/cputestdata/x86_64-cpuid-baseline-Cooperlake+Icelake.xml
abb18f
new file mode 100644
abb18f
index 0000000000..e372a3e446
abb18f
--- /dev/null
abb18f
+++ b/tests/cputestdata/x86_64-cpuid-baseline-Cooperlake+Icelake.xml
abb18f
@@ -0,0 +1,14 @@
abb18f
+<cpu mode='custom' match='exact'>
abb18f
+  <model fallback='allow'>Cooperlake</model>
abb18f
+  <vendor>Intel</vendor>
abb18f
+  <feature policy='require' name='ss'/>
abb18f
+  <feature policy='require' name='hypervisor'/>
abb18f
+  <feature policy='require' name='tsc_adjust'/>
abb18f
+  <feature policy='require' name='mpx'/>
abb18f
+  <feature policy='require' name='umip'/>
abb18f
+  <feature policy='require' name='xsaves'/>
abb18f
+  <feature policy='disable' name='avx512-bf16'/>
abb18f
+  <feature policy='disable' name='mds-no'/>
abb18f
+  <feature policy='disable' name='pschange-mc-no'/>
abb18f
+  <feature policy='disable' name='taa-no'/>
abb18f
+</cpu>
abb18f
diff --git a/tests/cputestdata/x86_64-cpuid-baseline-EPYC+Rome.xml b/tests/cputestdata/x86_64-cpuid-baseline-EPYC+Rome.xml
abb18f
new file mode 100644
abb18f
index 0000000000..e1984b2890
abb18f
--- /dev/null
abb18f
+++ b/tests/cputestdata/x86_64-cpuid-baseline-EPYC+Rome.xml
abb18f
@@ -0,0 +1,13 @@
abb18f
+<cpu mode='custom' match='exact'>
abb18f
+  <model fallback='allow'>EPYC</model>
abb18f
+  <vendor>AMD</vendor>
abb18f
+  <feature policy='require' name='x2apic'/>
abb18f
+  <feature policy='require' name='tsc-deadline'/>
abb18f
+  <feature policy='require' name='hypervisor'/>
abb18f
+  <feature policy='require' name='tsc_adjust'/>
abb18f
+  <feature policy='require' name='cmp_legacy'/>
abb18f
+  <feature policy='require' name='npt'/>
abb18f
+  <feature policy='require' name='nrip-save'/>
abb18f
+  <feature policy='disable' name='svm'/>
abb18f
+  <feature policy='disable' name='monitor'/>
abb18f
+</cpu>
abb18f
diff --git a/tests/cputestdata/x86_64-cpuid-baseline-Haswell+Skylake.xml b/tests/cputestdata/x86_64-cpuid-baseline-Haswell+Skylake.xml
abb18f
new file mode 100644
abb18f
index 0000000000..e687a679b3
abb18f
--- /dev/null
abb18f
+++ b/tests/cputestdata/x86_64-cpuid-baseline-Haswell+Skylake.xml
abb18f
@@ -0,0 +1,14 @@
abb18f
+<cpu mode='custom' match='exact'>
abb18f
+  <model fallback='allow'>Haswell</model>
abb18f
+  <vendor>Intel</vendor>
abb18f
+  <feature policy='require' name='vme'/>
abb18f
+  <feature policy='require' name='ss'/>
abb18f
+  <feature policy='require' name='f16c'/>
abb18f
+  <feature policy='require' name='rdrand'/>
abb18f
+  <feature policy='require' name='hypervisor'/>
abb18f
+  <feature policy='require' name='arat'/>
abb18f
+  <feature policy='require' name='tsc_adjust'/>
abb18f
+  <feature policy='require' name='xsaveopt'/>
abb18f
+  <feature policy='require' name='pdpe1gb'/>
abb18f
+  <feature policy='require' name='abm'/>
abb18f
+</cpu>
abb18f
diff --git a/tests/cputestdata/x86_64-cpuid-baseline-Haswell-noTSX-IBRS+Broadwell.xml b/tests/cputestdata/x86_64-cpuid-baseline-Haswell-noTSX-IBRS+Broadwell.xml
abb18f
new file mode 100644
abb18f
index 0000000000..651457b17a
abb18f
--- /dev/null
abb18f
+++ b/tests/cputestdata/x86_64-cpuid-baseline-Haswell-noTSX-IBRS+Broadwell.xml
abb18f
@@ -0,0 +1,14 @@
abb18f
+<cpu mode='custom' match='exact'>
abb18f
+  <model fallback='allow'>Haswell-noTSX</model>
abb18f
+  <vendor>Intel</vendor>
abb18f
+  <feature policy='require' name='vme'/>
abb18f
+  <feature policy='require' name='ss'/>
abb18f
+  <feature policy='require' name='f16c'/>
abb18f
+  <feature policy='require' name='rdrand'/>
abb18f
+  <feature policy='require' name='hypervisor'/>
abb18f
+  <feature policy='require' name='arat'/>
abb18f
+  <feature policy='require' name='tsc_adjust'/>
abb18f
+  <feature policy='require' name='xsaveopt'/>
abb18f
+  <feature policy='require' name='pdpe1gb'/>
abb18f
+  <feature policy='require' name='abm'/>
abb18f
+</cpu>
abb18f
diff --git a/tests/cputestdata/x86_64-cpuid-baseline-Haswell-noTSX-IBRS+Skylake-IBRS.xml b/tests/cputestdata/x86_64-cpuid-baseline-Haswell-noTSX-IBRS+Skylake-IBRS.xml
abb18f
new file mode 100644
abb18f
index 0000000000..8bda1c02e2
abb18f
--- /dev/null
abb18f
+++ b/tests/cputestdata/x86_64-cpuid-baseline-Haswell-noTSX-IBRS+Skylake-IBRS.xml
abb18f
@@ -0,0 +1,14 @@
abb18f
+<cpu mode='custom' match='exact'>
abb18f
+  <model fallback='allow'>Haswell-noTSX-IBRS</model>
abb18f
+  <vendor>Intel</vendor>
abb18f
+  <feature policy='require' name='vme'/>
abb18f
+  <feature policy='require' name='ss'/>
abb18f
+  <feature policy='require' name='f16c'/>
abb18f
+  <feature policy='require' name='rdrand'/>
abb18f
+  <feature policy='require' name='hypervisor'/>
abb18f
+  <feature policy='require' name='arat'/>
abb18f
+  <feature policy='require' name='tsc_adjust'/>
abb18f
+  <feature policy='require' name='xsaveopt'/>
abb18f
+  <feature policy='require' name='pdpe1gb'/>
abb18f
+  <feature policy='require' name='abm'/>
abb18f
+</cpu>
abb18f
diff --git a/tests/cputestdata/x86_64-cpuid-baseline-Haswell-noTSX-IBRS+Skylake.xml b/tests/cputestdata/x86_64-cpuid-baseline-Haswell-noTSX-IBRS+Skylake.xml
abb18f
new file mode 100644
abb18f
index 0000000000..651457b17a
abb18f
--- /dev/null
abb18f
+++ b/tests/cputestdata/x86_64-cpuid-baseline-Haswell-noTSX-IBRS+Skylake.xml
abb18f
@@ -0,0 +1,14 @@
abb18f
+<cpu mode='custom' match='exact'>
abb18f
+  <model fallback='allow'>Haswell-noTSX</model>
abb18f
+  <vendor>Intel</vendor>
abb18f
+  <feature policy='require' name='vme'/>
abb18f
+  <feature policy='require' name='ss'/>
abb18f
+  <feature policy='require' name='f16c'/>
abb18f
+  <feature policy='require' name='rdrand'/>
abb18f
+  <feature policy='require' name='hypervisor'/>
abb18f
+  <feature policy='require' name='arat'/>
abb18f
+  <feature policy='require' name='tsc_adjust'/>
abb18f
+  <feature policy='require' name='xsaveopt'/>
abb18f
+  <feature policy='require' name='pdpe1gb'/>
abb18f
+  <feature policy='require' name='abm'/>
abb18f
+</cpu>
abb18f
diff --git a/tests/cputestdata/x86_64-cpuid-baseline-Ryzen+Rome.xml b/tests/cputestdata/x86_64-cpuid-baseline-Ryzen+Rome.xml
abb18f
new file mode 100644
abb18f
index 0000000000..051402b9d5
abb18f
--- /dev/null
abb18f
+++ b/tests/cputestdata/x86_64-cpuid-baseline-Ryzen+Rome.xml
abb18f
@@ -0,0 +1,13 @@
abb18f
+<cpu mode='custom' match='exact'>
abb18f
+  <model fallback='allow'>EPYC</model>
abb18f
+  <vendor>AMD</vendor>
abb18f
+  <feature policy='require' name='x2apic'/>
abb18f
+  <feature policy='require' name='tsc-deadline'/>
abb18f
+  <feature policy='require' name='hypervisor'/>
abb18f
+  <feature policy='require' name='tsc_adjust'/>
abb18f
+  <feature policy='require' name='cmp_legacy'/>
abb18f
+  <feature policy='require' name='npt'/>
abb18f
+  <feature policy='require' name='nrip-save'/>
abb18f
+  <feature policy='disable' name='sha-ni'/>
abb18f
+  <feature policy='disable' name='monitor'/>
abb18f
+</cpu>
abb18f
diff --git a/tests/cputestdata/x86_64-cpuid-baseline-Skylake-Client+Server.xml b/tests/cputestdata/x86_64-cpuid-baseline-Skylake-Client+Server.xml
abb18f
new file mode 100644
abb18f
index 0000000000..d46ff26eeb
abb18f
--- /dev/null
abb18f
+++ b/tests/cputestdata/x86_64-cpuid-baseline-Skylake-Client+Server.xml
abb18f
@@ -0,0 +1,9 @@
abb18f
+<cpu mode='custom' match='exact'>
abb18f
+  <model fallback='allow'>Skylake-Client</model>
abb18f
+  <vendor>Intel</vendor>
abb18f
+  <feature policy='require' name='ss'/>
abb18f
+  <feature policy='require' name='hypervisor'/>
abb18f
+  <feature policy='require' name='tsc_adjust'/>
abb18f
+  <feature policy='require' name='clflushopt'/>
abb18f
+  <feature policy='require' name='pdpe1gb'/>
abb18f
+</cpu>
abb18f
-- 
abb18f
2.35.1
abb18f