[PATCH v7 079/120] KVM: VMX: Use standard CPUID(0x12) types
From: Ahmed S. Darwish
Date: Thu May 28 2026 - 12:28:16 EST
For VMX processor compatibility checks, use standard CPUID(0x12) data
types from x86-cpuid-db instead of doing manual bitwise operations.
Do not use parsed CPUID access since mutating X86_FEATURE_SGX1 state
will affect its cached hardware-backed CPUID bit in the future.
Update cpu_has_sgx()'s comment to match current x86 kernel state.
Signed-off-by: Ahmed S. Darwish <darwi@xxxxxxxxxxxxx>
---
arch/x86/kvm/vmx/vmx.c | 17 ++++++++++++-----
1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
index ede773ce065a..20d5397436bf 100644
--- a/arch/x86/kvm/vmx/vmx.c
+++ b/arch/x86/kvm/vmx/vmx.c
@@ -2642,14 +2642,21 @@ void vmx_cache_reg(struct kvm_vcpu *vcpu, enum kvm_reg reg)
}
/*
- * There is no X86_FEATURE for SGX yet, but anyway we need to query CPUID
- * directly instead of going through cpu_has(), to ensure KVM is trapping
- * ENCLS whenever it's supported in hardware. It does not matter whether
- * the host OS supports or has enabled SGX.
+ * Do a direct CPUID query instead of checking X86_FEATURE_SGX1 or parsed
+ * CPUID access. KVM needs to trap ENCLS whenever SGX is supported in
+ * hardware, regardless of whether the host OS supports or has enabled SGX.
*/
static bool cpu_has_sgx(void)
{
- return cpuid_eax(0) >= 0x12 && (cpuid_eax(0x12) & BIT(0));
+ struct leaf_0x12_0 l12;
+ struct leaf_0x0_0 l0;
+
+ cpuid_read(0, &l0);
+ if (l0.max_std_leaf < 0x12)
+ return false;
+
+ cpuid_read(0x12, &l12);
+ return l12.sgx1;
}
static int adjust_vmx_controls(u32 ctl_min, u32 ctl_opt, u32 msr, u32 *result)
--
2.54.0