Skip to content

Commit d0eac42

Browse files
committed
KVM: SVM: Suppress DEBUGCTL.BTF on AMD
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>
1 parent ee89e80 commit d0eac42

File tree

2 files changed

+10
-1
lines changed

2 files changed

+10
-1
lines changed

arch/x86/kvm/svm/svm.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3177,6 +3177,15 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr)
31773177
*/
31783178
data &= ~GENMASK(5, 2);
31793179

3180+
/*
3181+
* Suppress BTF as KVM doesn't virtualize BTF, but there's no
3182+
* way to communicate lack of support to the guest.
3183+
*/
3184+
if (data & DEBUGCTLMSR_BTF) {
3185+
kvm_pr_unimpl_wrmsr(vcpu, MSR_IA32_DEBUGCTLMSR, data);
3186+
data &= ~DEBUGCTLMSR_BTF;
3187+
}
3188+
31803189
if (data & DEBUGCTL_RESERVED_BITS)
31813190
return 1;
31823191

arch/x86/kvm/svm/svm.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -584,7 +584,7 @@ static inline bool is_vnmi_enabled(struct vcpu_svm *svm)
584584
/* svm.c */
585585
#define MSR_INVALID 0xffffffffU
586586

587-
#define DEBUGCTL_RESERVED_BITS (~(DEBUGCTLMSR_BTF | DEBUGCTLMSR_LBR))
587+
#define DEBUGCTL_RESERVED_BITS (~DEBUGCTLMSR_LBR)
588588

589589
extern bool dump_invalid_vmcb;
590590

0 commit comments

Comments
 (0)