diff --git a/SOURCES/libvirt-cpu_conf-Pass-policy-to-CPU-feature-filtering-callbacks.patch b/SOURCES/libvirt-cpu_conf-Pass-policy-to-CPU-feature-filtering-callbacks.patch
new file mode 100644
index 0000000..50c8e30
--- /dev/null
+++ b/SOURCES/libvirt-cpu_conf-Pass-policy-to-CPU-feature-filtering-callbacks.patch
@@ -0,0 +1,165 @@
+From 0631e5e7cf7042841d3de563e8c59a74f43b1d68 Mon Sep 17 00:00:00 2001
+Message-Id: <0631e5e7cf7042841d3de563e8c59a74f43b1d68@dist-git>
+From: Jiri Denemark <jdenemar@redhat.com>
+Date: Fri, 22 Nov 2019 11:19:20 +0100
+Subject: [PATCH] cpu_conf: Pass policy to CPU feature filtering callbacks
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
+Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
+(cherry picked from commit 668797dc5cb474585609559dbe610e09517e23e6)
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1775133
+https://bugzilla.redhat.com/show_bug.cgi?id=1775134
+https://bugzilla.redhat.com/show_bug.cgi?id=1775137
+
+Conflicts:
+	src/cpu/cpu_x86.c
+	src/qemu/qemu_capabilities.c
+            - no glib stuff downstream
+
+Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
+Message-Id: <e980b2de9220b207c5ce05e978e799c0be53d445.1574417839.git.jdenemar@redhat.com>
+Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
+---
+ src/conf/cpu_conf.c          |  6 +++---
+ src/conf/cpu_conf.h          |  1 +
+ src/cpu/cpu_x86.c            | 13 ++++++++++++-
+ src/cpu/cpu_x86.h            |  2 ++
+ src/qemu/qemu_capabilities.c |  1 +
+ src/qemu/qemu_capabilities.h |  1 +
+ 6 files changed, 20 insertions(+), 4 deletions(-)
+
+diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c
+index 4cccea9981..d4e3c81145 100644
+--- a/src/conf/cpu_conf.c
++++ b/src/conf/cpu_conf.c
+@@ -135,7 +135,7 @@ virCPUDefCopyModelFilter(virCPUDefPtr dst,
+     dst->nfeatures = 0;
+ 
+     for (i = 0; i < src->nfeatures; i++) {
+-        if (filter && !filter(src->features[i].name, opaque))
++        if (filter && !filter(src->features[i].name, src->features[i].policy, opaque))
+             continue;
+ 
+         n = dst->nfeatures++;
+@@ -858,7 +858,7 @@ virCPUDefFilterFeatures(virCPUDefPtr cpu,
+     size_t i = 0;
+ 
+     while (i < cpu->nfeatures) {
+-        if (filter(cpu->features[i].name, opaque)) {
++        if (filter(cpu->features[i].name, cpu->features[i].policy, opaque)) {
+             i++;
+             continue;
+         }
+@@ -893,7 +893,7 @@ virCPUDefCheckFeatures(virCPUDefPtr cpu,
+     *features = NULL;
+ 
+     for (i = 0; i < cpu->nfeatures; i++) {
+-        if (filter(cpu->features[i].name, opaque)) {
++        if (filter(cpu->features[i].name, cpu->features[i].policy, opaque)) {
+             if (virStringListAdd(&list, cpu->features[i].name) < 0)
+                 return -1;
+             n++;
+diff --git a/src/conf/cpu_conf.h b/src/conf/cpu_conf.h
+index cba0ec7c81..687e1b09d2 100644
+--- a/src/conf/cpu_conf.h
++++ b/src/conf/cpu_conf.h
+@@ -162,6 +162,7 @@ virCPUDefCopyModel(virCPUDefPtr dst,
+  * Returns true if feature @name should copied, false otherwise.
+  */
+ typedef bool (*virCPUDefFeatureFilter)(const char *name,
++                                       virCPUFeaturePolicy policy,
+                                        void *opaque);
+ 
+ int
+diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c
+index 9104bdbf1e..cf5ef442e7 100644
+--- a/src/cpu/cpu_x86.c
++++ b/src/cpu/cpu_x86.c
+@@ -3260,6 +3260,15 @@ virCPUx86ExpandFeatures(virCPUDefPtr cpu)
+ }
+ 
+ 
++static bool
++x86FeatureFilterMigratable(const char *name,
++                           virCPUFeaturePolicy policy ATTRIBUTE_UNUSED,
++                           void *cpu_map)
++{
++    return x86FeatureIsMigratable(name, cpu_map);
++}
++
++
+ static virCPUDefPtr
+ virCPUx86CopyMigratable(virCPUDefPtr cpu)
+ {
+@@ -3273,7 +3282,7 @@ virCPUx86CopyMigratable(virCPUDefPtr cpu)
+         return NULL;
+ 
+     if (virCPUDefCopyModelFilter(copy, cpu, false,
+-                                 x86FeatureIsMigratable, map) < 0)
++                                 x86FeatureFilterMigratable, map) < 0)
+         goto error;
+ 
+     return copy;
+@@ -3408,6 +3417,7 @@ virCPUx86FeatureIsMSR(const char *name)
+  */
+ bool
+ virCPUx86FeatureFilterSelectMSR(const char *name,
++                                virCPUFeaturePolicy policy ATTRIBUTE_UNUSED,
+                                 void *opaque ATTRIBUTE_UNUSED)
+ {
+     return virCPUx86FeatureIsMSR(name);
+@@ -3424,6 +3434,7 @@ virCPUx86FeatureFilterSelectMSR(const char *name,
+  */
+ bool
+ virCPUx86FeatureFilterDropMSR(const char *name,
++                              virCPUFeaturePolicy policy ATTRIBUTE_UNUSED,
+                               void *opaque ATTRIBUTE_UNUSED)
+ {
+     return !virCPUx86FeatureIsMSR(name);
+diff --git a/src/cpu/cpu_x86.h b/src/cpu/cpu_x86.h
+index 5126679985..866fe17e88 100644
+--- a/src/cpu/cpu_x86.h
++++ b/src/cpu/cpu_x86.h
+@@ -46,9 +46,11 @@ int virCPUx86DataSetVendor(virCPUDataPtr cpuData,
+                            const char *vendor);
+ 
+ bool virCPUx86FeatureFilterSelectMSR(const char *name,
++                                     virCPUFeaturePolicy policy,
+                                      void *opaque);
+ 
+ bool virCPUx86FeatureFilterDropMSR(const char *name,
++                                   virCPUFeaturePolicy policy,
+                                    void *opaque);
+ 
+ #endif /* __VIR_CPU_X86_H__ */
+diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
+index fbfe74d45b..c25d8c3e1a 100644
+--- a/src/qemu/qemu_capabilities.c
++++ b/src/qemu/qemu_capabilities.c
+@@ -2753,6 +2753,7 @@ virQEMUCapsProbeQMPSEVCapabilities(virQEMUCapsPtr qemuCaps,
+ 
+ bool
+ virQEMUCapsCPUFilterFeatures(const char *name,
++                             virCPUFeaturePolicy policy ATTRIBUTE_UNUSED,
+                              void *opaque)
+ {
+     virArch *arch = opaque;
+diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
+index 1767b2ab6c..a4055d5458 100644
+--- a/src/qemu/qemu_capabilities.h
++++ b/src/qemu/qemu_capabilities.h
+@@ -629,6 +629,7 @@ bool virQEMUCapsGuestIsNative(virArch host,
+                               virArch guest);
+ 
+ bool virQEMUCapsCPUFilterFeatures(const char *name,
++                                  virCPUFeaturePolicy policy,
+                                   void *opaque);
+ 
+ const char *
+-- 
+2.24.0
+
diff --git a/SOURCES/libvirt-cpu_map-Drop-pconfig-from-Icelake-Server-CPU-model.patch b/SOURCES/libvirt-cpu_map-Drop-pconfig-from-Icelake-Server-CPU-model.patch
new file mode 100644
index 0000000..ddccae4
--- /dev/null
+++ b/SOURCES/libvirt-cpu_map-Drop-pconfig-from-Icelake-Server-CPU-model.patch
@@ -0,0 +1,191 @@
+From 3b9e2f17d091c57f1fe7cbad18b0985e0644d8c2 Mon Sep 17 00:00:00 2001
+Message-Id: <3b9e2f17d091c57f1fe7cbad18b0985e0644d8c2@dist-git>
+From: Jiri Denemark <jdenemar@redhat.com>
+Date: Fri, 22 Nov 2019 11:19:24 +0100
+Subject: [PATCH] cpu_map: Drop pconfig from Icelake-Server CPU model
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+The pconfig feature was enabled in QEMU by accident in 3.1.0. All other
+newer versions do not support it and it was removed from the
+Icelake-Server CPU model in QEMU.
+
+We don't normally change our CPU models even when QEMU does so to avoid
+breaking migrations between different versions of libvirt. But we can
+safely do so in this specific case. QEMU never supported enabling
+pconfig so any domain which was able to start has pconfig disabled.
+
+With a small compatibility hack which explicitly disables pconfig when
+CPU model equals Icelake-Server in migratable domain definition, only
+one migration scenario stays broken (and there's nothing we can do about
+it): from any host to a host with libvirt < 5.10.0 and QEMU > 3.1.0.
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1749672
+
+Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
+Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
+(cherry picked from commit 9cd03f7957e114892ae54e7ccb3758b6fb440644)
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1775133
+https://bugzilla.redhat.com/show_bug.cgi?id=1775134
+https://bugzilla.redhat.com/show_bug.cgi?id=1775137
+
+Conflicts:
+	src/cpu_map/x86_Icelake-Server.xml
+            - still monolithic cpu_map.xml downstream
+
+	src/qemu/qemu_domain.h
+            - context
+
+Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
+Message-Id: <430d543cce32100e879f1a5ea125abd4428aecf0.1574417839.git.jdenemar@redhat.com>
+Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
+---
+ src/cpu/cpu_map.xml                           |  1 -
+ src/qemu/qemu_domain.c                        | 23 +++++++++++++++++++
+ src/qemu/qemu_domain.h                        |  3 +++
+ src/qemu/qemu_migration_cookie.c              |  3 +++
+ .../x86_64-cpuid-Ice-Lake-Server-guest.xml    |  1 -
+ .../x86_64-cpuid-Ice-Lake-Server-host.xml     | 11 +--------
+ .../x86_64-cpuid-Ice-Lake-Server-json.xml     |  1 -
+ 7 files changed, 30 insertions(+), 13 deletions(-)
+
+diff --git a/src/cpu/cpu_map.xml b/src/cpu/cpu_map.xml
+index acd9dad7dc..7b9f8bb452 100644
+--- a/src/cpu/cpu_map.xml
++++ b/src/cpu/cpu_map.xml
+@@ -2176,7 +2176,6 @@
+       <feature name='pat'/>
+       <feature name='pcid'/>
+       <feature name='pclmuldq'/>
+-      <feature name='pconfig'/>
+       <feature name='pdpe1gb'/>
+       <feature name='pge'/>
+       <feature name='pku'/>
+diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
+index c9899b9e6d..f45d7d427e 100644
+--- a/src/qemu/qemu_domain.c
++++ b/src/qemu/qemu_domain.c
+@@ -7348,6 +7348,26 @@ qemuDomainDefCopy(virQEMUDriverPtr driver,
+ }
+ 
+ 
++int
++qemuDomainMakeCPUMigratable(virCPUDefPtr cpu)
++{
++    if (cpu->mode == VIR_CPU_MODE_CUSTOM &&
++        STREQ_NULLABLE(cpu->model, "Icelake-Server")) {
++        /* Originally Icelake-Server CPU model contained pconfig CPU feature.
++         * It was never actually enabled and thus it was removed. To enable
++         * migration to QEMU 3.1.0 (with both new and old libvirt), we
++         * explicitly disable pconfig in migration XML (otherwise old libvirt
++         * would think it was implicitly enabled on the source). New libvirt
++         * will drop it from the XML before starting the domain on new QEMU.
++         */
++        if (virCPUDefUpdateFeature(cpu, "pconfig", VIR_CPU_FEATURE_DISABLE) < 0)
++            return -1;
++    }
++
++    return 0;
++}
++
++
+ static int
+ qemuDomainDefFormatBufInternal(virQEMUDriverPtr driver,
+                                virDomainDefPtr def,
+@@ -7522,6 +7542,9 @@ qemuDomainDefFormatBufInternal(virQEMUDriverPtr driver,
+             if (!(def->cpu = virCPUDefCopy(origCPU)))
+                 goto cleanup;
+         }
++
++        if (qemuDomainMakeCPUMigratable(def->cpu) < 0)
++            goto cleanup;
+     }
+ 
+  format:
+diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
+index 8463a8b706..a29a678771 100644
+--- a/src/qemu/qemu_domain.h
++++ b/src/qemu/qemu_domain.h
+@@ -1072,4 +1072,7 @@ char * qemuDomainGetManagedPRSocketPath(qemuDomainObjPrivatePtr priv);
+ virDomainEventResumedDetailType
+ qemuDomainRunningReasonToResumeEvent(virDomainRunningReason reason);
+ 
++int
++qemuDomainMakeCPUMigratable(virCPUDefPtr cpu);
++
+ #endif /* __QEMU_DOMAIN_H__ */
+diff --git a/src/qemu/qemu_migration_cookie.c b/src/qemu/qemu_migration_cookie.c
+index 60df449d53..c270896944 100644
+--- a/src/qemu/qemu_migration_cookie.c
++++ b/src/qemu/qemu_migration_cookie.c
+@@ -543,6 +543,9 @@ qemuMigrationCookieAddCPU(qemuMigrationCookiePtr mig,
+     if (!(mig->cpu = virCPUDefCopy(vm->def->cpu)))
+         return -1;
+ 
++    if (qemuDomainMakeCPUMigratable(mig->cpu) < 0)
++        return -1;
++
+     mig->flags |= QEMU_MIGRATION_COOKIE_CPU;
+ 
+     return 0;
+diff --git a/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-guest.xml b/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-guest.xml
+index 6ca2099b33..4676f3aa7d 100644
+--- a/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-guest.xml
++++ b/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-guest.xml
+@@ -32,5 +32,4 @@
+   <feature policy='require' name='rdctl-no'/>
+   <feature policy='require' name='ibrs-all'/>
+   <feature policy='require' name='skip-l1dfl-vmentry'/>
+-  <feature policy='disable' name='pconfig'/>
+ </cpu>
+diff --git a/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-host.xml b/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-host.xml
+index 31af20bc85..35b9e39629 100644
+--- a/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-host.xml
++++ b/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-host.xml
+@@ -1,6 +1,6 @@
+ <cpu>
+   <arch>x86_64</arch>
+-  <model>Icelake-Client</model>
++  <model>Icelake-Server</model>
+   <vendor>Intel</vendor>
+   <feature name='ds'/>
+   <feature name='acpi'/>
+@@ -21,23 +21,14 @@
+   <feature name='osxsave'/>
+   <feature name='tsc_adjust'/>
+   <feature name='cmt'/>
+-  <feature name='avx512f'/>
+-  <feature name='avx512dq'/>
+   <feature name='avx512ifma'/>
+-  <feature name='clflushopt'/>
+-  <feature name='clwb'/>
+-  <feature name='avx512cd'/>
+   <feature name='sha-ni'/>
+-  <feature name='avx512bw'/>
+-  <feature name='avx512vl'/>
+   <feature name='ospke'/>
+-  <feature name='la57'/>
+   <feature name='stibp'/>
+   <feature name='arch-capabilities'/>
+   <feature name='xsaves'/>
+   <feature name='mbm_total'/>
+   <feature name='mbm_local'/>
+-  <feature name='pdpe1gb'/>
+   <feature name='invtsc'/>
+   <feature name='rdctl-no'/>
+   <feature name='ibrs-all'/>
+diff --git a/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-json.xml b/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-json.xml
+index b043db58d7..ada11d2608 100644
+--- a/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-json.xml
++++ b/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-json.xml
+@@ -13,5 +13,4 @@
+   <feature policy='require' name='ibrs-all'/>
+   <feature policy='require' name='skip-l1dfl-vmentry'/>
+   <feature policy='disable' name='intel-pt'/>
+-  <feature policy='disable' name='pconfig'/>
+ </cpu>
+-- 
+2.24.0
+
diff --git a/SOURCES/libvirt-cputest-Add-data-for-Ice-Lake-Server-CPU.patch b/SOURCES/libvirt-cputest-Add-data-for-Ice-Lake-Server-CPU.patch
new file mode 100644
index 0000000..17c8ee3
--- /dev/null
+++ b/SOURCES/libvirt-cputest-Add-data-for-Ice-Lake-Server-CPU.patch
@@ -0,0 +1,1429 @@
+From 3ec400ca1456fcd5ab9dd24763f4635c0c9819f8 Mon Sep 17 00:00:00 2001
+Message-Id: <3ec400ca1456fcd5ab9dd24763f4635c0c9819f8@dist-git>
+From: Jiri Denemark <jdenemar@redhat.com>
+Date: Fri, 22 Nov 2019 11:19:23 +0100
+Subject: [PATCH] cputest: Add data for Ice Lake Server CPU
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
+Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
+(cherry picked from commit 6b4cc15730e5b2330eaba2b211f16547dccd665c)
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1775133
+https://bugzilla.redhat.com/show_bug.cgi?id=1775134
+https://bugzilla.redhat.com/show_bug.cgi?id=1775137
+
+Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
+Message-Id: <4ec13db912bfe8c72b5eb850f7f1ccc8180e4a9a.1574417839.git.jdenemar@redhat.com>
+Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
+---
+ tests/cputest.c                               |    1 +
+ .../x86_64-cpuid-Ice-Lake-Server-disabled.xml |    7 +
+ .../x86_64-cpuid-Ice-Lake-Server-enabled.xml  |   10 +
+ .../x86_64-cpuid-Ice-Lake-Server-guest.xml    |   36 +
+ .../x86_64-cpuid-Ice-Lake-Server-host.xml     |   45 +
+ .../x86_64-cpuid-Ice-Lake-Server-json.xml     |   17 +
+ .../x86_64-cpuid-Ice-Lake-Server.json         | 1142 +++++++++++++++++
+ .../x86_64-cpuid-Ice-Lake-Server.sig          |    4 +
+ .../x86_64-cpuid-Ice-Lake-Server.xml          |   65 +
+ 9 files changed, 1327 insertions(+)
+ create mode 100644 tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-disabled.xml
+ create mode 100644 tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-enabled.xml
+ create mode 100644 tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-guest.xml
+ create mode 100644 tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-host.xml
+ create mode 100644 tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-json.xml
+ create mode 100644 tests/cputestdata/x86_64-cpuid-Ice-Lake-Server.json
+ create mode 100644 tests/cputestdata/x86_64-cpuid-Ice-Lake-Server.sig
+ create mode 100644 tests/cputestdata/x86_64-cpuid-Ice-Lake-Server.xml
+
+diff --git a/tests/cputest.c b/tests/cputest.c
+index 1ce50caccd..f0616c6ec9 100644
+--- a/tests/cputest.c
++++ b/tests/cputest.c
+@@ -1296,6 +1296,7 @@ mymain(void)
+     DO_TEST_CPUID(VIR_ARCH_X86_64, "Xeon-Platinum-8268", JSON_HOST);
+     DO_TEST_CPUID(VIR_ARCH_X86_64, "Xeon-W3520", JSON_HOST);
+     DO_TEST_CPUID(VIR_ARCH_X86_64, "Xeon-X5460", JSON_NONE);
++    DO_TEST_CPUID(VIR_ARCH_X86_64, "Ice-Lake-Server", JSON_MODELS);
+ 
+  cleanup:
+ #if WITH_QEMU && WITH_YAJL
+diff --git a/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-disabled.xml b/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-disabled.xml
+new file mode 100644
+index 0000000000..62c6bad612
+--- /dev/null
++++ b/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-disabled.xml
+@@ -0,0 +1,7 @@
++<!-- Features disabled by QEMU -->
++<cpudata arch='x86'>
++  <cpuid eax_in='0x00000001' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x0804c1fc' edx='0xb0600000'/>
++  <cpuid eax_in='0x00000007' ecx_in='0x00' eax='0x00000000' ebx='0x02001000' ecx='0x00000010' edx='0x00000000'/>
++  <cpuid eax_in='0x0000000f' ecx_in='0x01' eax='0x00000000' ebx='0x00000000' ecx='0x00000000' edx='0x00000006'/>
++  <cpuid eax_in='0x80000007' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x00000000' edx='0x00000100'/>
++</cpudata>
+diff --git a/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-enabled.xml b/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-enabled.xml
+new file mode 100644
+index 0000000000..4a2c37a2ce
+--- /dev/null
++++ b/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-enabled.xml
+@@ -0,0 +1,10 @@
++<!-- Features enabled by QEMU -->
++<cpudata arch='x86'>
++  <cpuid eax_in='0x00000001' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0xf7fa3203' edx='0x0f8bfbff'/>
++  <cpuid eax_in='0x00000006' ecx_in='0x00' eax='0x00000004' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
++  <cpuid eax_in='0x00000007' ecx_in='0x00' eax='0x00000000' ebx='0xf1bf4fbb' ecx='0x00015f4e' edx='0xac000000'/>
++  <cpuid eax_in='0x0000000d' ecx_in='0x01' eax='0x0000000f' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
++  <cpuid eax_in='0x80000001' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x00000121' edx='0x2c100800'/>
++  <cpuid eax_in='0x80000008' ecx_in='0x00' eax='0x00000000' ebx='0x00000200' ecx='0x00000000' edx='0x00000000'/>
++  <msr index='0x10a' edx='0x00000000' eax='0x0000000b'/>
++</cpudata>
+diff --git a/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-guest.xml b/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-guest.xml
+new file mode 100644
+index 0000000000..6ca2099b33
+--- /dev/null
++++ b/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-guest.xml
+@@ -0,0 +1,36 @@
++<cpu mode='custom' match='exact'>
++  <model fallback='forbid'>Icelake-Server</model>
++  <vendor>Intel</vendor>
++  <feature policy='require' name='ds'/>
++  <feature policy='require' name='acpi'/>
++  <feature policy='require' name='ss'/>
++  <feature policy='require' name='ht'/>
++  <feature policy='require' name='tm'/>
++  <feature policy='require' name='pbe'/>
++  <feature policy='require' name='dtes64'/>
++  <feature policy='require' name='monitor'/>
++  <feature policy='require' name='ds_cpl'/>
++  <feature policy='require' name='vmx'/>
++  <feature policy='require' name='smx'/>
++  <feature policy='require' name='est'/>
++  <feature policy='require' name='tm2'/>
++  <feature policy='require' name='xtpr'/>
++  <feature policy='require' name='pdcm'/>
++  <feature policy='require' name='dca'/>
++  <feature policy='require' name='osxsave'/>
++  <feature policy='require' name='tsc_adjust'/>
++  <feature policy='require' name='cmt'/>
++  <feature policy='require' name='avx512ifma'/>
++  <feature policy='require' name='sha-ni'/>
++  <feature policy='require' name='ospke'/>
++  <feature policy='require' name='stibp'/>
++  <feature policy='require' name='arch-capabilities'/>
++  <feature policy='require' name='xsaves'/>
++  <feature policy='require' name='mbm_total'/>
++  <feature policy='require' name='mbm_local'/>
++  <feature policy='require' name='invtsc'/>
++  <feature policy='require' name='rdctl-no'/>
++  <feature policy='require' name='ibrs-all'/>
++  <feature policy='require' name='skip-l1dfl-vmentry'/>
++  <feature policy='disable' name='pconfig'/>
++</cpu>
+diff --git a/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-host.xml b/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-host.xml
+new file mode 100644
+index 0000000000..31af20bc85
+--- /dev/null
++++ b/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-host.xml
+@@ -0,0 +1,45 @@
++<cpu>
++  <arch>x86_64</arch>
++  <model>Icelake-Client</model>
++  <vendor>Intel</vendor>
++  <feature name='ds'/>
++  <feature name='acpi'/>
++  <feature name='ss'/>
++  <feature name='ht'/>
++  <feature name='tm'/>
++  <feature name='pbe'/>
++  <feature name='dtes64'/>
++  <feature name='monitor'/>
++  <feature name='ds_cpl'/>
++  <feature name='vmx'/>
++  <feature name='smx'/>
++  <feature name='est'/>
++  <feature name='tm2'/>
++  <feature name='xtpr'/>
++  <feature name='pdcm'/>
++  <feature name='dca'/>
++  <feature name='osxsave'/>
++  <feature name='tsc_adjust'/>
++  <feature name='cmt'/>
++  <feature name='avx512f'/>
++  <feature name='avx512dq'/>
++  <feature name='avx512ifma'/>
++  <feature name='clflushopt'/>
++  <feature name='clwb'/>
++  <feature name='avx512cd'/>
++  <feature name='sha-ni'/>
++  <feature name='avx512bw'/>
++  <feature name='avx512vl'/>
++  <feature name='ospke'/>
++  <feature name='la57'/>
++  <feature name='stibp'/>
++  <feature name='arch-capabilities'/>
++  <feature name='xsaves'/>
++  <feature name='mbm_total'/>
++  <feature name='mbm_local'/>
++  <feature name='pdpe1gb'/>
++  <feature name='invtsc'/>
++  <feature name='rdctl-no'/>
++  <feature name='ibrs-all'/>
++  <feature name='skip-l1dfl-vmentry'/>
++</cpu>
+diff --git a/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-json.xml b/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-json.xml
+new file mode 100644
+index 0000000000..b043db58d7
+--- /dev/null
++++ b/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-json.xml
+@@ -0,0 +1,17 @@
++<cpu mode='custom' match='exact'>
++  <model fallback='forbid'>Icelake-Server</model>
++  <vendor>Intel</vendor>
++  <feature policy='require' name='ss'/>
++  <feature policy='require' name='hypervisor'/>
++  <feature policy='require' name='tsc_adjust'/>
++  <feature policy='require' name='avx512ifma'/>
++  <feature policy='require' name='sha-ni'/>
++  <feature policy='require' name='stibp'/>
++  <feature policy='require' name='arch-capabilities'/>
++  <feature policy='require' name='xsaves'/>
++  <feature policy='require' name='rdctl-no'/>
++  <feature policy='require' name='ibrs-all'/>
++  <feature policy='require' name='skip-l1dfl-vmentry'/>
++  <feature policy='disable' name='intel-pt'/>
++  <feature policy='disable' name='pconfig'/>
++</cpu>
+diff --git a/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server.json b/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server.json
+new file mode 100644
+index 0000000000..6c7ea3f687
+--- /dev/null
++++ b/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server.json
+@@ -0,0 +1,1142 @@
++{
++  "return": {
++    "model": {
++      "name": "base",
++      "props": {
++        "phys-bits": 0,
++        "core-id": -1,
++        "xlevel": 2147483656,
++        "cmov": true,
++        "ia64": false,
++        "ssb-no": false,
++        "aes": true,
++        "mmx": true,
++        "rdpid": false,
++        "arat": true,
++        "gfni": true,
++        "ibrs-all": true,
++        "pause-filter": false,
++        "xsavec": true,
++        "intel-pt": false,
++        "hv-frequencies": false,
++        "tsc-frequency": 0,
++        "xd": true,
++        "x-intel-pt-auto-level": false,
++        "hv-vendor-id": "",
++        "kvm-asyncpf": true,
++        "kvm_asyncpf": true,
++        "perfctr_core": false,
++        "perfctr-core": false,
++        "mpx": true,
++        "pbe": false,
++        "decodeassists": false,
++        "avx512cd": true,
++        "sse4_1": true,
++        "sse4.1": true,
++        "sse4-1": true,
++        "family": 6,
++        "legacy-cache": true,
++        "host-phys-bits-limit": 48,
++        "vmware-cpuid-freq": true,
++        "wbnoinvd": true,
++        "avx512f": true,
++        "hv-stimer-direct": false,
++        "msr": true,
++        "mce": true,
++        "mca": true,
++        "hv-runtime": false,
++        "xcrypt": false,
++        "thread-id": -1,
++        "min-level": 13,
++        "xgetbv1": true,
++        "cid": false,
++        "hv-relaxed": false,
++        "hv-crash": false,
++        "ds": false,
++        "fxsr": true,
++        "xsaveopt": true,
++        "xtpr": false,
++        "hv-evmcs": false,
++        "avx512vl": true,
++        "avx512-vpopcntdq": true,
++        "phe": false,
++        "extapic": false,
++        "3dnowprefetch": true,
++        "avx512vbmi2": true,
++        "cr8legacy": false,
++        "stibp": true,
++        "cpuid-0xb": true,
++        "xcrypt-en": false,
++        "kvm_pv_eoi": true,
++        "apic-id": 4294967295,
++        "rsba": false,
++        "pn": false,
++        "dca": false,
++        "vendor": "GenuineIntel",
++        "hv-ipi": false,
++        "pku": true,
++        "smx": false,
++        "cmp_legacy": false,
++        "cmp-legacy": false,
++        "node-id": -1,
++        "avx512-4fmaps": false,
++        "vmcb_clean": false,
++        "vmcb-clean": false,
++        "3dnowext": false,
++        "amd-no-ssb": false,
++        "hle": true,
++        "npt": false,
++        "rdctl-no": true,
++        "memory": "/machine/unattached/system[0]",
++        "clwb": true,
++        "lbrv": false,
++        "adx": true,
++        "ss": true,
++        "pni": true,
++        "svm_lock": false,
++        "svm-lock": false,
++        "pfthreshold": false,
++        "smep": true,
++        "smap": true,
++        "x2apic": true,
++        "avx512vbmi": true,
++        "avx512vnni": true,
++        "hv-stimer": false,
++        "x-hv-synic-kvm-only": true,
++        "i64": true,
++        "flushbyasid": false,
++        "f16c": true,
++        "ace2-en": false,
++        "pat": true,
++        "pae": true,
++        "sse": true,
++        "die-id": -1,
++        "phe-en": false,
++        "kvm_nopiodelay": true,
++        "kvm-nopiodelay": true,
++        "tm": false,
++        "kvmclock-stable-bit": true,
++        "hypervisor": true,
++        "socket-id": -1,
++        "mds-no": false,
++        "pcommit": false,
++        "syscall": true,
++        "level": 13,
++        "avx512dq": true,
++        "x-migrate-smi-count": false,
++        "svm": false,
++        "full-cpuid-auto-level": true,
++        "hv-reset": false,
++        "invtsc": false,
++        "sse3": true,
++        "sse2": true,
++        "ssbd": true,
++        "est": false,
++        "avx512ifma": true,
++        "tm2": false,
++        "kvm-pv-ipi": true,
++        "kvm-pv-eoi": true,
++        "cx8": true,
++        "cldemote": false,
++        "hv-reenlightenment": false,
++        "kvm_mmu": false,
++        "kvm-mmu": false,
++        "sse4_2": true,
++        "sse4.2": true,
++        "sse4-2": true,
++        "pge": true,
++        "fill-mtrr-mask": true,
++        "avx512bitalg": true,
++        "nodeid_msr": false,
++        "pdcm": false,
++        "movbe": true,
++        "model": 106,
++        "nrip_save": false,
++        "nrip-save": false,
++        "kvm_pv_unhalt": true,
++        "ssse3": true,
++        "sse4a": false,
++        "invpcid": true,
++        "pdpe1gb": true,
++        "tsc-deadline": true,
++        "skip-l1dfl-vmentry": true,
++        "fma": true,
++        "cx16": true,
++        "de": true,
++        "enforce": false,
++        "stepping": 0,
++        "xsave": true,
++        "clflush": true,
++        "skinit": false,
++        "tsc": true,
++        "tce": false,
++        "fpu": true,
++        "ibs": false,
++        "ds_cpl": false,
++        "ds-cpl": false,
++        "host-phys-bits": true,
++        "fma4": false,
++        "la57": true,
++        "osvw": false,
++        "check": true,
++        "hv-spinlocks": 4294967295,
++        "pmu": false,
++        "pmm": false,
++        "apic": true,
++        "spec-ctrl": true,
++        "min-xlevel2": 0,
++        "tsc-adjust": true,
++        "tsc_adjust": true,
++        "kvm-steal-time": true,
++        "kvm_steal_time": true,
++        "kvmclock": true,
++        "l3-cache": true,
++        "lwp": false,
++        "hv-passthrough": false,
++        "amd-ssbd": false,
++        "ibpb": false,
++        "xop": false,
++        "avx": true,
++        "core-capability": false,
++        "movdiri": false,
++        "ace2": false,
++        "avx512bw": true,
++        "acpi": false,
++        "hv-vapic": false,
++        "fsgsbase": true,
++        "ht": false,
++        "nx": true,
++        "pclmulqdq": true,
++        "mmxext": false,
++        "vaes": true,
++        "popcnt": true,
++        "xsaves": true,
++        "movdir64b": false,
++        "tcg-cpuid": true,
++        "lm": true,
++        "umip": true,
++        "pse": true,
++        "avx2": true,
++        "sep": true,
++        "pclmuldq": true,
++        "virt-ssbd": false,
++        "x-hv-max-vps": -1,
++        "nodeid-msr": false,
++        "md-clear": false,
++        "split-lock-detect": false,
++        "kvm": true,
++        "misalignsse": false,
++        "min-xlevel": 2147483656,
++        "kvm-pv-unhalt": true,
++        "bmi2": true,
++        "bmi1": true,
++        "realized": false,
++        "tsc_scale": false,
++        "tsc-scale": false,
++        "topoext": false,
++        "hv-vpindex": false,
++        "xlevel2": 0,
++        "clflushopt": true,
++        "kvm-no-smi-migration": false,
++        "monitor": false,
++        "avx512er": false,
++        "pmm-en": false,
++        "pcid": true,
++        "arch-capabilities": true,
++        "3dnow": false,
++        "erms": true,
++        "x-force-features": false,
++        "lahf-lm": true,
++        "lahf_lm": true,
++        "vpclmulqdq": true,
++        "fxsr-opt": false,
++        "hv-synic": false,
++        "xstore": false,
++        "fxsr_opt": false,
++        "kvm-hint-dedicated": false,
++        "rtm": true,
++        "lmce": true,
++        "hv-time": false,
++        "perfctr-nb": false,
++        "perfctr_nb": false,
++        "ffxsr": false,
++        "hv-tlbflush": false,
++        "rdrand": true,
++        "rdseed": true,
++        "avx512-4vnniw": false,
++        "vmx": false,
++        "vme": true,
++        "dtes64": false,
++        "mtrr": true,
++        "rdtscp": true,
++        "pse36": true,
++        "kvm-pv-tlb-flush": true,
++        "tbm": false,
++        "wdt": false,
++        "pause_filter": false,
++        "sha-ni": true,
++        "model-id": "",
++        "abm": true,
++        "avx512pf": false,
++        "xstore-en": false
++      }
++    }
++  },
++  "id": "model-expansion"
++}
++
++{
++  "return": [
++    {
++      "name": "max",
++      "typename": "max-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": false
++    },
++    {
++      "name": "host",
++      "typename": "host-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": false
++    },
++    {
++      "name": "base",
++      "typename": "base-x86_64-cpu",
++      "unavailable-features": [],
++      "static": true,
++      "migration-safe": true
++    },
++    {
++      "name": "qemu64-v1",
++      "typename": "qemu64-v1-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "qemu64",
++      "typename": "qemu64-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "qemu32-v1",
++      "typename": "qemu32-v1-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "qemu32",
++      "typename": "qemu32-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "phenom-v1",
++      "typename": "phenom-v1-x86_64-cpu",
++      "unavailable-features": [
++        "mmxext",
++        "fxsr-opt",
++        "3dnowext",
++        "3dnow",
++        "sse4a",
++        "npt"
++      ],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "phenom",
++      "typename": "phenom-x86_64-cpu",
++      "unavailable-features": [
++        "mmxext",
++        "fxsr-opt",
++        "3dnowext",
++        "3dnow",
++        "sse4a",
++        "npt"
++      ],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "pentium3-v1",
++      "typename": "pentium3-v1-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "pentium3",
++      "typename": "pentium3-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "pentium2-v1",
++      "typename": "pentium2-v1-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "pentium2",
++      "typename": "pentium2-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "pentium-v1",
++      "typename": "pentium-v1-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "pentium",
++      "typename": "pentium-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "n270-v1",
++      "typename": "n270-v1-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "n270",
++      "typename": "n270-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "kvm64-v1",
++      "typename": "kvm64-v1-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "kvm64",
++      "typename": "kvm64-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "kvm32-v1",
++      "typename": "kvm32-v1-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "kvm32",
++      "typename": "kvm32-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "cpu64-rhel6-v1",
++      "typename": "cpu64-rhel6-v1-x86_64-cpu",
++      "unavailable-features": [
++        "sse4a"
++      ],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "cpu64-rhel6",
++      "typename": "cpu64-rhel6-x86_64-cpu",
++      "unavailable-features": [
++        "sse4a"
++      ],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "coreduo-v1",
++      "typename": "coreduo-v1-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "coreduo",
++      "typename": "coreduo-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "core2duo-v1",
++      "typename": "core2duo-v1-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "core2duo",
++      "typename": "core2duo-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "athlon-v1",
++      "typename": "athlon-v1-x86_64-cpu",
++      "unavailable-features": [
++        "mmxext",
++        "3dnowext",
++        "3dnow"
++      ],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "athlon",
++      "typename": "athlon-x86_64-cpu",
++      "unavailable-features": [
++        "mmxext",
++        "3dnowext",
++        "3dnow"
++      ],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Westmere-v2",
++      "typename": "Westmere-v2-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Westmere-v1",
++      "typename": "Westmere-v1-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Westmere-IBRS",
++      "typename": "Westmere-IBRS-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Westmere",
++      "typename": "Westmere-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Snowridge-v1",
++      "typename": "Snowridge-v1-x86_64-cpu",
++      "unavailable-features": [
++        "cldemote",
++        "movdiri",
++        "movdir64b",
++        "core-capability",
++        "split-lock-detect"
++      ],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Snowridge",
++      "typename": "Snowridge-x86_64-cpu",
++      "unavailable-features": [
++        "cldemote",
++        "movdiri",
++        "movdir64b",
++        "core-capability",
++        "split-lock-detect"
++      ],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Skylake-Server-v2",
++      "typename": "Skylake-Server-v2-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Skylake-Server-v1",
++      "typename": "Skylake-Server-v1-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Skylake-Server-IBRS",
++      "typename": "Skylake-Server-IBRS-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Skylake-Server",
++      "typename": "Skylake-Server-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Skylake-Client-v2",
++      "typename": "Skylake-Client-v2-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Skylake-Client-v1",
++      "typename": "Skylake-Client-v1-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Skylake-Client-IBRS",
++      "typename": "Skylake-Client-IBRS-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Skylake-Client",
++      "typename": "Skylake-Client-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "SandyBridge-v2",
++      "typename": "SandyBridge-v2-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "SandyBridge-v1",
++      "typename": "SandyBridge-v1-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "SandyBridge-IBRS",
++      "typename": "SandyBridge-IBRS-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "SandyBridge",
++      "typename": "SandyBridge-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Penryn-v1",
++      "typename": "Penryn-v1-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Penryn",
++      "typename": "Penryn-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Opteron_G5-v1",
++      "typename": "Opteron_G5-v1-x86_64-cpu",
++      "unavailable-features": [
++        "sse4a",
++        "misalignsse",
++        "xop",
++        "fma4",
++        "tbm",
++        "npt",
++        "nrip-save"
++      ],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Opteron_G5",
++      "typename": "Opteron_G5-x86_64-cpu",
++      "unavailable-features": [
++        "sse4a",
++        "misalignsse",
++        "xop",
++        "fma4",
++        "tbm"
++      ],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Opteron_G4-v1",
++      "typename": "Opteron_G4-v1-x86_64-cpu",
++      "unavailable-features": [
++        "sse4a",
++        "misalignsse",
++        "xop",
++        "fma4",
++        "npt",
++        "nrip-save"
++      ],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Opteron_G4",
++      "typename": "Opteron_G4-x86_64-cpu",
++      "unavailable-features": [
++        "sse4a",
++        "misalignsse",
++        "xop",
++        "fma4"
++      ],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Opteron_G3-v1",
++      "typename": "Opteron_G3-v1-x86_64-cpu",
++      "unavailable-features": [
++        "sse4a",
++        "misalignsse"
++      ],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Opteron_G3",
++      "typename": "Opteron_G3-x86_64-cpu",
++      "unavailable-features": [
++        "sse4a",
++        "misalignsse"
++      ],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Opteron_G2-v1",
++      "typename": "Opteron_G2-v1-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Opteron_G2",
++      "typename": "Opteron_G2-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Opteron_G1-v1",
++      "typename": "Opteron_G1-v1-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Opteron_G1",
++      "typename": "Opteron_G1-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Nehalem-v2",
++      "typename": "Nehalem-v2-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Nehalem-v1",
++      "typename": "Nehalem-v1-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Nehalem-IBRS",
++      "typename": "Nehalem-IBRS-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Nehalem",
++      "typename": "Nehalem-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "KnightsMill-v1",
++      "typename": "KnightsMill-v1-x86_64-cpu",
++      "unavailable-features": [
++        "avx512pf",
++        "avx512er",
++        "avx512-4vnniw",
++        "avx512-4fmaps"
++      ],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "KnightsMill",
++      "typename": "KnightsMill-x86_64-cpu",
++      "unavailable-features": [
++        "avx512pf",
++        "avx512er",
++        "avx512-4vnniw",
++        "avx512-4fmaps"
++      ],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "IvyBridge-v2",
++      "typename": "IvyBridge-v2-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "IvyBridge-v1",
++      "typename": "IvyBridge-v1-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "IvyBridge-IBRS",
++      "typename": "IvyBridge-IBRS-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "IvyBridge",
++      "typename": "IvyBridge-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Icelake-Server-v1",
++      "typename": "Icelake-Server-v1-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Icelake-Server",
++      "typename": "Icelake-Server-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Icelake-Client-v1",
++      "typename": "Icelake-Client-v1-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Icelake-Client",
++      "typename": "Icelake-Client-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Haswell-v4",
++      "typename": "Haswell-v4-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Haswell-v3",
++      "typename": "Haswell-v3-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Haswell-v2",
++      "typename": "Haswell-v2-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Haswell-v1",
++      "typename": "Haswell-v1-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Haswell-noTSX-IBRS",
++      "typename": "Haswell-noTSX-IBRS-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Haswell-noTSX",
++      "typename": "Haswell-noTSX-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Haswell-IBRS",
++      "typename": "Haswell-IBRS-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Haswell",
++      "typename": "Haswell-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "EPYC-v2",
++      "typename": "EPYC-v2-x86_64-cpu",
++      "unavailable-features": [
++        "mmxext",
++        "fxsr-opt",
++        "cr8legacy",
++        "sse4a",
++        "misalignsse",
++        "osvw",
++        "ibpb",
++        "npt",
++        "nrip-save"
++      ],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "EPYC-v1",
++      "typename": "EPYC-v1-x86_64-cpu",
++      "unavailable-features": [
++        "mmxext",
++        "fxsr-opt",
++        "cr8legacy",
++        "sse4a",
++        "misalignsse",
++        "osvw",
++        "npt",
++        "nrip-save"
++      ],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "EPYC-IBPB",
++      "typename": "EPYC-IBPB-x86_64-cpu",
++      "unavailable-features": [
++        "mmxext",
++        "fxsr-opt",
++        "cr8legacy",
++        "sse4a",
++        "misalignsse",
++        "osvw",
++        "ibpb"
++      ],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "EPYC",
++      "typename": "EPYC-x86_64-cpu",
++      "unavailable-features": [
++        "mmxext",
++        "fxsr-opt",
++        "cr8legacy",
++        "sse4a",
++        "misalignsse",
++        "osvw"
++      ],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Dhyana-v1",
++      "typename": "Dhyana-v1-x86_64-cpu",
++      "unavailable-features": [
++        "mmxext",
++        "fxsr-opt",
++        "cr8legacy",
++        "sse4a",
++        "misalignsse",
++        "osvw",
++        "ibpb",
++        "npt",
++        "nrip-save"
++      ],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Dhyana",
++      "typename": "Dhyana-x86_64-cpu",
++      "unavailable-features": [
++        "mmxext",
++        "fxsr-opt",
++        "cr8legacy",
++        "sse4a",
++        "misalignsse",
++        "osvw",
++        "ibpb",
++        "npt",
++        "nrip-save"
++      ],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Conroe-v1",
++      "typename": "Conroe-v1-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Conroe",
++      "typename": "Conroe-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Cascadelake-Server-v2",
++      "typename": "Cascadelake-Server-v2-x86_64-cpu",
++      "unavailable-features": [
++        "mds-no"
++      ],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Cascadelake-Server-v1",
++      "typename": "Cascadelake-Server-v1-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Cascadelake-Server",
++      "typename": "Cascadelake-Server-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Broadwell-v4",
++      "typename": "Broadwell-v4-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Broadwell-v3",
++      "typename": "Broadwell-v3-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Broadwell-v2",
++      "typename": "Broadwell-v2-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Broadwell-v1",
++      "typename": "Broadwell-v1-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Broadwell-noTSX-IBRS",
++      "typename": "Broadwell-noTSX-IBRS-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Broadwell-noTSX",
++      "typename": "Broadwell-noTSX-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Broadwell-IBRS",
++      "typename": "Broadwell-IBRS-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "Broadwell",
++      "typename": "Broadwell-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "486-v1",
++      "typename": "486-v1-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    },
++    {
++      "name": "486",
++      "typename": "486-x86_64-cpu",
++      "unavailable-features": [],
++      "static": false,
++      "migration-safe": true
++    }
++  ],
++  "id": "definitions"
++}
+diff --git a/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server.sig b/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server.sig
+new file mode 100644
+index 0000000000..c6492ff310
+--- /dev/null
++++ b/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server.sig
+@@ -0,0 +1,4 @@
++0606a0
++family:     6 (0x06)
++model:    106 (0x6a)
++stepping:   0 (0x00)
+diff --git a/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server.xml b/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server.xml
+new file mode 100644
+index 0000000000..887926ae19
+--- /dev/null
++++ b/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server.xml
+@@ -0,0 +1,65 @@
++<!-- Ice Lake Server -->
++<cpudata arch='x86'>
++  <cpuid eax_in='0x00000000' ecx_in='0x00' eax='0x0000001b' ebx='0x756e6547' ecx='0x6c65746e' edx='0x49656e69'/>
++  <cpuid eax_in='0x00000001' ecx_in='0x00' eax='0x000606a0' ebx='0x25200800' ecx='0x7ffefbff' edx='0xbfebfbff'/>
++  <cpuid eax_in='0x00000002' ecx_in='0x00' eax='0x00feff01' ebx='0x000000f0' ecx='0x00000000' edx='0x00000000'/>
++  <cpuid eax_in='0x00000003' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
++  <cpuid eax_in='0x00000004' ecx_in='0x00' eax='0x3c004121' ebx='0x02c0003f' ecx='0x0000003f' edx='0x00000000'/>
++  <cpuid eax_in='0x00000004' ecx_in='0x01' eax='0x3c004122' ebx='0x01c0003f' ecx='0x0000003f' edx='0x00000000'/>
++  <cpuid eax_in='0x00000004' ecx_in='0x02' eax='0x3c004143' ebx='0x04c0003f' ecx='0x000003ff' edx='0x00000000'/>
++  <cpuid eax_in='0x00000004' ecx_in='0x03' eax='0x3c07c163' ebx='0x02c0003f' ecx='0x00006fff' edx='0x00000004'/>
++  <cpuid eax_in='0x00000005' ecx_in='0x00' eax='0x00000040' ebx='0x00000040' ecx='0x00000003' edx='0x00001020'/>
++  <cpuid eax_in='0x00000006' ecx_in='0x00' eax='0x00090ef7' ebx='0x00000002' ecx='0x00000009' edx='0x00000003'/>
++  <cpuid eax_in='0x00000007' ecx_in='0x00' eax='0x00000000' ebx='0xf3bfffff' ecx='0x40417f5e' edx='0xbc000012'/>
++  <cpuid eax_in='0x00000008' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
++  <cpuid eax_in='0x00000009' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
++  <cpuid eax_in='0x0000000a' ecx_in='0x00' eax='0x08300805' ebx='0x00000000' ecx='0x0000000f' edx='0x00008604'/>
++  <cpuid eax_in='0x0000000b' ecx_in='0x00' eax='0x00000001' ebx='0x00000002' ecx='0x00000100' edx='0x00000025'/>
++  <cpuid eax_in='0x0000000b' ecx_in='0x01' eax='0x00000005' ebx='0x0000001c' ecx='0x00000201' edx='0x00000025'/>
++  <cpuid eax_in='0x0000000c' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
++  <cpuid eax_in='0x0000000d' ecx_in='0x00' eax='0x000002e7' ebx='0x00000a88' ecx='0x00000a88' edx='0x00000000'/>
++  <cpuid eax_in='0x0000000d' ecx_in='0x01' eax='0x0000000f' ebx='0x00000988' ecx='0x00000100' edx='0x00000000'/>
++  <cpuid eax_in='0x0000000d' ecx_in='0x02' eax='0x00000100' ebx='0x00000240' ecx='0x00000000' edx='0x00000000'/>
++  <cpuid eax_in='0x0000000d' ecx_in='0x05' eax='0x00000040' ebx='0x00000440' ecx='0x00000000' edx='0x00000000'/>
++  <cpuid eax_in='0x0000000d' ecx_in='0x06' eax='0x00000200' ebx='0x00000480' ecx='0x00000000' edx='0x00000000'/>
++  <cpuid eax_in='0x0000000d' ecx_in='0x07' eax='0x00000400' ebx='0x00000680' ecx='0x00000000' edx='0x00000000'/>
++  <cpuid eax_in='0x0000000d' ecx_in='0x08' eax='0x00000080' ebx='0x00000000' ecx='0x00000001' edx='0x00000000'/>
++  <cpuid eax_in='0x0000000d' ecx_in='0x09' eax='0x00000008' ebx='0x00000a80' ecx='0x00000000' edx='0x00000000'/>
++  <cpuid eax_in='0x0000000e' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
++  <cpuid eax_in='0x0000000f' ecx_in='0x00' eax='0x00000000' ebx='0x0000006f' ecx='0x00000000' edx='0x00000002'/>
++  <cpuid eax_in='0x0000000f' ecx_in='0x01' eax='0x00000008' ebx='0x00007000' ecx='0x0000006f' edx='0x00000007'/>
++  <cpuid eax_in='0x00000010' ecx_in='0x00' eax='0x00000000' ebx='0x0000000a' ecx='0x00000000' edx='0x00000000'/>
++  <cpuid eax_in='0x00000010' ecx_in='0x01' eax='0x0000000b' ebx='0x00000c00' ecx='0x00000004' edx='0x0000000e'/>
++  <cpuid eax_in='0x00000010' ecx_in='0x03' eax='0x00000059' ebx='0x00000000' ecx='0x00000004' edx='0x0000000e'/>
++  <cpuid eax_in='0x00000011' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
++  <cpuid eax_in='0x00000012' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
++  <cpuid eax_in='0x00000013' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
++  <cpuid eax_in='0x00000014' ecx_in='0x00' eax='0x00000001' ebx='0x0000000f' ecx='0x00000007' edx='0x00000000'/>
++  <cpuid eax_in='0x00000014' ecx_in='0x01' eax='0x02490002' ebx='0x003f1fff' ecx='0x00000000' edx='0x00000000'/>
++  <cpuid eax_in='0x00000015' ecx_in='0x00' eax='0x00000002' ebx='0x000000a0' ecx='0x017d7840' edx='0x00000000'/>
++  <cpuid eax_in='0x00000016' ecx_in='0x00' eax='0x000007d0' ebx='0x00000bb8' ecx='0x00000064' edx='0x00000000'/>
++  <cpuid eax_in='0x00000017' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
++  <cpuid eax_in='0x00000018' ecx_in='0x00' eax='0x00000007' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
++  <cpuid eax_in='0x00000018' ecx_in='0x01' eax='0x00000000' ebx='0x00080007' ecx='0x00000001' edx='0x00004122'/>
++  <cpuid eax_in='0x00000018' ecx_in='0x02' eax='0x00000000' ebx='0x0010000f' ecx='0x00000001' edx='0x00004125'/>
++  <cpuid eax_in='0x00000018' ecx_in='0x03' eax='0x00000000' ebx='0x00040001' ecx='0x00000010' edx='0x00004024'/>
++  <cpuid eax_in='0x00000018' ecx_in='0x04' eax='0x00000000' ebx='0x00040006' ecx='0x00000008' edx='0x00004024'/>
++  <cpuid eax_in='0x00000018' ecx_in='0x05' eax='0x00000000' ebx='0x00080008' ecx='0x00000001' edx='0x00004124'/>
++  <cpuid eax_in='0x00000018' ecx_in='0x06' eax='0x00000000' ebx='0x00080007' ecx='0x00000080' edx='0x00004043'/>
++  <cpuid eax_in='0x00000018' ecx_in='0x07' eax='0x00000000' ebx='0x00080009' ecx='0x00000080' edx='0x00004043'/>
++  <cpuid eax_in='0x00000019' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
++  <cpuid eax_in='0x0000001a' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
++  <cpuid eax_in='0x0000001b' ecx_in='0x00' eax='0x00000001' ebx='0x00000001' ecx='0x00000000' edx='0x00000000'/>
++  <cpuid eax_in='0x80000000' ecx_in='0x00' eax='0x80000008' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
++  <cpuid eax_in='0x80000001' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x00000121' edx='0x2c100800'/>
++  <cpuid eax_in='0x80000002' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
++  <cpuid eax_in='0x80000003' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
++  <cpuid eax_in='0x80000004' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
++  <cpuid eax_in='0x80000005' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
++  <cpuid eax_in='0x80000006' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x01006040' edx='0x00000000'/>
++  <cpuid eax_in='0x80000007' ecx_in='0x00' eax='0x00000000' ebx='0x00000000' ecx='0x00000000' edx='0x00000100'/>
++  <cpuid eax_in='0x80000008' ecx_in='0x00' eax='0x00003934' ebx='0x00000200' ecx='0x00000000' edx='0x00000000'/>
++  <cpuid eax_in='0x80860000' ecx_in='0x00' eax='0x00000001' ebx='0x00000001' ecx='0x00000000' edx='0x00000000'/>
++  <cpuid eax_in='0xc0000000' ecx_in='0x00' eax='0x00000001' ebx='0x00000001' ecx='0x00000000' edx='0x00000000'/>
++  <msr index='0x10a' edx='0x00000000' eax='0x0000000b'/>
++</cpudata>
+-- 
+2.24.0
+
diff --git a/SOURCES/libvirt-qemu-Drop-disabled-CPU-features-unknown-to-QEMU.patch b/SOURCES/libvirt-qemu-Drop-disabled-CPU-features-unknown-to-QEMU.patch
new file mode 100644
index 0000000..0528871
--- /dev/null
+++ b/SOURCES/libvirt-qemu-Drop-disabled-CPU-features-unknown-to-QEMU.patch
@@ -0,0 +1,99 @@
+From 5e1f4ab125d37efb4c8224184f4cd7dd7a0cfdcd Mon Sep 17 00:00:00 2001
+Message-Id: <5e1f4ab125d37efb4c8224184f4cd7dd7a0cfdcd@dist-git>
+From: Jiri Denemark <jdenemar@redhat.com>
+Date: Fri, 22 Nov 2019 11:19:22 +0100
+Subject: [PATCH] qemu: Drop disabled CPU features unknown to QEMU
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+When a CPU definition wants to explicitly disable some features that are
+unknown to QEMU, we can safely drop them from the definition before
+starting QEMU. Naturally QEMU won't enable such features implicitly.
+
+Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
+Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
+(cherry picked from commit ac34e141596fab70fbe91a396311f80db6cb57c5)
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1775133
+https://bugzilla.redhat.com/show_bug.cgi?id=1775134
+https://bugzilla.redhat.com/show_bug.cgi?id=1775137
+
+Conflicts:
+	src/qemu/qemu_process.c
+            - downstream still uses cleanup label
+
+Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
+Message-Id: <1c07cf7bb969d38770555e7369d4578ba57bd38c.1574417839.git.jdenemar@redhat.com>
+Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
+---
+ src/qemu/qemu_process.c                       | 32 +++++++++++++++++++
+ ...-Icelake-Server-pconfig.x86_64-latest.args |  2 +-
+ 2 files changed, 33 insertions(+), 1 deletion(-)
+
+diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
+index 0cd61f02bb..0700b054f3 100644
+--- a/src/qemu/qemu_process.c
++++ b/src/qemu/qemu_process.c
+@@ -5730,6 +5730,26 @@ qemuProcessSetupHotpluggableVcpus(virQEMUDriverPtr driver,
+ }
+ 
+ 
++static bool
++qemuProcessDropUnknownCPUFeatures(const char *name,
++                                  virCPUFeaturePolicy policy,
++                                  void *opaque)
++{
++    const char **features = opaque;
++
++    if (policy != VIR_CPU_FEATURE_DISABLE &&
++        policy != VIR_CPU_FEATURE_FORBID)
++        return true;
++
++    if (virStringListHasString(features, name))
++        return true;
++
++    /* Features unknown to QEMU are implicitly disabled, we can just drop them
++     * from the definition. */
++    return false;
++}
++
++
+ static int
+ qemuProcessUpdateGuestCPU(virDomainDefPtr def,
+                           virQEMUCapsPtr qemuCaps,
+@@ -5792,6 +5812,18 @@ qemuProcessUpdateGuestCPU(virDomainDefPtr def,
+                         virQEMUCapsGetCPUDefinitions(qemuCaps, def->virtType)) < 0)
+         goto cleanup;
+ 
++    if (ARCH_IS_X86(def->os.arch)) {
++        VIR_AUTOSTRINGLIST features = NULL;
++
++        if (virQEMUCapsGetCPUFeatures(qemuCaps, def->virtType, false, &features) < 0)
++            goto cleanup;
++
++        if (features &&
++            virCPUDefFilterFeatures(def->cpu, qemuProcessDropUnknownCPUFeatures,
++                                    features) < 0)
++            goto cleanup;
++    }
++
+     def->cpu->fallback = VIR_CPU_FALLBACK_FORBID;
+     ret = 0;
+ 
+diff --git a/tests/qemuxml2argvdata/cpu-Icelake-Server-pconfig.x86_64-latest.args b/tests/qemuxml2argvdata/cpu-Icelake-Server-pconfig.x86_64-latest.args
+index 664db44e7b..de737bfed7 100644
+--- a/tests/qemuxml2argvdata/cpu-Icelake-Server-pconfig.x86_64-latest.args
++++ b/tests/qemuxml2argvdata/cpu-Icelake-Server-pconfig.x86_64-latest.args
+@@ -10,7 +10,7 @@ QEMU_AUDIO_DRV=none \
+ -object secret,id=masterKey0,format=raw,\
+ file=/tmp/lib/domain--1-test/master-key.aes \
+ -machine pc,accel=kvm,usb=off,dump-guest-core=off \
+--cpu Icelake-Server,pconfig=off \
++-cpu Icelake-Server \
+ -m 214 \
+ -realtime mlock=off \
+ -smp 1,sockets=1,cores=1,threads=1 \
+-- 
+2.24.0
+
diff --git a/SOURCES/libvirt-qemu-Fix-NULL-ptr-dereference-caused-by-qemuDomainDefFormatBufInternal.patch b/SOURCES/libvirt-qemu-Fix-NULL-ptr-dereference-caused-by-qemuDomainDefFormatBufInternal.patch
new file mode 100644
index 0000000..ba14063
--- /dev/null
+++ b/SOURCES/libvirt-qemu-Fix-NULL-ptr-dereference-caused-by-qemuDomainDefFormatBufInternal.patch
@@ -0,0 +1,51 @@
+From b21c8cad6d25e328bb93f1ec218546f09c2fbed4 Mon Sep 17 00:00:00 2001
+Message-Id: <b21c8cad6d25e328bb93f1ec218546f09c2fbed4@dist-git>
+From: Erik Skultety <eskultet@redhat.com>
+Date: Fri, 22 Nov 2019 11:19:25 +0100
+Subject: [PATCH] qemu: Fix NULL ptr dereference caused by
+ qemuDomainDefFormatBufInternal
+
+qemuDomainDefFormatBufInternal function wasn't testing whether the CPU
+was actually defined in the XML and saving such a domain resulted in the
+following backtrace:
+
+0 in qemuDomainMakeCPUMigratable (cpu=0x0)
+1 in qemuDomainDefFormatBufInternal()
+2 in qemuDomainDefFormatXMLInternal()
+3 in qemuDomainDefFormatLive()
+4 in qemuDomainSaveInternal()
+5 in qemuDomainSaveFlags()
+6 in qemuDomainSave()
+7 in virDomainSave()
+
+Signed-off-by: Erik Skultety <eskultet@redhat.com>
+Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>
+(cherry picked from commit 2816fe2e846ab3bd2bfbef123c426a17f1e1df98)
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1775133
+https://bugzilla.redhat.com/show_bug.cgi?id=1775134
+https://bugzilla.redhat.com/show_bug.cgi?id=1775137
+
+Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
+Message-Id: <13caf98777b14c8bc341de37a85c4dc04a50d78e.1574417839.git.jdenemar@redhat.com>
+Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
+---
+ src/qemu/qemu_domain.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
+index f45d7d427e..6b867ad669 100644
+--- a/src/qemu/qemu_domain.c
++++ b/src/qemu/qemu_domain.c
+@@ -7543,7 +7543,7 @@ qemuDomainDefFormatBufInternal(virQEMUDriverPtr driver,
+                 goto cleanup;
+         }
+ 
+-        if (qemuDomainMakeCPUMigratable(def->cpu) < 0)
++        if (def->cpu && qemuDomainMakeCPUMigratable(def->cpu) < 0)
+             goto cleanup;
+     }
+ 
+-- 
+2.24.0
+
diff --git a/SOURCES/libvirt-qemuxml2-test-Add-tests-for-Icelake-Server-pconfig.patch b/SOURCES/libvirt-qemuxml2-test-Add-tests-for-Icelake-Server-pconfig.patch
new file mode 100644
index 0000000..3f1cb19
--- /dev/null
+++ b/SOURCES/libvirt-qemuxml2-test-Add-tests-for-Icelake-Server-pconfig.patch
@@ -0,0 +1,128 @@
+From af4ae65466a629b58cb9493630dc4684c49f3d5e Mon Sep 17 00:00:00 2001
+Message-Id: <af4ae65466a629b58cb9493630dc4684c49f3d5e@dist-git>
+From: Jiri Denemark <jdenemar@redhat.com>
+Date: Fri, 22 Nov 2019 11:19:21 +0100
+Subject: [PATCH] qemuxml2*test: Add tests for Icelake-Server, -pconfig
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
+Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
+(cherry picked from commit ae793ecbcbd17b118ef3a876d247abb49574ab0e)
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1775133
+https://bugzilla.redhat.com/show_bug.cgi?id=1775134
+https://bugzilla.redhat.com/show_bug.cgi?id=1775137
+
+Conflicts:
+	tests/qemuxml2argvtest.c
+            - several new tests upstream
+            - test case for QEMU 3.1.0 dropped; caps data are missing
+              downstream and the case is not important here
+
+	tests/qemuxml2argvdata/cpu-Icelake-Server-pconfig.x86_64-3.1.0.args
+            - test case for QEMU 3.1.0 dropped; caps data are missing
+              downstream and the case is not important here
+
+	tests/qemuxml2argvdata/cpu-Icelake-Server-pconfig.x86_64-latest.args
+            - downstream generates slightly different command line
+
+	tests/qemuxml2xmloutdata/cpu-Icelake-Server-pconfig.x86_64-3.1.0.xml
+	tests/qemuxml2xmloutdata/cpu-Icelake-Server-pconfig.x86_64-latest.xml
+	tests/qemuxml2xmltest.c
+            - missing DO_TEST_CAPS_* macros; the change to this test was
+              dropped as it is not as important as the xml2argv test
+
+Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
+Message-Id: <874677b6cbabc2dbf7ff81fc0325de1b99790a45.1574417839.git.jdenemar@redhat.com>
+Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
+---
+ ...-Icelake-Server-pconfig.x86_64-latest.args | 31 +++++++++++++++++++
+ .../cpu-Icelake-Server-pconfig.xml            | 22 +++++++++++++
+ tests/qemuxml2argvtest.c                      |  2 ++
+ 3 files changed, 55 insertions(+)
+ create mode 100644 tests/qemuxml2argvdata/cpu-Icelake-Server-pconfig.x86_64-latest.args
+ create mode 100644 tests/qemuxml2argvdata/cpu-Icelake-Server-pconfig.xml
+
+diff --git a/tests/qemuxml2argvdata/cpu-Icelake-Server-pconfig.x86_64-latest.args b/tests/qemuxml2argvdata/cpu-Icelake-Server-pconfig.x86_64-latest.args
+new file mode 100644
+index 0000000000..664db44e7b
+--- /dev/null
++++ b/tests/qemuxml2argvdata/cpu-Icelake-Server-pconfig.x86_64-latest.args
+@@ -0,0 +1,31 @@
++LC_ALL=C \
++PATH=/bin \
++HOME=/home/test \
++USER=test \
++LOGNAME=test \
++QEMU_AUDIO_DRV=none \
++/usr/bin/qemu-system-x86_64 \
++-name guest=test,debug-threads=on \
++-S \
++-object secret,id=masterKey0,format=raw,\
++file=/tmp/lib/domain--1-test/master-key.aes \
++-machine pc,accel=kvm,usb=off,dump-guest-core=off \
++-cpu Icelake-Server,pconfig=off \
++-m 214 \
++-realtime mlock=off \
++-smp 1,sockets=1,cores=1,threads=1 \
++-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
++-display none \
++-no-user-config \
++-nodefaults \
++-chardev socket,id=charmonitor,fd=1729,server,nowait \
++-mon chardev=charmonitor,id=monitor,mode=control \
++-rtc base=utc \
++-no-shutdown \
++-no-acpi \
++-boot strict=on \
++-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \
++-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 \
++-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\
++resourcecontrol=deny \
++-msg timestamp=on
+diff --git a/tests/qemuxml2argvdata/cpu-Icelake-Server-pconfig.xml b/tests/qemuxml2argvdata/cpu-Icelake-Server-pconfig.xml
+new file mode 100644
+index 0000000000..ec64e1ee51
+--- /dev/null
++++ b/tests/qemuxml2argvdata/cpu-Icelake-Server-pconfig.xml
+@@ -0,0 +1,22 @@
++<domain type='kvm'>
++  <name>test</name>
++  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
++  <memory unit='KiB'>219100</memory>
++  <currentMemory unit='KiB'>219100</currentMemory>
++  <vcpu placement='static'>1</vcpu>
++  <os>
++    <type arch='x86_64' machine='pc'>hvm</type>
++    <boot dev='network'/>
++  </os>
++  <cpu mode='custom' match='exact' check='none'>
++    <model fallback='forbid'>Icelake-Server</model>
++    <feature name='pconfig' policy='disable'/>
++  </cpu>
++  <clock offset='utc'/>
++  <on_poweroff>destroy</on_poweroff>
++  <on_reboot>restart</on_reboot>
++  <on_crash>destroy</on_crash>
++  <devices>
++      <emulator>/usr/bin/qemu-system-x86_64</emulator>
++  </devices>
++</domain>
+diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
+index 03d6a60736..5aff9b6e37 100644
+--- a/tests/qemuxml2argvtest.c
++++ b/tests/qemuxml2argvtest.c
+@@ -3000,6 +3000,8 @@ mymain(void)
+ 
+     DO_TEST_CAPS_VER("launch-security-sev", "2.12.0");
+ 
++    DO_TEST_CAPS_LATEST("cpu-Icelake-Server-pconfig");
++
+     if (getenv("LIBVIRT_SKIP_CLEANUP") == NULL)
+         virFileDeleteTree(fakerootdir);
+ 
+-- 
+2.24.0
+
diff --git a/SPECS/libvirt.spec b/SPECS/libvirt.spec
index a176088..ed2dd31 100644
--- a/SPECS/libvirt.spec
+++ b/SPECS/libvirt.spec
@@ -37,7 +37,7 @@
     %define with_qemu_tcg 0
     %define qemu_kvm_arches x86_64
     %if 0%{?rhel} >= 7
-        %define qemu_kvm_arches x86_64 %{power64} aarch64 s390x %{arm}
+        %define qemu_kvm_arches x86_64 %{power64} aarch64 s390x
     %endif
 %endif
 
@@ -251,7 +251,7 @@
 Summary: Library providing a simple virtualization API
 Name: libvirt
 Version: 4.5.0
-Release: 35%{?dist}%{?extra_release}
+Release: 35.1%{?dist}%{?extra_release}
 License: LGPLv2+
 URL: https://libvirt.org/
 
@@ -804,6 +804,12 @@ Patch540: libvirt-vircgroupv2-fix-parsing-multiple-values-in-single-file.patch
 Patch541: libvirt-vircgroupv2-fix-virCgroupV2GetCpuCfsQuota-for-max-value.patch
 Patch542: libvirt-vircgroupv2-fix-abort-in-VIR_AUTOFREE.patch
 Patch543: libvirt-vircgroupv2-fix-setting-cpu.max-period.patch
+Patch544: libvirt-cpu_conf-Pass-policy-to-CPU-feature-filtering-callbacks.patch
+Patch545: libvirt-qemuxml2-test-Add-tests-for-Icelake-Server-pconfig.patch
+Patch546: libvirt-qemu-Drop-disabled-CPU-features-unknown-to-QEMU.patch
+Patch547: libvirt-cputest-Add-data-for-Ice-Lake-Server-CPU.patch
+Patch548: libvirt-cpu_map-Drop-pconfig-from-Icelake-Server-CPU-model.patch
+Patch549: libvirt-qemu-Fix-NULL-ptr-dereference-caused-by-qemuDomainDefFormatBufInternal.patch
 
 Requires: libvirt-daemon = %{version}-%{release}
 Requires: libvirt-daemon-config-network = %{version}-%{release}
@@ -2715,6 +2721,14 @@ exit 0
 
 
 %changelog
+* Wed Nov 27 2019 Jiri Denemark <jdenemar@redhat.com> - 4.5.0-35.1.el8
+- cpu_conf: Pass policy to CPU feature filtering callbacks (rhbz#1775133, rhbz#1775134, rhbz#1775137)
+- qemuxml2*test: Add tests for Icelake-Server, -pconfig (rhbz#1775133, rhbz#1775134, rhbz#1775137)
+- qemu: Drop disabled CPU features unknown to QEMU (rhbz#1775133, rhbz#1775134, rhbz#1775137)
+- cputest: Add data for Ice Lake Server CPU (rhbz#1775133, rhbz#1775134, rhbz#1775137)
+- cpu_map: Drop pconfig from Icelake-Server CPU model (rhbz#1775133, rhbz#1775134, rhbz#1775137)
+- qemu: Fix NULL ptr dereference caused by qemuDomainDefFormatBufInternal (rhbz#1775133, rhbz#1775134, rhbz#1775137)
+
 * Mon Sep 16 2019 Jiri Denemark <jdenemar@redhat.com> - 4.5.0-35
 - vircgroupv2: fix setting cpu.max period (rhbz#1749227)