[libvirt] [PATCH 0/6] qemu: Fix "Property '.pconfig' not found" error

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 Jiri Denemark (6): cpu_conf: Pass policy to CPU feature filtering callbacks qemuxml2*test: Add tests for Icelake-Server,-pconfig qemu: Drop disabled CPU features unknown to QEMU cpu_map: Drop comments about ospke cputest: Add data for Ice Lake Server CPU cpu_map: Drop pconfig from Icelake-Server CPU model 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/cpu_map/x86_Cascadelake-Server.xml | 2 - src/cpu_map/x86_Icelake-Client.xml | 2 - src/cpu_map/x86_Icelake-Server.xml | 3 - src/qemu/qemu_capabilities.c | 1 + src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_domain.c | 23 + src/qemu/qemu_domain.h | 3 + src/qemu/qemu_migration_cookie.c | 3 + src/qemu/qemu_process.c | 32 + 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 | 35 + .../x86_64-cpuid-Ice-Lake-Server-host.xml | 36 + .../x86_64-cpuid-Ice-Lake-Server-json.xml | 16 + .../x86_64-cpuid-Ice-Lake-Server.json | 1142 +++++++++++++++++ .../x86_64-cpuid-Ice-Lake-Server.sig | 4 + .../x86_64-cpuid-Ice-Lake-Server.xml | 65 + ...u-Icelake-Server-pconfig.x86_64-3.1.0.args | 34 + ...-Icelake-Server-pconfig.x86_64-latest.args | 34 + .../cpu-Icelake-Server-pconfig.xml | 22 + tests/qemuxml2argvtest.c | 3 + ...pu-Icelake-Server-pconfig.x86_64-3.1.0.xml | 31 + ...u-Icelake-Server-pconfig.x86_64-latest.xml | 31 + tests/qemuxml2xmltest.c | 3 + 29 files changed, 1555 insertions(+), 11 deletions(-) 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 create mode 100644 tests/qemuxml2argvdata/cpu-Icelake-Server-pconfig.x86_64-3.1.0.args create mode 100644 tests/qemuxml2argvdata/cpu-Icelake-Server-pconfig.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/cpu-Icelake-Server-pconfig.xml create mode 100644 tests/qemuxml2xmloutdata/cpu-Icelake-Server-pconfig.x86_64-3.1.0.xml create mode 100644 tests/qemuxml2xmloutdata/cpu-Icelake-Server-pconfig.x86_64-latest.xml -- 2.24.0

Signed-off-by: Jiri Denemark <jdenemar@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 2b644638a7..a38101d024 100644 --- a/src/conf/cpu_conf.c +++ b/src/conf/cpu_conf.c @@ -147,7 +147,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++; @@ -937,7 +937,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; } @@ -972,7 +972,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 30904fab95..a9f8abeef1 100644 --- a/src/conf/cpu_conf.h +++ b/src/conf/cpu_conf.h @@ -161,6 +161,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 abe4865ec2..db34cbdb5c 100644 --- a/src/cpu/cpu_x86.c +++ b/src/cpu/cpu_x86.c @@ -3238,6 +3238,15 @@ virCPUx86ExpandFeatures(virCPUDefPtr cpu) } +static bool +x86FeatureFilterMigratable(const char *name, + virCPUFeaturePolicy policy G_GNUC_UNUSED, + void *cpu_map) +{ + return x86FeatureIsMigratable(name, cpu_map); +} + + static virCPUDefPtr virCPUx86CopyMigratable(virCPUDefPtr cpu) { @@ -3251,7 +3260,7 @@ virCPUx86CopyMigratable(virCPUDefPtr cpu) return NULL; if (virCPUDefCopyModelFilter(copy, cpu, false, - x86FeatureIsMigratable, map) < 0) + x86FeatureFilterMigratable, map) < 0) goto error; return copy; @@ -3386,6 +3395,7 @@ virCPUx86FeatureIsMSR(const char *name) */ bool virCPUx86FeatureFilterSelectMSR(const char *name, + virCPUFeaturePolicy policy G_GNUC_UNUSED, void *opaque G_GNUC_UNUSED) { return virCPUx86FeatureIsMSR(name); @@ -3402,6 +3412,7 @@ virCPUx86FeatureFilterSelectMSR(const char *name, */ bool virCPUx86FeatureFilterDropMSR(const char *name, + virCPUFeaturePolicy policy G_GNUC_UNUSED, void *opaque G_GNUC_UNUSED) { return !virCPUx86FeatureIsMSR(name); diff --git a/src/cpu/cpu_x86.h b/src/cpu/cpu_x86.h index 3ea38d1701..3b1aabe98d 100644 --- a/src/cpu/cpu_x86.h +++ b/src/cpu/cpu_x86.h @@ -42,7 +42,9 @@ 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); diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index fc6473651c..29e2d6d5d7 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -2910,6 +2910,7 @@ virQEMUCapsProbeQMPSEVCapabilities(virQEMUCapsPtr qemuCaps, */ bool virQEMUCapsCPUFilterFeatures(const char *name, + virCPUFeaturePolicy policy G_GNUC_UNUSED, void *opaque) { virArch *arch = opaque; diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 32e9798cda..aa593396ce 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -667,6 +667,7 @@ bool virQEMUCapsGuestIsNative(virArch host, virArch guest); bool virQEMUCapsCPUFilterFeatures(const char *name, + virCPUFeaturePolicy policy, void *opaque); const char * -- 2.24.0

Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- ...u-Icelake-Server-pconfig.x86_64-3.1.0.args | 34 +++++++++++++++++++ ...-Icelake-Server-pconfig.x86_64-latest.args | 34 +++++++++++++++++++ .../cpu-Icelake-Server-pconfig.xml | 22 ++++++++++++ tests/qemuxml2argvtest.c | 3 ++ ...pu-Icelake-Server-pconfig.x86_64-3.1.0.xml | 31 +++++++++++++++++ ...u-Icelake-Server-pconfig.x86_64-latest.xml | 31 +++++++++++++++++ tests/qemuxml2xmltest.c | 3 ++ 7 files changed, 158 insertions(+) create mode 100644 tests/qemuxml2argvdata/cpu-Icelake-Server-pconfig.x86_64-3.1.0.args create mode 100644 tests/qemuxml2argvdata/cpu-Icelake-Server-pconfig.x86_64-latest.args create mode 100644 tests/qemuxml2argvdata/cpu-Icelake-Server-pconfig.xml create mode 100644 tests/qemuxml2xmloutdata/cpu-Icelake-Server-pconfig.x86_64-3.1.0.xml create mode 100644 tests/qemuxml2xmloutdata/cpu-Icelake-Server-pconfig.x86_64-latest.xml diff --git a/tests/qemuxml2argvdata/cpu-Icelake-Server-pconfig.x86_64-3.1.0.args b/tests/qemuxml2argvdata/cpu-Icelake-Server-pconfig.x86_64-3.1.0.args new file mode 100644 index 0000000000..96d4306238 --- /dev/null +++ b/tests/qemuxml2argvdata/cpu-Icelake-Server-pconfig.x86_64-3.1.0.args @@ -0,0 +1,34 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-test \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-test/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-test/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-test/.config \ +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-i440fx-3.1,accel=kvm,usb=off,dump-guest-core=off \ +-cpu Icelake-Server,pconfig=off \ +-m 214 \ +-overcommit mem-lock=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.x86_64-latest.args b/tests/qemuxml2argvdata/cpu-Icelake-Server-pconfig.x86_64-latest.args new file mode 100644 index 0000000000..d6f5a0ad98 --- /dev/null +++ b/tests/qemuxml2argvdata/cpu-Icelake-Server-pconfig.x86_64-latest.args @@ -0,0 +1,34 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/tmp/lib/domain--1-test \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/tmp/lib/domain--1-test/.local/share \ +XDG_CACHE_HOME=/tmp/lib/domain--1-test/.cache \ +XDG_CONFIG_HOME=/tmp/lib/domain--1-test/.config \ +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 \ +-overcommit mem-lock=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 8c8743abc1..576d6bc583 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -3027,6 +3027,9 @@ mymain(void) DO_TEST_CAPS_LATEST("vhost-user-vga"); DO_TEST_CAPS_LATEST("vhost-user-gpu-secondary"); + DO_TEST_CAPS_VER("cpu-Icelake-Server-pconfig", "3.1.0"); + DO_TEST_CAPS_LATEST("cpu-Icelake-Server-pconfig"); + if (getenv("LIBVIRT_SKIP_CLEANUP") == NULL) virFileDeleteTree(fakerootdir); diff --git a/tests/qemuxml2xmloutdata/cpu-Icelake-Server-pconfig.x86_64-3.1.0.xml b/tests/qemuxml2xmloutdata/cpu-Icelake-Server-pconfig.x86_64-3.1.0.xml new file mode 100644 index 0000000000..3cb295e713 --- /dev/null +++ b/tests/qemuxml2xmloutdata/cpu-Icelake-Server-pconfig.x86_64-3.1.0.xml @@ -0,0 +1,31 @@ +<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-i440fx-3.1'>hvm</type> + <boot dev='network'/> + </os> + <cpu mode='custom' match='exact' check='none'> + <model fallback='forbid'>Icelake-Server</model> + <feature policy='disable' name='pconfig'/> + </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> + <controller type='usb' index='0' model='piix3-uhci'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> + </controller> + <controller type='pci' index='0' model='pci-root'/> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </memballoon> + </devices> +</domain> diff --git a/tests/qemuxml2xmloutdata/cpu-Icelake-Server-pconfig.x86_64-latest.xml b/tests/qemuxml2xmloutdata/cpu-Icelake-Server-pconfig.x86_64-latest.xml new file mode 100644 index 0000000000..77e5d66f88 --- /dev/null +++ b/tests/qemuxml2xmloutdata/cpu-Icelake-Server-pconfig.x86_64-latest.xml @@ -0,0 +1,31 @@ +<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 policy='disable' name='pconfig'/> + </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> + <controller type='usb' index='0' model='piix3-uhci'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> + </controller> + <controller type='pci' index='0' model='pci-root'/> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </memballoon> + </devices> +</domain> diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index a6c6c20ac1..823195255d 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -1342,6 +1342,9 @@ mymain(void) DO_TEST_CAPS_ARCH_LATEST("x86_64-pc-graphics", "x86_64"); DO_TEST_CAPS_ARCH_LATEST("x86_64-q35-graphics", "x86_64"); + DO_TEST_CAPS_VER("cpu-Icelake-Server-pconfig", "3.1.0"); + DO_TEST_CAPS_LATEST("cpu-Icelake-Server-pconfig"); + if (getenv("LIBVIRT_SKIP_CLEANUP") == NULL) virFileDeleteTree(fakerootdir); -- 2.24.0

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> --- 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 ed8666e9d1..06c9eba16c 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -6068,6 +6068,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, @@ -6133,6 +6153,18 @@ qemuProcessUpdateGuestCPU(virDomainDefPtr def, &def->os.arch) < 0) return -1; + if (ARCH_IS_X86(def->os.arch)) { + VIR_AUTOSTRINGLIST features = NULL; + + if (virQEMUCapsGetCPUFeatures(qemuCaps, def->virtType, false, &features) < 0) + return -1; + + if (features && + virCPUDefFilterFeatures(def->cpu, qemuProcessDropUnknownCPUFeatures, + features) < 0) + return -1; + } + return 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 d6f5a0ad98..88d05a482a 100644 --- a/tests/qemuxml2argvdata/cpu-Icelake-Server-pconfig.x86_64-latest.args +++ b/tests/qemuxml2argvdata/cpu-Icelake-Server-pconfig.x86_64-latest.args @@ -13,7 +13,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 \ -overcommit mem-lock=off \ -smp 1,sockets=1,cores=1,threads=1 \ -- 2.24.0

QEMU does not support setting this feature on the command line anymore. We don't need to explain why it is not included in CPU models then. Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- src/cpu_map/x86_Cascadelake-Server.xml | 2 -- src/cpu_map/x86_Icelake-Client.xml | 2 -- src/cpu_map/x86_Icelake-Server.xml | 2 -- 3 files changed, 6 deletions(-) diff --git a/src/cpu_map/x86_Cascadelake-Server.xml b/src/cpu_map/x86_Cascadelake-Server.xml index 7c7fc92c40..b69ac198b6 100644 --- a/src/cpu_map/x86_Cascadelake-Server.xml +++ b/src/cpu_map/x86_Cascadelake-Server.xml @@ -43,8 +43,6 @@ <feature name='msr'/> <feature name='mtrr'/> <feature name='nx'/> - <!-- 'ospke' is a dynamic feature and cannot be enabled manually - see QEMU's commit 9ccb9784b57 for more details --> <feature name='pae'/> <feature name='pat'/> <feature name='pcid'/> diff --git a/src/cpu_map/x86_Icelake-Client.xml b/src/cpu_map/x86_Icelake-Client.xml index 0b16bbcc5e..fbd53bbe11 100644 --- a/src/cpu_map/x86_Icelake-Client.xml +++ b/src/cpu_map/x86_Icelake-Client.xml @@ -42,8 +42,6 @@ <feature name='msr'/> <feature name='mtrr'/> <feature name='nx'/> - <!-- 'ospke' is a dynamic feature and cannot be enabled manually - see QEMU's commit 9ccb9784b57 for more details --> <feature name='pae'/> <feature name='pat'/> <feature name='pcid'/> diff --git a/src/cpu_map/x86_Icelake-Server.xml b/src/cpu_map/x86_Icelake-Server.xml index fb15977a59..ecd21cf5c7 100644 --- a/src/cpu_map/x86_Icelake-Server.xml +++ b/src/cpu_map/x86_Icelake-Server.xml @@ -50,8 +50,6 @@ <feature name='msr'/> <feature name='mtrr'/> <feature name='nx'/> - <!-- 'ospke' is a dynamic feature and cannot be enabled manually - see QEMU's commit 9ccb9784b57 for more details --> <feature name='pae'/> <feature name='pat'/> <feature name='pcid'/> -- 2.24.0

Signed-off-by: Jiri Denemark <jdenemar@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 a277224918..e6a4aefe9b 100644 --- a/tests/cputest.c +++ b/tests/cputest.c @@ -1297,6 +1297,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

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> --- src/cpu_map/x86_Icelake-Server.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_map/x86_Icelake-Server.xml b/src/cpu_map/x86_Icelake-Server.xml index ecd21cf5c7..a565371977 100644 --- a/src/cpu_map/x86_Icelake-Server.xml +++ b/src/cpu_map/x86_Icelake-Server.xml @@ -54,7 +54,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 58a82fbd60..4a641019be 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -8921,6 +8921,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, virQEMUCapsPtr qemuCaps, @@ -9103,6 +9123,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 b23912ee98..a458af79f7 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -1225,3 +1225,6 @@ qemuDomainValidateActualNetDef(const virDomainNetDef *net, int qemuDomainSupportsCheckpointsBlockjobs(virDomainObjPtr vm) G_GNUC_WARN_UNUSED_RESULT; + +int +qemuDomainMakeCPUMigratable(virCPUDefPtr cpu); diff --git a/src/qemu/qemu_migration_cookie.c b/src/qemu/qemu_migration_cookie.c index 27e6bde601..5f64800aec 100644 --- a/src/qemu/qemu_migration_cookie.c +++ b/src/qemu/qemu_migration_cookie.c @@ -536,6 +536,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

On Mon, Nov 11, 2019 at 09:35:37PM +0100, Jiri Denemark wrote:
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> --- src/cpu_map/x86_Icelake-Server.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_map/x86_Icelake-Server.xml b/src/cpu_map/x86_Icelake-Server.xml index ecd21cf5c7..a565371977 100644 --- a/src/cpu_map/x86_Icelake-Server.xml +++ b/src/cpu_map/x86_Icelake-Server.xml @@ -54,7 +54,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 58a82fbd60..4a641019be 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -8921,6 +8921,26 @@ qemuDomainDefCopy(virQEMUDriverPtr driver, }
+int +qemuDomainMakeCPUMigratable(virCPUDefPtr cpu) +{ + if (cpu->mode == VIR_CPU_MODE_CUSTOM && + STREQ_NULLABLE(cpu->model, "Icelake-Server")) {
This might need tweaking when we merge support for versioned CPU I presume, but not a blocker for this series as is.
+ /* 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; +} +
Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|

On Mon, Nov 11, 2019 at 09:35:31PM +0100, Jiri Denemark wrote:
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
Jiri Denemark (6): cpu_conf: Pass policy to CPU feature filtering callbacks qemuxml2*test: Add tests for Icelake-Server,-pconfig qemu: Drop disabled CPU features unknown to QEMU cpu_map: Drop comments about ospke cputest: Add data for Ice Lake Server CPU cpu_map: Drop pconfig from Icelake-Server CPU model
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
participants (2)
-
Daniel P. Berrangé
-
Jiri Denemark