Skip to content

Commit ee89e80

Browse files
committed
KVM: SVM: Drop DEBUGCTL[5:2] from guest's effective value
Drop bits 5:2 from the guest's effective DEBUGCTL value, as AMD changed the architectural behavior of the bits and broke backwards compatibility. On CPUs without BusLockTrap (or at least, in APMs from before ~2023), bits 5:2 controlled the behavior of external pins: Performance-Monitoring/Breakpoint Pin-Control (PBi)—Bits 5:2, read/write. Software uses thesebits to control the type of information reported by the four external performance-monitoring/breakpoint pins on the processor. When a PBi bit is cleared to 0, the corresponding external pin (BPi) reports performance-monitor information. When a PBi bit is set to 1, the corresponding external pin (BPi) reports breakpoint information. With the introduction of BusLockTrap, presumably to be compatible with Intel CPUs, AMD redefined bit 2 to be BLCKDB: Bus Lock #DB Trap (BLCKDB)—Bit 2, read/write. Software sets this bit to enable generation of a #DB trap following successful execution of a bus lock when CPL is > 0. and redefined bits 5:3 (and bit 6) as "6:3 Reserved MBZ". Ideally, KVM would treat bits 5:2 as reserved. Defer that change to a feature cleanup to avoid breaking existing guest in LTS kernels. For now, drop the bits to retain backwards compatibility (of a sort). Note, dropping bits 5:2 is still a guest-visible change, e.g. if the guest is enabling LBRs *and* the legacy PBi bits, then the state of the PBi bits is visible to the guest, whereas now the guest will always see '0'. 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-2-seanjc@google.com Signed-off-by: Sean Christopherson <seanjc@google.com>
1 parent f3513a3 commit ee89e80

File tree

2 files changed

+13
-1
lines changed

2 files changed

+13
-1
lines changed

arch/x86/kvm/svm/svm.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3165,6 +3165,18 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr)
31653165
kvm_pr_unimpl_wrmsr(vcpu, ecx, data);
31663166
break;
31673167
}
3168+
3169+
/*
3170+
* AMD changed the architectural behavior of bits 5:2. On CPUs
3171+
* without BusLockTrap, bits 5:2 control "external pins", but
3172+
* on CPUs that support BusLockDetect, bit 2 enables BusLockTrap
3173+
* and bits 5:3 are reserved-to-zero. Sadly, old KVM allowed
3174+
* the guest to set bits 5:2 despite not actually virtualizing
3175+
* Performance-Monitoring/Breakpoint external pins. Drop bits
3176+
* 5:2 for backwards compatibility.
3177+
*/
3178+
data &= ~GENMASK(5, 2);
3179+
31683180
if (data & DEBUGCTL_RESERVED_BITS)
31693181
return 1;
31703182

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 (~(0x3fULL))
587+
#define DEBUGCTL_RESERVED_BITS (~(DEBUGCTLMSR_BTF | DEBUGCTLMSR_LBR))
588588

589589
extern bool dump_invalid_vmcb;
590590

0 commit comments

Comments
 (0)