summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Mattson <jmattson@google.com>2026-02-11 02:45:42 +0300
committerSean Christopherson <seanjc@google.com>2026-03-03 03:01:44 +0300
commit690dc03859e7907bc995f389618c748619559477 (patch)
treeb06dab846e6cb1dfb2cc2e0629c7db53ad2d87af
parente907b4e72488f1df878e7e8acf88d23e49cb3ca7 (diff)
downloadlinux-690dc03859e7907bc995f389618c748619559477.tar.xz
KVM: x86: Ignore cpuid faulting in SMM
The Intel Virtualization Technology FlexMigration Application Note says, "When CPUID faulting is enabled, all executions of the CPUID instruction outside system-management mode (SMM) cause a general-protection exception (#GP(0)) if the current privilege level (CPL) is greater than 0." Always allow the execution of CPUID in SMM. Fixes: db2336a80489 ("KVM: x86: virtualize cpuid faulting") Signed-off-by: Jim Mattson <jmattson@google.com> Link: https://patch.msgid.link/20260210234613.1383279-1-jmattson@google.com Signed-off-by: Sean Christopherson <seanjc@google.com>
-rw-r--r--arch/x86/kvm/cpuid.c3
-rw-r--r--arch/x86/kvm/emulate.c6
2 files changed, 5 insertions, 4 deletions
diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
index d2486506a808..baf9a2860d98 100644
--- a/arch/x86/kvm/cpuid.c
+++ b/arch/x86/kvm/cpuid.c
@@ -2157,7 +2157,8 @@ int kvm_emulate_cpuid(struct kvm_vcpu *vcpu)
{
u32 eax, ebx, ecx, edx;
- if (cpuid_fault_enabled(vcpu) && !kvm_require_cpl(vcpu, 0))
+ if (!is_smm(vcpu) && cpuid_fault_enabled(vcpu) &&
+ !kvm_require_cpl(vcpu, 0))
return 1;
eax = kvm_rax_read(vcpu);
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 20ed588015f1..500711c6f069 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -3583,10 +3583,10 @@ static int em_cpuid(struct x86_emulate_ctxt *ctxt)
u64 msr = 0;
ctxt->ops->get_msr(ctxt, MSR_MISC_FEATURES_ENABLES, &msr);
- if (msr & MSR_MISC_FEATURES_ENABLES_CPUID_FAULT &&
- ctxt->ops->cpl(ctxt)) {
+ if (!ctxt->ops->is_smm(ctxt) &&
+ (msr & MSR_MISC_FEATURES_ENABLES_CPUID_FAULT) &&
+ ctxt->ops->cpl(ctxt))
return emulate_gp(ctxt, 0);
- }
eax = reg_read(ctxt, VCPU_REGS_RAX);
ecx = reg_read(ctxt, VCPU_REGS_RCX);