[PATCH v7 078/120] KVM: x86: Use parsed CPUID(0x12)

"Ahmed S. Darwish" <[email protected]> Thu, 28 May 2026 17:38:40 +0200
Newsgroups dev.linux.lists.x86-cpuid,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
For KVM's SGX ECREATE intercept logic, use parsed CPUID(0x12).0 and
CPUID(0x12).1 instead of issuing direct CPUID queries.

This centralizes CPUID parsing and cached access across the kernel.

Signed-off-by: Ahmed S. Darwish <[email protected]>
---
 arch/x86/kvm/vmx/sgx.c | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/arch/x86/kvm/vmx/sgx.c b/arch/x86/kvm/vmx/sgx.c
index 29a1f8e3be60..3f381f0f2395 100644
--- a/arch/x86/kvm/vmx/sgx.c
+++ b/arch/x86/kvm/vmx/sgx.c
@@ -440,8 +440,12 @@ void vcpu_setup_sgx_lepubkeyhash(struct kvm_vcpu *vcpu)
  */
 static bool sgx_intercept_encls_ecreate(struct kvm_vcpu *vcpu)
 {
+	const struct cpuid_regs *sl0 = cpuid_subleaf_raw(&boot_cpu_data, 0x12, 0);
+	const struct cpuid_regs *sl1 = cpuid_subleaf_raw(&boot_cpu_data, 0x12, 1);
 	struct kvm_cpuid_entry2 *guest_cpuid;
-	u32 eax, ebx, ecx, edx;
+
+	if (!sl0 || !sl1)
+		return true;
 
 	if (!vcpu->kvm->arch.sgx_provisioning_allowed)
 		return true;
@@ -450,17 +454,15 @@ static bool sgx_intercept_encls_ecreate(struct kvm_vcpu *vcpu)
 	if (!guest_cpuid)
 		return true;
 
-	cpuid_count(0x12, 0, &eax, &ebx, &ecx, &edx);
-	if (guest_cpuid->ebx != ebx || guest_cpuid->edx != edx)
+	if (guest_cpuid->ebx != sl0->ebx || guest_cpuid->edx != sl0->edx)
 		return true;
 
 	guest_cpuid = kvm_find_cpuid_entry_index(vcpu, 0x12, 1);
 	if (!guest_cpuid)
 		return true;
 
-	cpuid_count(0x12, 1, &eax, &ebx, &ecx, &edx);
-	if (guest_cpuid->eax != eax || guest_cpuid->ebx != ebx ||
-	    guest_cpuid->ecx != ecx || guest_cpuid->edx != edx)
+	if (guest_cpuid->eax != sl1->eax || guest_cpuid->ebx != sl1->ebx ||
+	    guest_cpuid->ecx != sl1->ecx || guest_cpuid->edx != sl1->edx)
 		return true;
 
 	return false;
-- 
2.54.0