x86/bus_lock: Add support for AMD

Add Bus Lock Detect (called Bus Lock Trap in AMD docs) support for AMD
platforms. Bus Lock Detect is enumerated with CPUID Fn0000_0007_ECX_x0
bit [24 / BUSLOCKTRAP]. It can be enabled through MSR_IA32_DEBUGCTLMSR.
When enabled, hardware clears DR6[11] and raises a #DB exception on
occurrence of Bus Lock if CPL > 0. More detail about the feature can be
found in AMD APM[1].

[1]: AMD64 Architecture Programmer's Manual Pub. 40332, Rev. 4.07 - June
     2023, Vol 2, 13.1.3.6 Bus Lock Trap
     https://bugzilla.kernel.org/attachment.cgi?id=304653

Signed-off-by: Ravi Bangoria <ravi.bangoria@amd.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com>
Link: https://lore.kernel.org/all/20240808062937.1149-3-ravi.bangoria@amd.com
This commit is contained in:
Ravi Bangoria 2024-08-08 06:29:35 +00:00 committed by Thomas Gleixner
parent 350afa8a11
commit 408eb7417a
4 changed files with 5 additions and 3 deletions

View File

@ -26,7 +26,8 @@ Detection
========= =========
Intel processors may support either or both of the following hardware Intel processors may support either or both of the following hardware
mechanisms to detect split locks and bus locks. mechanisms to detect split locks and bus locks. Some AMD processors also
support bus lock detect.
#AC exception for split lock detection #AC exception for split lock detection
-------------------------------------- --------------------------------------

View File

@ -2428,7 +2428,7 @@ source "kernel/livepatch/Kconfig"
config X86_BUS_LOCK_DETECT config X86_BUS_LOCK_DETECT
bool "Split Lock Detect and Bus Lock Detect support" bool "Split Lock Detect and Bus Lock Detect support"
depends on CPU_SUP_INTEL depends on CPU_SUP_INTEL || CPU_SUP_AMD
default y default y
help help
Enable Split Lock Detect and Bus Lock Detect functionalities. Enable Split Lock Detect and Bus Lock Detect functionalities.

View File

@ -1832,6 +1832,8 @@ static void identify_cpu(struct cpuinfo_x86 *c)
if (this_cpu->c_init) if (this_cpu->c_init)
this_cpu->c_init(c); this_cpu->c_init(c);
bus_lock_init();
/* Disable the PN if appropriate */ /* Disable the PN if appropriate */
squash_the_stupid_serial_number(c); squash_the_stupid_serial_number(c);

View File

@ -610,7 +610,6 @@ static void init_intel(struct cpuinfo_x86 *c)
init_intel_misc_features(c); init_intel_misc_features(c);
split_lock_init(); split_lock_init();
bus_lock_init();
intel_init_thermal(c); intel_init_thermal(c);
} }