KVM: SVM: Drop DEBUGCTL[5:2] from guest's effective value
commit ee89e8013383d50a27ea9bf3c8a69eed6799856f 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>
This commit is contained in:
parent
4a12b6c062
commit
0ce61dbca7
@ -3039,6 +3039,18 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr)
|
|||||||
__func__, data);
|
__func__, data);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* AMD changed the architectural behavior of bits 5:2. On CPUs
|
||||||
|
* without BusLockTrap, bits 5:2 control "external pins", but
|
||||||
|
* on CPUs that support BusLockDetect, bit 2 enables BusLockTrap
|
||||||
|
* and bits 5:3 are reserved-to-zero. Sadly, old KVM allowed
|
||||||
|
* the guest to set bits 5:2 despite not actually virtualizing
|
||||||
|
* Performance-Monitoring/Breakpoint external pins. Drop bits
|
||||||
|
* 5:2 for backwards compatibility.
|
||||||
|
*/
|
||||||
|
data &= ~GENMASK(5, 2);
|
||||||
|
|
||||||
if (data & DEBUGCTL_RESERVED_BITS)
|
if (data & DEBUGCTL_RESERVED_BITS)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
@ -539,7 +539,7 @@ static inline bool is_x2apic_msrpm_offset(u32 offset)
|
|||||||
/* svm.c */
|
/* svm.c */
|
||||||
#define MSR_INVALID 0xffffffffU
|
#define MSR_INVALID 0xffffffffU
|
||||||
|
|
||||||
#define DEBUGCTL_RESERVED_BITS (~(0x3fULL))
|
#define DEBUGCTL_RESERVED_BITS (~(DEBUGCTLMSR_BTF | DEBUGCTLMSR_LBR))
|
||||||
|
|
||||||
extern bool dump_invalid_vmcb;
|
extern bool dump_invalid_vmcb;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user