Skip to content

Commit 29a5d95

Browse files
sean-jcgregkh
authored andcommitted
KVM: SVM: Drop DEBUGCTL[5:2] from guest's effective value
commit ee89e80 upstream. 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> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 4957b6e commit 29a5d95

2 files changed

Lines changed: 13 additions & 1 deletion

File tree

arch/x86/kvm/svm/svm.c

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

arch/x86/kvm/svm/svm.h

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

594-
#define DEBUGCTL_RESERVED_BITS (~(0x3fULL))
594+
#define DEBUGCTL_RESERVED_BITS (~(DEBUGCTLMSR_BTF | DEBUGCTLMSR_LBR))
595595

596596
extern bool dump_invalid_vmcb;
597597

0 commit comments

Comments
 (0)