From: Binbin Wu <binbin.wu@linux.intel.com>
To: kvm@vger.kernel.org
Cc: pbonzini@redhat.com, seanjc@google.com,
rick.p.edgecombe@intel.com, xiaoyao.li@intel.com,
chao.gao@intel.com, kai.huang@intel.com,
binbin.wu@linux.intel.com
Subject: [RFC PATCH 04/27] KVM: x86: Extend F() and its variants for CPUID overlays
Date: Fri, 17 Apr 2026 15:35:47 +0800 [thread overview]
Message-ID: <20260417073610.3246316-5-binbin.wu@linux.intel.com> (raw)
In-Reply-To: <20260417073610.3246316-1-binbin.wu@linux.intel.com>
Change kvm_cpu_caps[] to a 2D array and extend F() and its variants
for preparation to accommodate capabilities for different CPUID overlays.
Use F_CPUID_DEFAULT to set the capabilities for both VMX and SVM
overlays, and define the temporary CPUID_OL_DEFAULT to be the effective
overlay that is actually VMX overlay, which equals to the original
version of kvm_cpu_caps[].
It's a bit weird to use CPUID_OL_DEFAULT, which is VMX overlay, in
ALIASED_1_EDX_F() for the SVM only features, but there is no
functional change since CPUID_OL_DEFAULT is used for all VM types.
VENDOR_F() and RUNTIME_F() don't actually set any capability, keep them
as what they are.
No functional change intended.
Signed-off-by: Binbin Wu <binbin.wu@linux.intel.com>
---
arch/x86/kvm/cpuid.c | 498 ++++++++++++++++++++++---------------------
arch/x86/kvm/cpuid.h | 16 +-
2 files changed, 264 insertions(+), 250 deletions(-)
diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
index 056f86121728..d3f3e9f0d493 100644
--- a/arch/x86/kvm/cpuid.c
+++ b/arch/x86/kvm/cpuid.c
@@ -33,7 +33,7 @@
* Unlike "struct cpuinfo_x86.x86_capability", kvm_cpu_caps doesn't need to be
* aligned to sizeof(unsigned long) because it's not accessed via bitops.
*/
-u32 kvm_cpu_caps[NR_KVM_CPU_CAPS] __read_mostly;
+u32 kvm_cpu_caps[NR_CPUID_OL][NR_KVM_CPU_CAPS] __read_mostly;
EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_cpu_caps);
bool kvm_is_configuring_cpu_caps __read_mostly;
@@ -404,7 +404,7 @@ void kvm_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu)
* in guest CPUID. Note, this includes features that are
* supported by KVM but aren't advertised to userspace!
*/
- vcpu->arch.cpu_caps[i] = kvm_cpu_caps[i];
+ vcpu->arch.cpu_caps[i] = kvm_cpu_caps[CPUID_OL_DEFAULT][i];
if (!cpuid.index) {
cpuid_func_emulated(&emulated, cpuid.function, true);
vcpu->arch.cpu_caps[i] |= cpuid_get_reg_unsafe(&emulated, cpuid.reg);
@@ -713,15 +713,18 @@ do { \
\
feature_initializers \
\
- kvm_cpu_caps[leaf] = kvm_cpu_cap_features; \
+ /* Handle the tailing comma compiler errors */ \
+ (void)kvm_cpu_cap_features; \
\
if (leaf < NCAPINTS) \
- kvm_cpu_caps[leaf] &= kernel_cpu_caps[leaf]; \
+ kvm_cpu_cap_features &= kernel_cpu_caps[leaf]; \
\
- kvm_cpu_caps[leaf] |= kvm_cpu_cap_passthrough; \
- kvm_cpu_caps[leaf] &= (raw_cpuid_get(cpuid) | \
- kvm_cpu_cap_synthesized); \
- kvm_cpu_caps[leaf] |= kvm_cpu_cap_emulated; \
+ kvm_cpu_cap_features |= kvm_cpu_cap_passthrough; \
+ kvm_cpu_cap_features &= (raw_cpuid_get(cpuid) | \
+ kvm_cpu_cap_synthesized); \
+ kvm_cpu_cap_features |= kvm_cpu_cap_emulated; \
+ for (int i = 0; i < NR_CPUID_OL; i++) \
+ kvm_cpu_caps[i][leaf] &= kvm_cpu_cap_features; \
} while (0)
/*
@@ -736,37 +739,43 @@ do { \
BUILD_BUG_ON(__leaf != kvm_cpu_cap_init_in_progress); \
} while (0)
-#define F(name) \
-({ \
- KVM_VALIDATE_CPU_CAP_USAGE(name); \
- kvm_cpu_cap_features |= feature_bit(name); \
+#define F(name, overlay_mask) \
+({ \
+ u32 __leaf = __feature_leaf(X86_FEATURE_##name); \
+ \
+ KVM_VALIDATE_CPU_CAP_USAGE(name); \
+ kvm_cpu_cap_features |= feature_bit(name); \
+ for (int i = 0; i < NR_CPUID_OL; i++) { \
+ if ((overlay_mask) & BIT(i)) \
+ kvm_cpu_caps[i][__leaf] |= feature_bit(name); \
+ } \
})
/* Scattered Flag - For features that are scattered by cpufeatures.h. */
-#define SCATTERED_F(name) \
+#define SCATTERED_F(name, overlay_mask) \
({ \
BUILD_BUG_ON(X86_FEATURE_##name >= MAX_CPU_FEATURES); \
KVM_VALIDATE_CPU_CAP_USAGE(name); \
if (boot_cpu_has(X86_FEATURE_##name)) \
- F(name); \
+ F(name, overlay_mask); \
})
/* Features that KVM supports only on 64-bit kernels. */
-#define X86_64_F(name) \
+#define X86_64_F(name, overlay_mask) \
({ \
KVM_VALIDATE_CPU_CAP_USAGE(name); \
if (IS_ENABLED(CONFIG_X86_64)) \
- F(name); \
+ F(name, overlay_mask); \
})
/*
* Emulated Feature - For features that KVM emulates in software irrespective
* of host CPU/kernel support.
*/
-#define EMULATED_F(name) \
+#define EMULATED_F(name, overlay_mask) \
({ \
kvm_cpu_cap_emulated |= feature_bit(name); \
- F(name); \
+ F(name, overlay_mask); \
})
/*
@@ -774,13 +783,13 @@ do { \
* i.e. may not be present in the raw CPUID, but can still be advertised to
* userspace. Primarily used for mitigation related feature flags.
*/
-#define SYNTHESIZED_F(name) \
+#define SYNTHESIZED_F(name, overlay_mask) \
({ \
kvm_cpu_cap_synthesized |= feature_bit(name); \
\
BUILD_BUG_ON(X86_FEATURE_##name >= MAX_CPU_FEATURES); \
if (boot_cpu_has(X86_FEATURE_##name)) \
- F(name); \
+ F(name, overlay_mask); \
})
/*
@@ -789,21 +798,22 @@ do { \
* use the feature. Simply force set the feature in KVM's capabilities, raw
* CPUID support will be factored in by kvm_cpu_cap_mask().
*/
-#define PASSTHROUGH_F(name) \
+#define PASSTHROUGH_F(name, overlay_mask) \
({ \
kvm_cpu_cap_passthrough |= feature_bit(name); \
- F(name); \
+ F(name, overlay_mask); \
})
/*
* Aliased Features - For features in 0x8000_0001.EDX that are duplicates of
* identical 0x1.EDX features, and thus are aliased from 0x1 to 0x8000_0001.
*/
-#define ALIASED_1_EDX_F(name) \
-({ \
- BUILD_BUG_ON(__feature_leaf(X86_FEATURE_##name) != CPUID_1_EDX); \
- BUILD_BUG_ON(kvm_cpu_cap_init_in_progress != CPUID_8000_0001_EDX); \
- kvm_cpu_cap_features |= feature_bit(name); \
+#define ALIASED_1_EDX_F(name) \
+({ \
+ BUILD_BUG_ON(__feature_leaf(X86_FEATURE_##name) != CPUID_1_EDX); \
+ BUILD_BUG_ON(kvm_cpu_cap_init_in_progress != CPUID_8000_0001_EDX); \
+ kvm_cpu_cap_features |= feature_bit(name); \
+ kvm_cpu_caps[CPUID_OL_DEFAULT][CPUID_8000_0001_EDX] |= feature_bit(name); \
})
/*
@@ -840,12 +850,12 @@ void kvm_initialize_cpu_caps(void)
WARN_ON_ONCE(kvm_is_configuring_cpu_caps);
kvm_is_configuring_cpu_caps = true;
- BUILD_BUG_ON(sizeof(kvm_cpu_caps) - (NKVMCAPINTS * sizeof(*kvm_cpu_caps)) >
+ BUILD_BUG_ON(sizeof(kvm_cpu_caps)/NR_CPUID_OL - (NKVMCAPINTS * sizeof(**kvm_cpu_caps)) >
sizeof(boot_cpu_data.x86_capability));
kvm_cpu_cap_init(CPUID_1_ECX,
- F(XMM3),
- F(PCLMULQDQ),
+ F(XMM3, F_CPUID_DEFAULT),
+ F(PCLMULQDQ, F_CPUID_DEFAULT),
VENDOR_F(DTES64),
/*
* NOTE: MONITOR (and MWAIT) are emulated as NOP, but *not*
@@ -858,122 +868,122 @@ void kvm_initialize_cpu_caps(void)
VENDOR_F(VMX),
/* SMX, EST */
/* TM2 */
- F(SSSE3),
+ F(SSSE3, F_CPUID_DEFAULT),
/* CNXT-ID */
/* Reserved */
- F(FMA),
- F(CX16),
+ F(FMA, F_CPUID_DEFAULT),
+ F(CX16, F_CPUID_DEFAULT),
/* xTPR Update */
- F(PDCM),
- F(PCID),
+ F(PDCM, F_CPUID_DEFAULT),
+ F(PCID, F_CPUID_DEFAULT),
/* Reserved, DCA */
- F(XMM4_1),
- F(XMM4_2),
- EMULATED_F(X2APIC),
- F(MOVBE),
- F(POPCNT),
- EMULATED_F(TSC_DEADLINE_TIMER),
- F(AES),
- F(XSAVE),
+ F(XMM4_1, F_CPUID_DEFAULT),
+ F(XMM4_2, F_CPUID_DEFAULT),
+ EMULATED_F(X2APIC, F_CPUID_DEFAULT),
+ F(MOVBE, F_CPUID_DEFAULT),
+ F(POPCNT, F_CPUID_DEFAULT),
+ EMULATED_F(TSC_DEADLINE_TIMER, F_CPUID_DEFAULT),
+ F(AES, F_CPUID_DEFAULT),
+ F(XSAVE, F_CPUID_DEFAULT),
RUNTIME_F(OSXSAVE),
- F(AVX),
- F(F16C),
- F(RDRAND),
- EMULATED_F(HYPERVISOR),
+ F(AVX, F_CPUID_DEFAULT),
+ F(F16C, F_CPUID_DEFAULT),
+ F(RDRAND, F_CPUID_DEFAULT),
+ EMULATED_F(HYPERVISOR, F_CPUID_DEFAULT),
);
kvm_cpu_cap_init(CPUID_1_EDX,
- F(FPU),
- F(VME),
- F(DE),
- F(PSE),
- F(TSC),
- F(MSR),
- F(PAE),
- F(MCE),
- F(CX8),
- F(APIC),
+ F(FPU, F_CPUID_DEFAULT),
+ F(VME, F_CPUID_DEFAULT),
+ F(DE, F_CPUID_DEFAULT),
+ F(PSE, F_CPUID_DEFAULT),
+ F(TSC, F_CPUID_DEFAULT),
+ F(MSR, F_CPUID_DEFAULT),
+ F(PAE, F_CPUID_DEFAULT),
+ F(MCE, F_CPUID_DEFAULT),
+ F(CX8, F_CPUID_DEFAULT),
+ F(APIC, F_CPUID_DEFAULT),
/* Reserved */
- F(SEP),
- F(MTRR),
- F(PGE),
- F(MCA),
- F(CMOV),
- F(PAT),
- F(PSE36),
+ F(SEP, F_CPUID_DEFAULT),
+ F(MTRR, F_CPUID_DEFAULT),
+ F(PGE, F_CPUID_DEFAULT),
+ F(MCA, F_CPUID_DEFAULT),
+ F(CMOV, F_CPUID_DEFAULT),
+ F(PAT, F_CPUID_DEFAULT),
+ F(PSE36, F_CPUID_DEFAULT),
/* PSN */
- F(CLFLUSH),
+ F(CLFLUSH, F_CPUID_DEFAULT),
/* Reserved */
VENDOR_F(DS),
/* ACPI */
- F(MMX),
- F(FXSR),
- F(XMM),
- F(XMM2),
- F(SELFSNOOP),
+ F(MMX, F_CPUID_DEFAULT),
+ F(FXSR, F_CPUID_DEFAULT),
+ F(XMM, F_CPUID_DEFAULT),
+ F(XMM2, F_CPUID_DEFAULT),
+ F(SELFSNOOP, F_CPUID_DEFAULT),
/* HTT, TM, Reserved, PBE */
);
kvm_cpu_cap_init(CPUID_7_0_EBX,
- F(FSGSBASE),
- EMULATED_F(TSC_ADJUST),
- F(SGX),
- F(BMI1),
- F(HLE),
- F(AVX2),
- F(FDP_EXCPTN_ONLY),
- F(SMEP),
- F(BMI2),
- F(ERMS),
- F(INVPCID),
- F(RTM),
- F(ZERO_FCS_FDS),
+ F(FSGSBASE, F_CPUID_DEFAULT),
+ EMULATED_F(TSC_ADJUST, F_CPUID_DEFAULT),
+ F(SGX, F_CPUID_DEFAULT),
+ F(BMI1, F_CPUID_DEFAULT),
+ F(HLE, F_CPUID_DEFAULT),
+ F(AVX2, F_CPUID_DEFAULT),
+ F(FDP_EXCPTN_ONLY, F_CPUID_DEFAULT),
+ F(SMEP, F_CPUID_DEFAULT),
+ F(BMI2, F_CPUID_DEFAULT),
+ F(ERMS, F_CPUID_DEFAULT),
+ F(INVPCID, F_CPUID_DEFAULT),
+ F(RTM, F_CPUID_DEFAULT),
+ F(ZERO_FCS_FDS, F_CPUID_DEFAULT),
VENDOR_F(MPX),
- F(AVX512F),
- F(AVX512DQ),
- F(RDSEED),
- F(ADX),
- F(SMAP),
- F(AVX512IFMA),
- F(CLFLUSHOPT),
- F(CLWB),
+ F(AVX512F, F_CPUID_DEFAULT),
+ F(AVX512DQ, F_CPUID_DEFAULT),
+ F(RDSEED, F_CPUID_DEFAULT),
+ F(ADX, F_CPUID_DEFAULT),
+ F(SMAP, F_CPUID_DEFAULT),
+ F(AVX512IFMA, F_CPUID_DEFAULT),
+ F(CLFLUSHOPT, F_CPUID_DEFAULT),
+ F(CLWB, F_CPUID_DEFAULT),
VENDOR_F(INTEL_PT),
- F(AVX512PF),
- F(AVX512ER),
- F(AVX512CD),
- F(SHA_NI),
- F(AVX512BW),
- F(AVX512VL),
+ F(AVX512PF, F_CPUID_DEFAULT),
+ F(AVX512ER, F_CPUID_DEFAULT),
+ F(AVX512CD, F_CPUID_DEFAULT),
+ F(SHA_NI, F_CPUID_DEFAULT),
+ F(AVX512BW, F_CPUID_DEFAULT),
+ F(AVX512VL, F_CPUID_DEFAULT),
);
kvm_cpu_cap_init(CPUID_7_ECX,
/* PREFETCHWT1 */
- F(AVX512VBMI),
- F(UMIP),
- F(PKU),
+ F(AVX512VBMI, F_CPUID_DEFAULT),
+ F(UMIP, F_CPUID_DEFAULT),
+ F(PKU, F_CPUID_DEFAULT),
RUNTIME_F(OSPKE),
VENDOR_F(WAITPKG),
- F(AVX512_VBMI2),
- X86_64_F(SHSTK),
- F(GFNI),
- F(VAES),
- F(VPCLMULQDQ),
- F(AVX512_VNNI),
- F(AVX512_BITALG),
+ F(AVX512_VBMI2, F_CPUID_DEFAULT),
+ X86_64_F(SHSTK, F_CPUID_DEFAULT),
+ F(GFNI, F_CPUID_DEFAULT),
+ F(VAES, F_CPUID_DEFAULT),
+ F(VPCLMULQDQ, F_CPUID_DEFAULT),
+ F(AVX512_VNNI, F_CPUID_DEFAULT),
+ F(AVX512_BITALG, F_CPUID_DEFAULT),
/* TME */
- F(AVX512_VPOPCNTDQ),
+ F(AVX512_VPOPCNTDQ, F_CPUID_DEFAULT),
/* Reserved */
- PASSTHROUGH_F(LA57),
+ PASSTHROUGH_F(LA57, F_CPUID_DEFAULT),
/* MPX_MAWAU */
- F(RDPID),
+ F(RDPID, F_CPUID_DEFAULT),
/* KEY_LOCKER */
- F(BUS_LOCK_DETECT),
- F(CLDEMOTE),
+ F(BUS_LOCK_DETECT, F_CPUID_DEFAULT),
+ F(CLDEMOTE, F_CPUID_DEFAULT),
/* Reserved */
- F(MOVDIRI),
- F(MOVDIR64B),
+ F(MOVDIRI, F_CPUID_DEFAULT),
+ F(MOVDIR64B, F_CPUID_DEFAULT),
/* ENQCMD */
- F(SGX_LC),
+ F(SGX_LC, F_CPUID_DEFAULT),
/* PKS */
);
@@ -994,30 +1004,30 @@ void kvm_initialize_cpu_caps(void)
kvm_cpu_cap_init(CPUID_7_EDX,
/* Reserved, SGX_KEYS */
- F(AVX512_4VNNIW),
- F(AVX512_4FMAPS),
- F(FSRM),
+ F(AVX512_4VNNIW, F_CPUID_DEFAULT),
+ F(AVX512_4FMAPS, F_CPUID_DEFAULT),
+ F(FSRM, F_CPUID_DEFAULT),
/* UINT, Reserved, Reserved */
- F(AVX512_VP2INTERSECT),
+ F(AVX512_VP2INTERSECT, F_CPUID_DEFAULT),
/* SRBDS_CTRL */
- F(MD_CLEAR),
+ F(MD_CLEAR, F_CPUID_DEFAULT),
/* RTM_ALWAYS_ABORT, Reserved, TSX_FORCE_ABORT */
- F(SERIALIZE),
+ F(SERIALIZE, F_CPUID_DEFAULT),
/* HYBRID_CPU */
- F(TSXLDTRK),
+ F(TSXLDTRK, F_CPUID_DEFAULT),
/* Reserved, PCONFIG, ARCH_LBR */
- F(IBT),
+ F(IBT, F_CPUID_DEFAULT),
/* Reserved */
- F(AMX_BF16),
- F(AVX512_FP16),
- F(AMX_TILE),
- F(AMX_INT8),
- F(SPEC_CTRL),
- F(INTEL_STIBP),
- F(FLUSH_L1D),
- EMULATED_F(ARCH_CAPABILITIES),
+ F(AMX_BF16, F_CPUID_DEFAULT),
+ F(AVX512_FP16, F_CPUID_DEFAULT),
+ F(AMX_TILE, F_CPUID_DEFAULT),
+ F(AMX_INT8, F_CPUID_DEFAULT),
+ F(SPEC_CTRL, F_CPUID_DEFAULT),
+ F(INTEL_STIBP, F_CPUID_DEFAULT),
+ F(FLUSH_L1D, F_CPUID_DEFAULT),
+ EMULATED_F(ARCH_CAPABILITIES, F_CPUID_DEFAULT),
/* CORE_CAPABILITIES */
- F(SPEC_CTRL_SSBD),
+ F(SPEC_CTRL_SSBD, F_CPUID_DEFAULT),
);
/*
@@ -1040,97 +1050,97 @@ void kvm_initialize_cpu_caps(void)
kvm_cpu_cap_set(X86_FEATURE_SPEC_CTRL_SSBD);
kvm_cpu_cap_init(CPUID_7_1_EAX,
- F(SHA512),
- F(SM3),
- F(SM4),
- F(AVX_VNNI),
- F(AVX512_BF16),
- F(CMPCCXADD),
- F(FZRM),
- F(FSRS),
- F(FSRC),
- X86_64_F(LKGS),
- F(WRMSRNS),
- F(AMX_FP16),
- F(AVX_IFMA),
- F(LAM),
- F(MOVRS),
+ F(SHA512, F_CPUID_DEFAULT),
+ F(SM3, F_CPUID_DEFAULT),
+ F(SM4, F_CPUID_DEFAULT),
+ F(AVX_VNNI, F_CPUID_DEFAULT),
+ F(AVX512_BF16, F_CPUID_DEFAULT),
+ F(CMPCCXADD, F_CPUID_DEFAULT),
+ F(FZRM, F_CPUID_DEFAULT),
+ F(FSRS, F_CPUID_DEFAULT),
+ F(FSRC, F_CPUID_DEFAULT),
+ X86_64_F(LKGS, F_CPUID_DEFAULT),
+ F(WRMSRNS, F_CPUID_DEFAULT),
+ F(AMX_FP16, F_CPUID_DEFAULT),
+ F(AVX_IFMA, F_CPUID_DEFAULT),
+ F(LAM, F_CPUID_DEFAULT),
+ F(MOVRS, F_CPUID_DEFAULT),
);
kvm_cpu_cap_init(CPUID_7_1_ECX,
- SCATTERED_F(MSR_IMM),
+ SCATTERED_F(MSR_IMM, F_CPUID_DEFAULT),
);
kvm_cpu_cap_init(CPUID_7_1_EDX,
- F(AVX_VNNI_INT8),
- F(AVX_NE_CONVERT),
- F(AMX_COMPLEX),
- F(AVX_VNNI_INT16),
- F(PREFETCHITI),
- F(AVX10),
+ F(AVX_VNNI_INT8, F_CPUID_DEFAULT),
+ F(AVX_NE_CONVERT, F_CPUID_DEFAULT),
+ F(AMX_COMPLEX, F_CPUID_DEFAULT),
+ F(AVX_VNNI_INT16, F_CPUID_DEFAULT),
+ F(PREFETCHITI, F_CPUID_DEFAULT),
+ F(AVX10, F_CPUID_DEFAULT),
);
kvm_cpu_cap_init(CPUID_7_2_EDX,
- F(INTEL_PSFD),
- F(IPRED_CTRL),
- F(RRSBA_CTRL),
- F(DDPD_U),
- F(BHI_CTRL),
- F(MCDT_NO),
+ F(INTEL_PSFD, F_CPUID_DEFAULT),
+ F(IPRED_CTRL, F_CPUID_DEFAULT),
+ F(RRSBA_CTRL, F_CPUID_DEFAULT),
+ F(DDPD_U, F_CPUID_DEFAULT),
+ F(BHI_CTRL, F_CPUID_DEFAULT),
+ F(MCDT_NO, F_CPUID_DEFAULT),
);
kvm_cpu_cap_init(CPUID_D_1_EAX,
- F(XSAVEOPT),
- F(XSAVEC),
- F(XGETBV1),
- F(XSAVES),
- X86_64_F(XFD),
+ F(XSAVEOPT, F_CPUID_DEFAULT),
+ F(XSAVEC, F_CPUID_DEFAULT),
+ F(XGETBV1, F_CPUID_DEFAULT),
+ F(XSAVES, F_CPUID_DEFAULT),
+ X86_64_F(XFD, F_CPUID_DEFAULT),
);
kvm_cpu_cap_init(CPUID_12_EAX,
- SCATTERED_F(SGX1),
- SCATTERED_F(SGX2),
- SCATTERED_F(SGX_EDECCSSA),
+ SCATTERED_F(SGX1, F_CPUID_DEFAULT),
+ SCATTERED_F(SGX2, F_CPUID_DEFAULT),
+ SCATTERED_F(SGX_EDECCSSA, F_CPUID_DEFAULT),
);
kvm_cpu_cap_init(CPUID_1E_1_EAX,
- F(AMX_INT8_ALIAS),
- F(AMX_BF16_ALIAS),
- F(AMX_COMPLEX_ALIAS),
- F(AMX_FP16_ALIAS),
- F(AMX_FP8),
- F(AMX_TF32),
- F(AMX_AVX512),
- F(AMX_MOVRS),
+ F(AMX_INT8_ALIAS, F_CPUID_DEFAULT),
+ F(AMX_BF16_ALIAS, F_CPUID_DEFAULT),
+ F(AMX_COMPLEX_ALIAS, F_CPUID_DEFAULT),
+ F(AMX_FP16_ALIAS, F_CPUID_DEFAULT),
+ F(AMX_FP8, F_CPUID_DEFAULT),
+ F(AMX_TF32, F_CPUID_DEFAULT),
+ F(AMX_AVX512, F_CPUID_DEFAULT),
+ F(AMX_MOVRS, F_CPUID_DEFAULT),
);
kvm_cpu_cap_init(CPUID_24_0_EBX,
- F(AVX10_128),
- F(AVX10_256),
- F(AVX10_512),
+ F(AVX10_128, F_CPUID_DEFAULT),
+ F(AVX10_256, F_CPUID_DEFAULT),
+ F(AVX10_512, F_CPUID_DEFAULT),
);
kvm_cpu_cap_init(CPUID_24_1_ECX,
- F(AVX10_VNNI_INT),
+ F(AVX10_VNNI_INT, F_CPUID_DEFAULT),
);
kvm_cpu_cap_init(CPUID_8000_0001_ECX,
- F(LAHF_LM),
- F(CMP_LEGACY),
+ F(LAHF_LM, F_CPUID_DEFAULT),
+ F(CMP_LEGACY, F_CPUID_DEFAULT),
VENDOR_F(SVM),
/* ExtApicSpace */
- F(CR8_LEGACY),
- F(ABM),
- F(SSE4A),
- F(MISALIGNSSE),
- F(3DNOWPREFETCH),
- F(OSVW),
+ F(CR8_LEGACY, F_CPUID_DEFAULT),
+ F(ABM, F_CPUID_DEFAULT),
+ F(SSE4A, F_CPUID_DEFAULT),
+ F(MISALIGNSSE, F_CPUID_DEFAULT),
+ F(3DNOWPREFETCH, F_CPUID_DEFAULT),
+ F(OSVW, F_CPUID_DEFAULT),
/* IBS */
- F(XOP),
+ F(XOP, F_CPUID_DEFAULT),
/* SKINIT, WDT, LWP */
- F(FMA4),
- F(TBM),
- F(TOPOEXT),
+ F(FMA4, F_CPUID_DEFAULT),
+ F(TBM, F_CPUID_DEFAULT),
+ F(TOPOEXT, F_CPUID_DEFAULT),
VENDOR_F(PERFCTR_CORE),
);
@@ -1146,7 +1156,7 @@ void kvm_initialize_cpu_caps(void)
ALIASED_1_EDX_F(CX8),
ALIASED_1_EDX_F(APIC),
/* Reserved */
- F(SYSCALL),
+ F(SYSCALL, F_CPUID_DEFAULT),
ALIASED_1_EDX_F(MTRR),
ALIASED_1_EDX_F(PGE),
ALIASED_1_EDX_F(MCA),
@@ -1154,42 +1164,42 @@ void kvm_initialize_cpu_caps(void)
ALIASED_1_EDX_F(PAT),
ALIASED_1_EDX_F(PSE36),
/* Reserved */
- F(NX),
+ F(NX, F_CPUID_DEFAULT),
/* Reserved */
- F(MMXEXT),
+ F(MMXEXT, F_CPUID_DEFAULT),
ALIASED_1_EDX_F(MMX),
ALIASED_1_EDX_F(FXSR),
- F(FXSR_OPT),
- X86_64_F(GBPAGES),
- F(RDTSCP),
+ F(FXSR_OPT, F_CPUID_DEFAULT),
+ X86_64_F(GBPAGES, F_CPUID_DEFAULT),
+ F(RDTSCP, F_CPUID_DEFAULT),
/* Reserved */
- X86_64_F(LM),
- F(3DNOWEXT),
- F(3DNOW),
+ X86_64_F(LM, F_CPUID_DEFAULT),
+ F(3DNOWEXT, F_CPUID_DEFAULT),
+ F(3DNOW, F_CPUID_DEFAULT),
);
if (!tdp_enabled && IS_ENABLED(CONFIG_X86_64))
kvm_cpu_cap_set(X86_FEATURE_GBPAGES);
kvm_cpu_cap_init(CPUID_8000_0007_EDX,
- SCATTERED_F(CONSTANT_TSC),
+ SCATTERED_F(CONSTANT_TSC, F_CPUID_DEFAULT),
);
kvm_cpu_cap_init(CPUID_8000_0008_EBX,
- F(CLZERO),
- F(XSAVEERPTR),
- F(WBNOINVD),
- F(AMD_IBPB),
- F(AMD_IBRS),
- F(AMD_SSBD),
- F(VIRT_SSBD),
- F(AMD_SSB_NO),
- F(AMD_STIBP),
- F(AMD_STIBP_ALWAYS_ON),
- F(AMD_IBRS_SAME_MODE),
- PASSTHROUGH_F(EFER_LMSLE_MBZ),
- F(AMD_PSFD),
- F(AMD_IBPB_RET),
+ F(CLZERO, F_CPUID_DEFAULT),
+ F(XSAVEERPTR, F_CPUID_DEFAULT),
+ F(WBNOINVD, F_CPUID_DEFAULT),
+ F(AMD_IBPB, F_CPUID_DEFAULT),
+ F(AMD_IBRS, F_CPUID_DEFAULT),
+ F(AMD_SSBD, F_CPUID_DEFAULT),
+ F(VIRT_SSBD, F_CPUID_DEFAULT),
+ F(AMD_SSB_NO, F_CPUID_DEFAULT),
+ F(AMD_STIBP, F_CPUID_DEFAULT),
+ F(AMD_STIBP_ALWAYS_ON, F_CPUID_DEFAULT),
+ F(AMD_IBRS_SAME_MODE, F_CPUID_DEFAULT),
+ PASSTHROUGH_F(EFER_LMSLE_MBZ, F_CPUID_DEFAULT),
+ F(AMD_PSFD, F_CPUID_DEFAULT),
+ F(AMD_IBPB_RET, F_CPUID_DEFAULT),
);
/*
@@ -1240,12 +1250,12 @@ void kvm_initialize_cpu_caps(void)
VENDOR_F(SEV),
/* VM_PAGE_FLUSH */
VENDOR_F(SEV_ES),
- F(SME_COHERENT),
+ F(SME_COHERENT, F_CPUID_DEFAULT),
);
kvm_cpu_cap_init(CPUID_8000_0021_EAX,
- F(NO_NESTED_DATA_BP),
- F(WRMSR_XX_BASE_NS),
+ F(NO_NESTED_DATA_BP, F_CPUID_DEFAULT),
+ F(WRMSR_XX_BASE_NS, F_CPUID_DEFAULT),
/*
* Synthesize "LFENCE is serializing" into the AMD-defined entry
* in KVM's supported CPUID, i.e. if the feature is reported as
@@ -1256,49 +1266,49 @@ void kvm_initialize_cpu_caps(void)
* CPUID will drop the flags, and reporting support in AMD's
* leaf can make it easier for userspace to detect the feature.
*/
- SYNTHESIZED_F(LFENCE_RDTSC),
+ SYNTHESIZED_F(LFENCE_RDTSC, F_CPUID_DEFAULT),
/* SmmPgCfgLock */
/* 4: Resv */
- SYNTHESIZED_F(VERW_CLEAR),
- F(NULL_SEL_CLR_BASE),
+ SYNTHESIZED_F(VERW_CLEAR, F_CPUID_DEFAULT),
+ F(NULL_SEL_CLR_BASE, F_CPUID_DEFAULT),
/* UpperAddressIgnore */
- F(AUTOIBRS),
- EMULATED_F(NO_SMM_CTL_MSR),
+ F(AUTOIBRS, F_CPUID_DEFAULT),
+ EMULATED_F(NO_SMM_CTL_MSR, F_CPUID_DEFAULT),
/* PrefetchCtlMsr */
/* GpOnUserCpuid */
/* EPSF */
- F(PREFETCHI),
- F(AVX512_BMM),
- F(ERAPS),
- SYNTHESIZED_F(SBPB),
- SYNTHESIZED_F(IBPB_BRTYPE),
- SYNTHESIZED_F(SRSO_NO),
- F(SRSO_USER_KERNEL_NO),
+ F(PREFETCHI, F_CPUID_DEFAULT),
+ F(AVX512_BMM, F_CPUID_DEFAULT),
+ F(ERAPS, F_CPUID_DEFAULT),
+ SYNTHESIZED_F(SBPB, F_CPUID_DEFAULT),
+ SYNTHESIZED_F(IBPB_BRTYPE, F_CPUID_DEFAULT),
+ SYNTHESIZED_F(SRSO_NO, F_CPUID_DEFAULT),
+ F(SRSO_USER_KERNEL_NO, F_CPUID_DEFAULT),
);
kvm_cpu_cap_init(CPUID_8000_0021_ECX,
- SYNTHESIZED_F(TSA_SQ_NO),
- SYNTHESIZED_F(TSA_L1_NO),
+ SYNTHESIZED_F(TSA_SQ_NO, F_CPUID_DEFAULT),
+ SYNTHESIZED_F(TSA_L1_NO, F_CPUID_DEFAULT),
);
kvm_cpu_cap_init(CPUID_8000_0022_EAX,
- F(PERFMON_V2),
+ F(PERFMON_V2, F_CPUID_DEFAULT),
);
if (!static_cpu_has_bug(X86_BUG_NULL_SEG))
kvm_cpu_cap_set(X86_FEATURE_NULL_SEL_CLR_BASE);
kvm_cpu_cap_init(CPUID_C000_0001_EDX,
- F(XSTORE),
- F(XSTORE_EN),
- F(XCRYPT),
- F(XCRYPT_EN),
- F(ACE2),
- F(ACE2_EN),
- F(PHE),
- F(PHE_EN),
- F(PMM),
- F(PMM_EN),
+ F(XSTORE, F_CPUID_DEFAULT),
+ F(XSTORE_EN, F_CPUID_DEFAULT),
+ F(XCRYPT, F_CPUID_DEFAULT),
+ F(XCRYPT_EN, F_CPUID_DEFAULT),
+ F(ACE2, F_CPUID_DEFAULT),
+ F(ACE2_EN, F_CPUID_DEFAULT),
+ F(PHE, F_CPUID_DEFAULT),
+ F(PHE_EN, F_CPUID_DEFAULT),
+ F(PMM, F_CPUID_DEFAULT),
+ F(PMM_EN, F_CPUID_DEFAULT),
);
/*
diff --git a/arch/x86/kvm/cpuid.h b/arch/x86/kvm/cpuid.h
index f41f8d3db794..e87adecacd03 100644
--- a/arch/x86/kvm/cpuid.h
+++ b/arch/x86/kvm/cpuid.h
@@ -14,9 +14,13 @@ enum kvm_cpuid_overlay {
NR_CPUID_OL
};
+/* Temporarily use VMX overlay as the default one */
+#define CPUID_OL_DEFAULT CPUID_OL_VMX
+
#define F_CPUID_VMX BIT(CPUID_OL_VMX)
#define F_CPUID_SVM BIT(CPUID_OL_SVM)
#define F_CPUID_TDX BIT(CPUID_OL_TDX)
+#define F_CPUID_DEFAULT (F_CPUID_VMX | F_CPUID_SVM)
static inline u8 get_cpuid_overlay(struct kvm *kvm)
{
@@ -30,7 +34,7 @@ static inline u8 get_cpuid_overlay(struct kvm *kvm)
return CPUID_OL_VMX;
}
-extern u32 kvm_cpu_caps[NR_KVM_CPU_CAPS] __read_mostly;
+extern u32 kvm_cpu_caps[NR_CPUID_OL][NR_KVM_CPU_CAPS] __read_mostly;
extern bool kvm_is_configuring_cpu_caps __read_mostly;
void kvm_initialize_cpu_caps(void);
@@ -118,8 +122,8 @@ static __always_inline void cpuid_entry_override(struct kvm_cpuid_entry2 *entry,
{
u32 *reg = cpuid_entry_get_reg(entry, leaf * 32);
- BUILD_BUG_ON(leaf >= ARRAY_SIZE(kvm_cpu_caps));
- *reg = kvm_cpu_caps[leaf];
+ BUILD_BUG_ON(leaf >= ARRAY_SIZE(kvm_cpu_caps[0]));
+ *reg = kvm_cpu_caps[CPUID_OL_DEFAULT][leaf];
}
static __always_inline bool guest_cpuid_has(struct kvm_vcpu *vcpu,
@@ -220,7 +224,7 @@ static __always_inline void kvm_cpu_cap_clear(unsigned int x86_feature)
unsigned int x86_leaf = __feature_leaf(x86_feature);
WARN_ON_ONCE(!kvm_is_configuring_cpu_caps);
- kvm_cpu_caps[x86_leaf] &= ~__feature_bit(x86_feature);
+ kvm_cpu_caps[CPUID_OL_DEFAULT][x86_leaf] &= ~__feature_bit(x86_feature);
}
static __always_inline void kvm_cpu_cap_set(unsigned int x86_feature)
@@ -228,14 +232,14 @@ static __always_inline void kvm_cpu_cap_set(unsigned int x86_feature)
unsigned int x86_leaf = __feature_leaf(x86_feature);
WARN_ON_ONCE(!kvm_is_configuring_cpu_caps);
- kvm_cpu_caps[x86_leaf] |= __feature_bit(x86_feature);
+ kvm_cpu_caps[CPUID_OL_DEFAULT][x86_leaf] |= __feature_bit(x86_feature);
}
static __always_inline u32 kvm_cpu_cap_get(unsigned int x86_feature)
{
unsigned int x86_leaf = __feature_leaf(x86_feature);
- return kvm_cpu_caps[x86_leaf] & __feature_bit(x86_feature);
+ return kvm_cpu_caps[CPUID_OL_DEFAULT][x86_leaf] & __feature_bit(x86_feature);
}
static __always_inline bool kvm_cpu_cap_has(unsigned int x86_feature)
--
2.46.0
next prev parent reply other threads:[~2026-04-17 7:32 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-17 7:35 [RFC PATCH 00/27] KVM: x86: Add a paranoid mode for CPUID verification Binbin Wu
2026-04-17 7:35 ` [RFC PATCH 01/27] KVM: x86: Fix emulated CPUID features being applied to wrong sub-leaf Binbin Wu
2026-04-17 7:35 ` [RFC PATCH 02/27] KVM: x86: Reorder the features for CPUID 7 Binbin Wu
2026-04-17 7:35 ` [RFC PATCH 03/27] KVM: x86: Add definitions for CPUID overlays Binbin Wu
2026-04-17 7:35 ` Binbin Wu [this message]
2026-04-17 7:35 ` [RFC PATCH 05/27] KVM: x86: Extend kvm_cpu_cap_{set/clear}() to configure overlays Binbin Wu
2026-04-17 7:35 ` [RFC PATCH 06/27] KVM: x86: Populate TDX CPUID overlay with supported feature bits Binbin Wu
2026-04-17 7:35 ` [RFC PATCH 07/27] KVM: x86: Support KVM_GET_{SUPPORTED,EMULATED}_CPUID as VM scope ioctls Binbin Wu
2026-04-17 7:35 ` [RFC PATCH 08/27] KVM: x86: Thread @kvm to KVM CPU capability helpers Binbin Wu
2026-04-17 7:35 ` [RFC PATCH 09/27] KVM: x86: Use overlays of KVM CPU capabilities Binbin Wu
2026-04-17 7:35 ` [RFC PATCH 10/27] KVM: x86: Use vendor-specific overlay flags instead of F_CPUID_DEFAULT Binbin Wu
2026-04-17 7:35 ` [RFC PATCH 11/27] KVM: SVM: Drop unnecessary clears of unsupported common x86 features Binbin Wu
2026-04-17 7:35 ` [RFC PATCH 12/27] KVM: x86: Split KVM CPU cap leafs into two parts Binbin Wu
2026-04-17 7:35 ` [RFC PATCH 13/27] KVM: x86: Add a helper to initialize CPUID multi-bit fields Binbin Wu
2026-04-17 7:35 ` [RFC PATCH 14/27] KVM: x86: Add a helper to init multiple feature bits based on raw CPUID Binbin Wu
2026-04-17 7:35 ` [RFC PATCH 15/27] KVM: x86: Add infrastructure to track CPUID entries ignored in paranoid mode Binbin Wu
2026-04-17 7:35 ` [RFC PATCH 16/27] KVM: x86: Init allowed masks for basic CPUID range " Binbin Wu
2026-04-17 7:36 ` [RFC PATCH 17/27] KVM: x86: Init allowed masks for extended " Binbin Wu
2026-04-17 7:36 ` [RFC PATCH 18/27] KVM: x86: Handle Centaur CPUID leafs " Binbin Wu
2026-04-17 7:36 ` [RFC PATCH 19/27] KVM: x86: Track KVM PV CPUID features for " Binbin Wu
2026-04-17 7:36 ` [RFC PATCH 20/27] KVM: x86: Add per-VM flag to track CPUID " Binbin Wu
2026-04-17 7:36 ` [RFC PATCH 21/27] KVM: x86: Make kvm_vcpu_after_set_cpuid() return an error code Binbin Wu
2026-04-17 7:36 ` [RFC PATCH 22/27] KVM: x86: Verify userspace CPUID inputs in paranoid mode Binbin Wu
2026-04-17 7:36 ` [RFC PATCH 23/27] KVM: x86: Account for runtime CPUID features " Binbin Wu
2026-04-17 7:36 ` [RFC PATCH 24/27] KVM: x86: Skip paranoid CPUID check for KVM PV leafs when base is relocated Binbin Wu
2026-04-17 7:36 ` [RFC PATCH 25/27] KVM: x86: Add new KVM_CAP_X86_CPUID_PARANOID Binbin Wu
2026-04-17 7:36 ` [RFC PATCH 26/27] KVM: x86: Add a helper to query the allowed CPUID mask Binbin Wu
2026-04-17 7:36 ` [RFC PATCH 27/27] KVM: TDX: Replace hardcoded CPUID filtering with the allowed mask Binbin Wu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260417073610.3246316-5-binbin.wu@linux.intel.com \
--to=binbin.wu@linux.intel.com \
--cc=chao.gao@intel.com \
--cc=kai.huang@intel.com \
--cc=kvm@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=rick.p.edgecombe@intel.com \
--cc=seanjc@google.com \
--cc=xiaoyao.li@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox