[libvirt PATCH v2 0/9] Add missing feature detection to sync tool in cpu_map

sync_qemu_i386.py in src/cpu_map is a tool to sync CPU models from qemu with libvirt. It currently has no provisions for detecting new features that are not implemented in libvirt yet. This series changes that. Currently missing x86 CPU models: * "Denverton" * "KnightsMill" * "Snowridge" Currently missing x86 CPU features: * "core-capability" * "fsrm" * "split-lock-detect" "fsrm" is added in this series. For the "Snowridge" CPU model and the "core-capability" and "split-lock-detect" features, see https://www.redhat.com/archives/libvir-list/2020-November/msg00924.html. V1: https://www.redhat.com/archives/libvir-list/2020-November/msg01002.html Tim Wiederhake (9): cpu_map: sync_qemu_cpu_i386: Translate features in model versions cpu_map: sync_qemu_cpu_i386: Factor out translation of vendors cpu_map: sync_qemu_cpu_i386: Factor out translation of features cpu_map: sync_qemu_cpu_i386: Do not ignore CPUID_EXT_MONITOR cpu_map: sync_qemu_cpu_i386: Simplify ignore features cpu_map: sync_qemu_cpu_i386: Translate qemu feature pretty names cpu_map: sync_qemu_cpu_i386: Add missing features cpu_map: sync_qemu_cpu_i386: Detect features missing in libvirt cpu_map: Add missing feature fsrm src/cpu_map/sync_qemu_i386.py | 340 ++++++++++-------- src/cpu_map/x86_features.xml | 3 + .../x86_64-cpuid-Ice-Lake-Server-guest.xml | 1 + .../x86_64-cpuid-Ice-Lake-Server-host.xml | 1 + 4 files changed, 198 insertions(+), 147 deletions(-) -- 2.26.2

Signed-off-by: Tim Wiederhake <twiederh@redhat.com> --- src/cpu_map/sync_qemu_i386.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/cpu_map/sync_qemu_i386.py b/src/cpu_map/sync_qemu_i386.py index 8deda869df..82413d831e 100755 --- a/src/cpu_map/sync_qemu_i386.py +++ b/src/cpu_map/sync_qemu_i386.py @@ -292,6 +292,8 @@ def expand_model(model): props = version.pop(".props", dict()) for k, v in props: + if k not in ("model-id", "stepping", "model"): + k = T.get(k, k) if v == "on": result["features"].add(k) elif v == "off" and k in result["features"]: -- 2.26.2

Signed-off-by: Tim Wiederhake <twiederh@redhat.com> --- src/cpu_map/sync_qemu_i386.py | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/cpu_map/sync_qemu_i386.py b/src/cpu_map/sync_qemu_i386.py index 82413d831e..fe95f26511 100755 --- a/src/cpu_map/sync_qemu_i386.py +++ b/src/cpu_map/sync_qemu_i386.py @@ -8,11 +8,6 @@ import re T = { - # translating qemu -> libvirt cpu vendor names - "CPUID_VENDOR_AMD": "AMD", - "CPUID_VENDOR_INTEL": "Intel", - "CPUID_VENDOR_HYGON": "Hygon", - # translating qemu -> libvirt cpu feature names "CPUID_6_EAX_ARAT": "arat", "CPUID_7_0_EBX_ADX": "adx", @@ -152,6 +147,20 @@ T = { } +def translate_vendor(name): + T = { + "CPUID_VENDOR_AMD": "AMD", + "CPUID_VENDOR_INTEL": "Intel", + "CPUID_VENDOR_HYGON": "Hygon", + } + + if name in T: + return T[name] + + print("warning: Unknown vendor '{}'".format(name)) + return name + + def readline_cont(f): """Read one logical line from a file `f` i.e. continues lines that end in a backslash.""" @@ -264,7 +273,7 @@ def expand_model(model): result = { "name": model.pop(".name"), - "vendor": T[model.pop(".vendor")], + "vendor": translate_vendor(model.pop(".vendor")), "features": set(), "extra": dict()} -- 2.26.2

Signed-off-by: Tim Wiederhake <twiederh@redhat.com> --- src/cpu_map/sync_qemu_i386.py | 291 +++++++++++++++++----------------- 1 file changed, 149 insertions(+), 142 deletions(-) diff --git a/src/cpu_map/sync_qemu_i386.py b/src/cpu_map/sync_qemu_i386.py index fe95f26511..6a5a02dbd1 100755 --- a/src/cpu_map/sync_qemu_i386.py +++ b/src/cpu_map/sync_qemu_i386.py @@ -7,146 +7,6 @@ import os import re -T = { - # translating qemu -> libvirt cpu feature names - "CPUID_6_EAX_ARAT": "arat", - "CPUID_7_0_EBX_ADX": "adx", - "CPUID_7_0_EBX_AVX2": "avx2", - "CPUID_7_0_EBX_AVX512BW": "avx512bw", - "CPUID_7_0_EBX_AVX512CD": "avx512cd", - "CPUID_7_0_EBX_AVX512DQ": "avx512dq", - "CPUID_7_0_EBX_AVX512ER": "avx512er", - "CPUID_7_0_EBX_AVX512F": "avx512f", - "CPUID_7_0_EBX_AVX512PF": "avx512pf", - "CPUID_7_0_EBX_AVX512VL": "avx512vl", - "CPUID_7_0_EBX_BMI1": "bmi1", - "CPUID_7_0_EBX_BMI2": "bmi2", - "CPUID_7_0_EBX_CLFLUSHOPT": "clflushopt", - "CPUID_7_0_EBX_CLWB": "clwb", - "CPUID_7_0_EBX_ERMS": "erms", - "CPUID_7_0_EBX_FSGSBASE": "fsgsbase", - "CPUID_7_0_EBX_HLE": "hle", - "CPUID_7_0_EBX_INVPCID": "invpcid", - "CPUID_7_0_EBX_MPX": "mpx", - "CPUID_7_0_EBX_RDSEED": "rdseed", - "CPUID_7_0_EBX_RTM": "rtm", - "CPUID_7_0_EBX_SHA_NI": "sha-ni", - "CPUID_7_0_EBX_SMAP": "smap", - "CPUID_7_0_EBX_SMEP": "smep", - "CPUID_7_0_ECX_AVX512BITALG": "avx512bitalg", - "CPUID_7_0_ECX_AVX512_VBMI2": "avx512vbmi2", - "CPUID_7_0_ECX_AVX512_VBMI": "avx512vbmi", - "CPUID_7_0_ECX_AVX512VNNI": "avx512vnni", - "CPUID_7_0_ECX_AVX512_VPOPCNTDQ": "avx512-vpopcntdq", - "CPUID_7_0_ECX_CLDEMOTE": "cldemote", - "CPUID_7_0_ECX_GFNI": "gfni", - "CPUID_7_0_ECX_LA57": "la57", - "CPUID_7_0_ECX_MOVDIR64B": "movdir64b", - "CPUID_7_0_ECX_MOVDIRI": "movdiri", - "CPUID_7_0_ECX_PKU": "pku", - "CPUID_7_0_ECX_RDPID": "rdpid", - "CPUID_7_0_ECX_UMIP": "umip", - "CPUID_7_0_ECX_VAES": "vaes", - "CPUID_7_0_ECX_VPCLMULQDQ": "vpclmulqdq", - "CPUID_7_0_EDX_ARCH_CAPABILITIES": "arch-capabilities", - "CPUID_7_0_EDX_AVX512_4FMAPS": "avx512-4fmaps", - "CPUID_7_0_EDX_AVX512_4VNNIW": "avx512-4vnniw", - "CPUID_7_0_EDX_CORE_CAPABILITY": "core-capability", - "CPUID_7_0_EDX_SPEC_CTRL": "spec-ctrl", - "CPUID_7_0_EDX_SPEC_CTRL_SSBD": "ssbd", - "CPUID_7_0_EDX_STIBP": "stibp", - "CPUID_7_1_EAX_AVX512_BF16": "avx512-bf16", - "CPUID_8000_0008_EBX_CLZERO": "clzero", - "CPUID_8000_0008_EBX_IBPB": "ibpb", - "CPUID_8000_0008_EBX_STIBP": "amd-stibp", - "CPUID_8000_0008_EBX_WBNOINVD": "wbnoinvd", - "CPUID_8000_0008_EBX_XSAVEERPTR": "xsaveerptr", - "CPUID_ACPI": "acpi", - "CPUID_APIC": "apic", - "CPUID_CLFLUSH": "clflush", - "CPUID_CMOV": "cmov", - "CPUID_CX8": "cx8", - "CPUID_DE": "de", - "CPUID_EXT2_3DNOW": "3dnow", - "CPUID_EXT2_3DNOWEXT": "3dnowext", - "CPUID_EXT2_FFXSR": "fxsr_opt", - "CPUID_EXT2_LM": "lm", - "CPUID_EXT2_MMXEXT": "mmxext", - "CPUID_EXT2_NX": "nx", - "CPUID_EXT2_PDPE1GB": "pdpe1gb", - "CPUID_EXT2_RDTSCP": "rdtscp", - "CPUID_EXT2_SYSCALL": "syscall", - "CPUID_EXT3_3DNOWPREFETCH": "3dnowprefetch", - "CPUID_EXT3_ABM": "abm", - "CPUID_EXT3_CR8LEG": "cr8legacy", - "CPUID_EXT3_FMA4": "fma4", - "CPUID_EXT3_LAHF_LM": "lahf_lm", - "CPUID_EXT3_MISALIGNSSE": "misalignsse", - "CPUID_EXT3_OSVW": "osvw", - "CPUID_EXT3_PERFCORE": "perfctr_core", - "CPUID_EXT3_SSE4A": "sse4a", - "CPUID_EXT3_SVM": "svm", - "CPUID_EXT3_TBM": "tbm", - "CPUID_EXT3_XOP": "xop", - "CPUID_EXT_AES": "aes", - "CPUID_EXT_AVX": "avx", - "CPUID_EXT_CX16": "cx16", - "CPUID_EXT_F16C": "f16c", - "CPUID_EXT_FMA": "fma", - "CPUID_EXT_MOVBE": "movbe", - "CPUID_EXT_PCID": "pcid", - "CPUID_EXT_PCLMULQDQ": "pclmuldq", - "CPUID_EXT_POPCNT": "popcnt", - "CPUID_EXT_RDRAND": "rdrand", - "CPUID_EXT_SSE3": "pni", - "CPUID_EXT_SSE41": "sse4.1", - "CPUID_EXT_SSE42": "sse4.2", - "CPUID_EXT_SSSE3": "ssse3", - "CPUID_EXT_TSC_DEADLINE_TIMER": "tsc-deadline", - "CPUID_EXT_X2APIC": "x2apic", - "CPUID_EXT_XSAVE": "xsave", - "CPUID_FP87": "fpu", - "CPUID_FXSR": "fxsr", - "CPUID_MCA": "mca", - "CPUID_MCE": "mce", - "CPUID_MMX": "mmx", - "CPUID_MSR": "msr", - "CPUID_MTRR": "mtrr", - "CPUID_PAE": "pae", - "CPUID_PAT": "pat", - "CPUID_PGE": "pge", - "CPUID_PSE36": "pse36", - "CPUID_PSE": "pse", - "CPUID_SEP": "sep", - "CPUID_SSE2": "sse2", - "CPUID_SSE": "sse", - "CPUID_SS": "ss", - "CPUID_SVM_NPT": "npt", - "CPUID_SVM_NRIPSAVE": "nrip-save", - "CPUID_TSC": "tsc", - "CPUID_VME": "vme", - "CPUID_XSAVE_XGETBV1": "xgetbv1", - "CPUID_XSAVE_XSAVEC": "xsavec", - "CPUID_XSAVE_XSAVEOPT": "xsaveopt", - "CPUID_XSAVE_XSAVES": "xsaves", - "MSR_ARCH_CAP_IBRS_ALL": "ibrs-all", - "MSR_ARCH_CAP_MDS_NO": "mds-no", - "MSR_ARCH_CAP_PSCHANGE_MC_NO": "pschange-mc-no", - "MSR_ARCH_CAP_RDCL_NO": "rdctl-no", - "MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY": "skip-l1dfl-vmentry", - "MSR_ARCH_CAP_TAA_NO": "taa-no", - "MSR_CORE_CAP_SPLIT_LOCK_DETECT": "split-lock-detect", - - # always disabled features - "CPUID_EXT_MONITOR": None, - "0": None, - - # set to "no auto enable" by qemu - "CPUID_EXT3_TOPOEXT": None, - "MSR_VMX_BASIC_DUAL_MONITOR": None, -} - - def translate_vendor(name): T = { "CPUID_VENDOR_AMD": "AMD", @@ -161,6 +21,153 @@ def translate_vendor(name): return name +def translate_feature(name): + T = { + # translating qemu -> libvirt cpu feature names + "CPUID_6_EAX_ARAT": "arat", + "CPUID_7_0_EBX_ADX": "adx", + "CPUID_7_0_EBX_AVX2": "avx2", + "CPUID_7_0_EBX_AVX512BW": "avx512bw", + "CPUID_7_0_EBX_AVX512CD": "avx512cd", + "CPUID_7_0_EBX_AVX512DQ": "avx512dq", + "CPUID_7_0_EBX_AVX512ER": "avx512er", + "CPUID_7_0_EBX_AVX512F": "avx512f", + "CPUID_7_0_EBX_AVX512PF": "avx512pf", + "CPUID_7_0_EBX_AVX512VL": "avx512vl", + "CPUID_7_0_EBX_BMI1": "bmi1", + "CPUID_7_0_EBX_BMI2": "bmi2", + "CPUID_7_0_EBX_CLFLUSHOPT": "clflushopt", + "CPUID_7_0_EBX_CLWB": "clwb", + "CPUID_7_0_EBX_ERMS": "erms", + "CPUID_7_0_EBX_FSGSBASE": "fsgsbase", + "CPUID_7_0_EBX_HLE": "hle", + "CPUID_7_0_EBX_INVPCID": "invpcid", + "CPUID_7_0_EBX_MPX": "mpx", + "CPUID_7_0_EBX_RDSEED": "rdseed", + "CPUID_7_0_EBX_RTM": "rtm", + "CPUID_7_0_EBX_SHA_NI": "sha-ni", + "CPUID_7_0_EBX_SMAP": "smap", + "CPUID_7_0_EBX_SMEP": "smep", + "CPUID_7_0_ECX_AVX512BITALG": "avx512bitalg", + "CPUID_7_0_ECX_AVX512_VBMI2": "avx512vbmi2", + "CPUID_7_0_ECX_AVX512_VBMI": "avx512vbmi", + "CPUID_7_0_ECX_AVX512VNNI": "avx512vnni", + "CPUID_7_0_ECX_AVX512_VPOPCNTDQ": "avx512-vpopcntdq", + "CPUID_7_0_ECX_CLDEMOTE": "cldemote", + "CPUID_7_0_ECX_GFNI": "gfni", + "CPUID_7_0_ECX_LA57": "la57", + "CPUID_7_0_ECX_MOVDIR64B": "movdir64b", + "CPUID_7_0_ECX_MOVDIRI": "movdiri", + "CPUID_7_0_ECX_PKU": "pku", + "CPUID_7_0_ECX_RDPID": "rdpid", + "CPUID_7_0_ECX_UMIP": "umip", + "CPUID_7_0_ECX_VAES": "vaes", + "CPUID_7_0_ECX_VPCLMULQDQ": "vpclmulqdq", + "CPUID_7_0_EDX_ARCH_CAPABILITIES": "arch-capabilities", + "CPUID_7_0_EDX_AVX512_4FMAPS": "avx512-4fmaps", + "CPUID_7_0_EDX_AVX512_4VNNIW": "avx512-4vnniw", + "CPUID_7_0_EDX_CORE_CAPABILITY": "core-capability", + "CPUID_7_0_EDX_SPEC_CTRL": "spec-ctrl", + "CPUID_7_0_EDX_SPEC_CTRL_SSBD": "ssbd", + "CPUID_7_0_EDX_STIBP": "stibp", + "CPUID_7_1_EAX_AVX512_BF16": "avx512-bf16", + "CPUID_8000_0008_EBX_CLZERO": "clzero", + "CPUID_8000_0008_EBX_IBPB": "ibpb", + "CPUID_8000_0008_EBX_STIBP": "amd-stibp", + "CPUID_8000_0008_EBX_WBNOINVD": "wbnoinvd", + "CPUID_8000_0008_EBX_XSAVEERPTR": "xsaveerptr", + "CPUID_ACPI": "acpi", + "CPUID_APIC": "apic", + "CPUID_CLFLUSH": "clflush", + "CPUID_CMOV": "cmov", + "CPUID_CX8": "cx8", + "CPUID_DE": "de", + "CPUID_EXT2_3DNOW": "3dnow", + "CPUID_EXT2_3DNOWEXT": "3dnowext", + "CPUID_EXT2_FFXSR": "fxsr_opt", + "CPUID_EXT2_LM": "lm", + "CPUID_EXT2_MMXEXT": "mmxext", + "CPUID_EXT2_NX": "nx", + "CPUID_EXT2_PDPE1GB": "pdpe1gb", + "CPUID_EXT2_RDTSCP": "rdtscp", + "CPUID_EXT2_SYSCALL": "syscall", + "CPUID_EXT3_3DNOWPREFETCH": "3dnowprefetch", + "CPUID_EXT3_ABM": "abm", + "CPUID_EXT3_CR8LEG": "cr8legacy", + "CPUID_EXT3_FMA4": "fma4", + "CPUID_EXT3_LAHF_LM": "lahf_lm", + "CPUID_EXT3_MISALIGNSSE": "misalignsse", + "CPUID_EXT3_OSVW": "osvw", + "CPUID_EXT3_PERFCORE": "perfctr_core", + "CPUID_EXT3_SSE4A": "sse4a", + "CPUID_EXT3_SVM": "svm", + "CPUID_EXT3_TBM": "tbm", + "CPUID_EXT3_XOP": "xop", + "CPUID_EXT_AES": "aes", + "CPUID_EXT_AVX": "avx", + "CPUID_EXT_CX16": "cx16", + "CPUID_EXT_F16C": "f16c", + "CPUID_EXT_FMA": "fma", + "CPUID_EXT_MOVBE": "movbe", + "CPUID_EXT_PCID": "pcid", + "CPUID_EXT_PCLMULQDQ": "pclmuldq", + "CPUID_EXT_POPCNT": "popcnt", + "CPUID_EXT_RDRAND": "rdrand", + "CPUID_EXT_SSE3": "pni", + "CPUID_EXT_SSE41": "sse4.1", + "CPUID_EXT_SSE42": "sse4.2", + "CPUID_EXT_SSSE3": "ssse3", + "CPUID_EXT_TSC_DEADLINE_TIMER": "tsc-deadline", + "CPUID_EXT_X2APIC": "x2apic", + "CPUID_EXT_XSAVE": "xsave", + "CPUID_FP87": "fpu", + "CPUID_FXSR": "fxsr", + "CPUID_MCA": "mca", + "CPUID_MCE": "mce", + "CPUID_MMX": "mmx", + "CPUID_MSR": "msr", + "CPUID_MTRR": "mtrr", + "CPUID_PAE": "pae", + "CPUID_PAT": "pat", + "CPUID_PGE": "pge", + "CPUID_PSE36": "pse36", + "CPUID_PSE": "pse", + "CPUID_SEP": "sep", + "CPUID_SSE2": "sse2", + "CPUID_SSE": "sse", + "CPUID_SS": "ss", + "CPUID_SVM_NPT": "npt", + "CPUID_SVM_NRIPSAVE": "nrip-save", + "CPUID_TSC": "tsc", + "CPUID_VME": "vme", + "CPUID_XSAVE_XGETBV1": "xgetbv1", + "CPUID_XSAVE_XSAVEC": "xsavec", + "CPUID_XSAVE_XSAVEOPT": "xsaveopt", + "CPUID_XSAVE_XSAVES": "xsaves", + "MSR_ARCH_CAP_IBRS_ALL": "ibrs-all", + "MSR_ARCH_CAP_MDS_NO": "mds-no", + "MSR_ARCH_CAP_PSCHANGE_MC_NO": "pschange-mc-no", + "MSR_ARCH_CAP_RDCL_NO": "rdctl-no", + "MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY": "skip-l1dfl-vmentry", + "MSR_ARCH_CAP_TAA_NO": "taa-no", + "MSR_CORE_CAP_SPLIT_LOCK_DETECT": "split-lock-detect", + + # always disabled features + "CPUID_EXT_MONITOR": None, + "0": None, + + # set to "no auto enable" by qemu + "CPUID_EXT3_TOPOEXT": None, + "MSR_VMX_BASIC_DUAL_MONITOR": None, + } + + if name in T: + return T[name] + + print("warning: Unknown feature '{}'".format(name)) + return name + + def readline_cont(f): """Read one logical line from a file `f` i.e. continues lines that end in a backslash.""" @@ -286,7 +293,7 @@ def expand_model(model): for feature in v.split(): if feature.startswith("VMX_") or feature.startswith("MSR_VMX_"): continue - translated = T.get(feature, feature) + translated = translate_feature(feature) if translated: result["features"].add(translated) @@ -302,7 +309,7 @@ def expand_model(model): props = version.pop(".props", dict()) for k, v in props: if k not in ("model-id", "stepping", "model"): - k = T.get(k, k) + k = translate_feature(k) if v == "on": result["features"].add(k) elif v == "off" and k in result["features"]: -- 2.26.2

Signed-off-by: Tim Wiederhake <twiederh@redhat.com> --- src/cpu_map/sync_qemu_i386.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpu_map/sync_qemu_i386.py b/src/cpu_map/sync_qemu_i386.py index 6a5a02dbd1..21981c58f1 100755 --- a/src/cpu_map/sync_qemu_i386.py +++ b/src/cpu_map/sync_qemu_i386.py @@ -108,6 +108,7 @@ def translate_feature(name): "CPUID_EXT_CX16": "cx16", "CPUID_EXT_F16C": "f16c", "CPUID_EXT_FMA": "fma", + "CPUID_EXT_MONITOR": "monitor", "CPUID_EXT_MOVBE": "movbe", "CPUID_EXT_PCID": "pcid", "CPUID_EXT_PCLMULQDQ": "pclmuldq", @@ -153,7 +154,6 @@ def translate_feature(name): "MSR_CORE_CAP_SPLIT_LOCK_DETECT": "split-lock-detect", # always disabled features - "CPUID_EXT_MONITOR": None, "0": None, # set to "no auto enable" by qemu -- 2.26.2

Signed-off-by: Tim Wiederhake <twiederh@redhat.com> --- src/cpu_map/sync_qemu_i386.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/cpu_map/sync_qemu_i386.py b/src/cpu_map/sync_qemu_i386.py index 21981c58f1..2219e67454 100755 --- a/src/cpu_map/sync_qemu_i386.py +++ b/src/cpu_map/sync_qemu_i386.py @@ -152,14 +152,20 @@ def translate_feature(name): "MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY": "skip-l1dfl-vmentry", "MSR_ARCH_CAP_TAA_NO": "taa-no", "MSR_CORE_CAP_SPLIT_LOCK_DETECT": "split-lock-detect", + } - # always disabled features - "0": None, + ignore = ( + name == "0", + name.startswith("VMX_"), + name.startswith("MSR_VMX_"), # set to "no auto enable" by qemu - "CPUID_EXT3_TOPOEXT": None, - "MSR_VMX_BASIC_DUAL_MONITOR": None, - } + name == "CPUID_EXT3_TOPOEXT", + name == "MSR_VMX_BASIC_DUAL_MONITOR", + ) + + if any(ignore): + return None if name in T: return T[name] @@ -291,8 +297,6 @@ def expand_model(model): for k in [k for k in model if k.startswith(".features")]: v = model.pop(k) for feature in v.split(): - if feature.startswith("VMX_") or feature.startswith("MSR_VMX_"): - continue translated = translate_feature(feature) if translated: result["features"].add(translated) -- 2.26.2

If a feature is added (or removed) in a QEMU CPU model version, we get to see the QEMU pretty name for the feature, not the name of the macro. Signed-off-by: Tim Wiederhake <twiederh@redhat.com> --- src/cpu_map/sync_qemu_i386.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/cpu_map/sync_qemu_i386.py b/src/cpu_map/sync_qemu_i386.py index 2219e67454..b27e5793ff 100755 --- a/src/cpu_map/sync_qemu_i386.py +++ b/src/cpu_map/sync_qemu_i386.py @@ -158,6 +158,7 @@ def translate_feature(name): name == "0", name.startswith("VMX_"), name.startswith("MSR_VMX_"), + name.startswith("vmx-"), # set to "no auto enable" by qemu name == "CPUID_EXT3_TOPOEXT", @@ -170,6 +171,10 @@ def translate_feature(name): if name in T: return T[name] + for v in T.values(): + if name.replace("-", "_") == v.replace("-", "_"): + return v + print("warning: Unknown feature '{}'".format(name)) return name -- 2.26.2

Signed-off-by: Tim Wiederhake <twiederh@redhat.com> --- src/cpu_map/sync_qemu_i386.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/cpu_map/sync_qemu_i386.py b/src/cpu_map/sync_qemu_i386.py index b27e5793ff..69114c5bb6 100755 --- a/src/cpu_map/sync_qemu_i386.py +++ b/src/cpu_map/sync_qemu_i386.py @@ -32,6 +32,7 @@ def translate_feature(name): "CPUID_7_0_EBX_AVX512DQ": "avx512dq", "CPUID_7_0_EBX_AVX512ER": "avx512er", "CPUID_7_0_EBX_AVX512F": "avx512f", + "CPUID_7_0_EBX_AVX512IFMA": "avx512ifma", "CPUID_7_0_EBX_AVX512PF": "avx512pf", "CPUID_7_0_EBX_AVX512VL": "avx512vl", "CPUID_7_0_EBX_BMI1": "bmi1", @@ -67,6 +68,7 @@ def translate_feature(name): "CPUID_7_0_EDX_AVX512_4FMAPS": "avx512-4fmaps", "CPUID_7_0_EDX_AVX512_4VNNIW": "avx512-4vnniw", "CPUID_7_0_EDX_CORE_CAPABILITY": "core-capability", + "CPUID_7_0_EDX_FSRM": "fsrm", "CPUID_7_0_EDX_SPEC_CTRL": "spec-ctrl", "CPUID_7_0_EDX_SPEC_CTRL_SSBD": "ssbd", "CPUID_7_0_EDX_STIBP": "stibp", -- 2.26.2

Signed-off-by: Tim Wiederhake <twiederh@redhat.com> --- src/cpu_map/sync_qemu_i386.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/cpu_map/sync_qemu_i386.py b/src/cpu_map/sync_qemu_i386.py index 69114c5bb6..4743161b0c 100755 --- a/src/cpu_map/sync_qemu_i386.py +++ b/src/cpu_map/sync_qemu_i386.py @@ -5,6 +5,7 @@ import copy import lark import os import re +import xml.etree.ElementTree def translate_vendor(name): @@ -393,6 +394,22 @@ def main(): with open(name, "wt") as f: output_model(f, model) + features = set() + for model in models: + features.update(model["features"]) + + try: + filename = os.path.join(args.outdir, "x86_features.xml") + dom = xml.etree.ElementTree.parse(filename) + known = [x.attrib["name"] for x in dom.getroot().iter("feature")] + unknown = [x for x in features if x not in known and x is not None] + except Exception as e: + unknown = [] + print("warning: Unable to read libvirt x86_features.xml: {}".format(e)) + + for x in unknown: + print("warning: Feature unknown to libvirt: {}".format(x)) + if __name__ == "__main__": main() -- 2.26.2

Signed-off-by: Tim Wiederhake <twiederh@redhat.com> --- src/cpu_map/x86_features.xml | 3 +++ tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-guest.xml | 1 + tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-host.xml | 1 + 3 files changed, 5 insertions(+) diff --git a/src/cpu_map/x86_features.xml b/src/cpu_map/x86_features.xml index a55f52b16c..b0bf22d916 100644 --- a/src/cpu_map/x86_features.xml +++ b/src/cpu_map/x86_features.xml @@ -339,6 +339,9 @@ <feature name='avx512-4fmaps'> <cpuid eax_in='0x07' ecx_in='0x00' edx='0x00000008'/> </feature> + <feature name='fsrm'> + <cpuid eax_in='0x07' ecx_in='0x00' edx='0x00000010'/> + </feature> <feature name='md-clear'> <!-- md_clear --> <cpuid eax_in='0x07' ecx_in='0x00' edx='0x00000400'/> </feature> 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 9b75ace710..3a71b28cfb 100644 --- a/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-guest.xml +++ b/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-guest.xml @@ -24,6 +24,7 @@ <feature policy='require' name='sha-ni'/> <feature policy='require' name='ospke'/> <feature policy='require' name='rdpid'/> + <feature policy='require' name='fsrm'/> <feature policy='require' name='stibp'/> <feature policy='require' name='arch-capabilities'/> <feature policy='require' name='xsaves'/> 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 efbf9d363b..1582de0422 100644 --- a/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-host.xml +++ b/tests/cputestdata/x86_64-cpuid-Ice-Lake-Server-host.xml @@ -25,6 +25,7 @@ <feature name='sha-ni'/> <feature name='ospke'/> <feature name='rdpid'/> + <feature name='fsrm'/> <feature name='stibp'/> <feature name='arch-capabilities'/> <feature name='xsaves'/> -- 2.26.2
participants (1)
-
Tim Wiederhake