]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
KVM: SVM: Suppress DEBUGCTL.BTF on AMD
authorSean Christopherson <seanjc@google.com>
Thu, 27 Feb 2025 22:24:07 +0000 (14:24 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 13 Mar 2025 12:02:14 +0000 (13:02 +0100)
commit d0eac42f5cecce009d315655bee341304fbe075e upstream.

Mark BTF as reserved in DEBUGCTL on AMD, as KVM doesn't actually support
BTF, and fully enabling BTF virtualization is non-trivial due to
interactions with the emulator, guest_debug, #DB interception, nested SVM,
etc.

Don't inject #GP if the guest attempts to set BTF, as there's no way to
communicate lack of support to the guest, and instead suppress the flag
and treat the WRMSR as (partially) unsupported.

In short, make KVM behave the same on AMD and Intel (VMX already squashes
BTF).

Note, due to other bugs in KVM's handling of DEBUGCTL, the only way BTF
has "worked" in any capacity is if the guest simultaneously enables LBRs.

Reported-by: Ravi Bangoria <ravi.bangoria@amd.com>
Cc: stable@vger.kernel.org
Reviewed-and-tested-by: Ravi Bangoria <ravi.bangoria@amd.com>
Link: https://lore.kernel.org/r/20250227222411.3490595-3-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/x86/kvm/svm/svm.c
arch/x86/kvm/svm/svm.h

index e7c247ca687c240cf6c93c6070551e83b87f7f9a..e448ba5374b53ef05ea8fe845bb436d979e0452a 100644 (file)
@@ -3179,6 +3179,15 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr)
                 */
                data &= ~GENMASK(5, 2);
 
+               /*
+                * Suppress BTF as KVM doesn't virtualize BTF, but there's no
+                * way to communicate lack of support to the guest.
+                */
+               if (data & DEBUGCTLMSR_BTF) {
+                       kvm_pr_unimpl_wrmsr(vcpu, MSR_IA32_DEBUGCTLMSR, data);
+                       data &= ~DEBUGCTLMSR_BTF;
+               }
+
                if (data & DEBUGCTL_RESERVED_BITS)
                        return 1;
 
index 8c1e24ca50b589895c0c4625c3573a48b29f3f50..d114efac7af78d865536603c8233c1af40f4682a 100644 (file)
@@ -591,7 +591,7 @@ static inline bool is_vnmi_enabled(struct vcpu_svm *svm)
 /* svm.c */
 #define MSR_INVALID                            0xffffffffU
 
-#define DEBUGCTL_RESERVED_BITS (~(DEBUGCTLMSR_BTF | DEBUGCTLMSR_LBR))
+#define DEBUGCTL_RESERVED_BITS (~DEBUGCTLMSR_LBR)
 
 extern bool dump_invalid_vmcb;