It's possible that BIOS/firmware has set DEBUGCTLMSR_BUS_LOCK_DETECT, or
this kernel has been kexec'd from a kernel that enabled bus lock
detection.
Disable bus lock detection explicitly if not wanted.
Signed-off-by: Chenyi Qiang <[email protected]>
Reviewed-by: Tony Luck <[email protected]>
---
arch/x86/kernel/cpu/intel.c | 27 ++++++++++++++-------------
1 file changed, 14 insertions(+), 13 deletions(-)
diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c
index 8321c43554a1..38dda04d9342 100644
--- a/arch/x86/kernel/cpu/intel.c
+++ b/arch/x86/kernel/cpu/intel.c
@@ -1152,22 +1152,23 @@ static void bus_lock_init(void)
{
u64 val;
- /*
- * Warn and fatal are handled by #AC for split lock if #AC for
- * split lock is supported.
- */
- if (!boot_cpu_has(X86_FEATURE_BUS_LOCK_DETECT) ||
- (boot_cpu_has(X86_FEATURE_SPLIT_LOCK_DETECT) &&
- (sld_state == sld_warn || sld_state == sld_fatal)) ||
- sld_state == sld_off)
+ if (!boot_cpu_has(X86_FEATURE_BUS_LOCK_DETECT))
return;
- /*
- * Enable #DB for bus lock. All bus locks are handled in #DB except
- * split locks are handled in #AC in the fatal case.
- */
rdmsrl(MSR_IA32_DEBUGCTLMSR, val);
- val |= DEBUGCTLMSR_BUS_LOCK_DETECT;
+
+ if ((boot_cpu_has(X86_FEATURE_SPLIT_LOCK_DETECT) &&
+ (sld_state == sld_warn || sld_state == sld_fatal)) ||
+ sld_state == sld_off) {
+ /*
+ * Warn and fatal are handled by #AC for split lock if #AC for
+ * split lock is supported.
+ */
+ val &= ~DEBUGCTLMSR_BUS_LOCK_DETECT;
+ } else {
+ val |= DEBUGCTLMSR_BUS_LOCK_DETECT;
+ }
+
wrmsrl(MSR_IA32_DEBUGCTLMSR, val);
}
--
2.17.1
Kindly ping for this minor change.
Thanks
Chenyi
On 9/1/2021 4:40 PM, Chenyi Qiang wrote:
> It's possible that BIOS/firmware has set DEBUGCTLMSR_BUS_LOCK_DETECT, or
> this kernel has been kexec'd from a kernel that enabled bus lock
> detection.
>
> Disable bus lock detection explicitly if not wanted.
>
> Signed-off-by: Chenyi Qiang <[email protected]>
> Reviewed-by: Tony Luck <[email protected]>
> ---
> arch/x86/kernel/cpu/intel.c | 27 ++++++++++++++-------------
> 1 file changed, 14 insertions(+), 13 deletions(-)
>
> diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c
> index 8321c43554a1..38dda04d9342 100644
> --- a/arch/x86/kernel/cpu/intel.c
> +++ b/arch/x86/kernel/cpu/intel.c
> @@ -1152,22 +1152,23 @@ static void bus_lock_init(void)
> {
> u64 val;
>
> - /*
> - * Warn and fatal are handled by #AC for split lock if #AC for
> - * split lock is supported.
> - */
> - if (!boot_cpu_has(X86_FEATURE_BUS_LOCK_DETECT) ||
> - (boot_cpu_has(X86_FEATURE_SPLIT_LOCK_DETECT) &&
> - (sld_state == sld_warn || sld_state == sld_fatal)) ||
> - sld_state == sld_off)
> + if (!boot_cpu_has(X86_FEATURE_BUS_LOCK_DETECT))
> return;
>
> - /*
> - * Enable #DB for bus lock. All bus locks are handled in #DB except
> - * split locks are handled in #AC in the fatal case.
> - */
> rdmsrl(MSR_IA32_DEBUGCTLMSR, val);
> - val |= DEBUGCTLMSR_BUS_LOCK_DETECT;
> +
> + if ((boot_cpu_has(X86_FEATURE_SPLIT_LOCK_DETECT) &&
> + (sld_state == sld_warn || sld_state == sld_fatal)) ||
> + sld_state == sld_off) {
> + /*
> + * Warn and fatal are handled by #AC for split lock if #AC for
> + * split lock is supported.
> + */
> + val &= ~DEBUGCTLMSR_BUS_LOCK_DETECT;
> + } else {
> + val |= DEBUGCTLMSR_BUS_LOCK_DETECT;
> + }
> +
> wrmsrl(MSR_IA32_DEBUGCTLMSR, val);
> }
>
>
Reminder for this minor fix.
On 9/17/2021 10:52 AM, Chenyi Qiang wrote:
> Kindly ping for this minor change.
>
> Thanks
> Chenyi
>
> On 9/1/2021 4:40 PM, Chenyi Qiang wrote:
>> It's possible that BIOS/firmware has set DEBUGCTLMSR_BUS_LOCK_DETECT, or
>> this kernel has been kexec'd from a kernel that enabled bus lock
>> detection.
>>
>> Disable bus lock detection explicitly if not wanted.
>>
>> Signed-off-by: Chenyi Qiang <[email protected]>
>> Reviewed-by: Tony Luck <[email protected]>
>> ---
>> arch/x86/kernel/cpu/intel.c | 27 ++++++++++++++-------------
>> 1 file changed, 14 insertions(+), 13 deletions(-)
>>
>> diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c
>> index 8321c43554a1..38dda04d9342 100644
>> --- a/arch/x86/kernel/cpu/intel.c
>> +++ b/arch/x86/kernel/cpu/intel.c
>> @@ -1152,22 +1152,23 @@ static void bus_lock_init(void)
>> {
>> u64 val;
>> - /*
>> - * Warn and fatal are handled by #AC for split lock if #AC for
>> - * split lock is supported.
>> - */
>> - if (!boot_cpu_has(X86_FEATURE_BUS_LOCK_DETECT) ||
>> - (boot_cpu_has(X86_FEATURE_SPLIT_LOCK_DETECT) &&
>> - (sld_state == sld_warn || sld_state == sld_fatal)) ||
>> - sld_state == sld_off)
>> + if (!boot_cpu_has(X86_FEATURE_BUS_LOCK_DETECT))
>> return;
>> - /*
>> - * Enable #DB for bus lock. All bus locks are handled in #DB except
>> - * split locks are handled in #AC in the fatal case.
>> - */
>> rdmsrl(MSR_IA32_DEBUGCTLMSR, val);
>> - val |= DEBUGCTLMSR_BUS_LOCK_DETECT;
>> +
>> + if ((boot_cpu_has(X86_FEATURE_SPLIT_LOCK_DETECT) &&
>> + (sld_state == sld_warn || sld_state == sld_fatal)) ||
>> + sld_state == sld_off) {
>> + /*
>> + * Warn and fatal are handled by #AC for split lock if #AC for
>> + * split lock is supported.
>> + */
>> + val &= ~DEBUGCTLMSR_BUS_LOCK_DETECT;
>> + } else {
>> + val |= DEBUGCTLMSR_BUS_LOCK_DETECT;
>> + }
>> +
>> wrmsrl(MSR_IA32_DEBUGCTLMSR, val);
>> }
>>
On Wed, Sep 01, 2021, Chenyi Qiang wrote:
> It's possible that BIOS/firmware has set DEBUGCTLMSR_BUS_LOCK_DETECT, or
> this kernel has been kexec'd from a kernel that enabled bus lock
> detection.
This feels like the kernel should explicitly zero out the entire MSR somewhere
in the generic boot flow. E.g. something like this somewhere.
#ifndef CONFIG_X86_DEBUGCTLMSR
if (boot_cpu_data.x86 < 6)
return;
#endifa
wrmsrl(MSR_IA32_DEBUGCTLMSR, 0);
On 10/20/2021 1:05 AM, Sean Christopherson wrote:
> On Wed, Sep 01, 2021, Chenyi Qiang wrote:
>> It's possible that BIOS/firmware has set DEBUGCTLMSR_BUS_LOCK_DETECT, or
>> this kernel has been kexec'd from a kernel that enabled bus lock
>> detection.
>
> This feels like the kernel should explicitly zero out the entire MSR somewhere
> in the generic boot flow. E.g. something like this somewhere.
>
Yes. Meanwhile, I think kernel code prefers to explicitly set/clear the
control bit according to the parameter. Maybe both changes should be
applied.
> #ifndef CONFIG_X86_DEBUGCTLMSR
> if (boot_cpu_data.x86 < 6)
> return;
> #endifa
>
> wrmsrl(MSR_IA32_DEBUGCTLMSR, 0);
>