Skip to content

Commit d7ce15e

Browse files
Fenghua Yubp3tk0v
authored andcommitted
x86/split_lock: Enumerate architectural split lock disable bit
The December 2022 edition of the Intel Instruction Set Extensions manual defined that the split lock disable bit in the IA32_CORE_CAPABILITIES MSR is (and retrospectively always has been) architectural. Remove all the model specific checks except for Ice Lake variants which are still needed because these CPU models do not enumerate presence of the IA32_CORE_CAPABILITIES MSR. Originally-by: Dave Hansen <dave.hansen@linux.intel.com> Signed-off-by: Fenghua Yu <fenghua.yu@intel.com> Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> Reviewed-by: Tony Luck <tony.luck@intel.com> Link: https://lore.kernel.org/lkml/20220701131958.687066-1-fenghua.yu@intel.com/t/#mada243bee0915532a6adef6a9e32d244d1a9aef4
1 parent 8cc68c9 commit d7ce15e

1 file changed

Lines changed: 22 additions & 37 deletions

File tree

arch/x86/kernel/cpu/intel.c

Lines changed: 22 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1451,31 +1451,13 @@ void handle_bus_lock(struct pt_regs *regs)
14511451
}
14521452

14531453
/*
1454-
* Bits in the IA32_CORE_CAPABILITIES are not architectural, so they should
1455-
* only be trusted if it is confirmed that a CPU model implements a
1456-
* specific feature at a particular bit position.
1457-
*
1458-
* The possible driver data field values:
1459-
*
1460-
* - 0: CPU models that are known to have the per-core split-lock detection
1461-
* feature even though they do not enumerate IA32_CORE_CAPABILITIES.
1462-
*
1463-
* - 1: CPU models which may enumerate IA32_CORE_CAPABILITIES and if so use
1464-
* bit 5 to enumerate the per-core split-lock detection feature.
1454+
* CPU models that are known to have the per-core split-lock detection
1455+
* feature even though they do not enumerate IA32_CORE_CAPABILITIES.
14651456
*/
14661457
static const struct x86_cpu_id split_lock_cpu_ids[] __initconst = {
1467-
X86_MATCH_INTEL_FAM6_MODEL(ICELAKE_X, 0),
1468-
X86_MATCH_INTEL_FAM6_MODEL(ICELAKE_L, 0),
1469-
X86_MATCH_INTEL_FAM6_MODEL(ICELAKE_D, 0),
1470-
X86_MATCH_INTEL_FAM6_MODEL(ATOM_TREMONT, 1),
1471-
X86_MATCH_INTEL_FAM6_MODEL(ATOM_TREMONT_D, 1),
1472-
X86_MATCH_INTEL_FAM6_MODEL(ATOM_TREMONT_L, 1),
1473-
X86_MATCH_INTEL_FAM6_MODEL(TIGERLAKE_L, 1),
1474-
X86_MATCH_INTEL_FAM6_MODEL(TIGERLAKE, 1),
1475-
X86_MATCH_INTEL_FAM6_MODEL(SAPPHIRERAPIDS_X, 1),
1476-
X86_MATCH_INTEL_FAM6_MODEL(ALDERLAKE, 1),
1477-
X86_MATCH_INTEL_FAM6_MODEL(ALDERLAKE_L, 1),
1478-
X86_MATCH_INTEL_FAM6_MODEL(RAPTORLAKE, 1),
1458+
X86_MATCH_INTEL_FAM6_MODEL(ICELAKE_X, 0),
1459+
X86_MATCH_INTEL_FAM6_MODEL(ICELAKE_L, 0),
1460+
X86_MATCH_INTEL_FAM6_MODEL(ICELAKE_D, 0),
14791461
{}
14801462
};
14811463

@@ -1487,24 +1469,27 @@ static void __init split_lock_setup(struct cpuinfo_x86 *c)
14871469
if (boot_cpu_has(X86_FEATURE_HYPERVISOR))
14881470
return;
14891471

1472+
/* Check for CPUs that have support but do not enumerate it: */
14901473
m = x86_match_cpu(split_lock_cpu_ids);
1491-
if (!m)
1492-
return;
1474+
if (m)
1475+
goto supported;
14931476

1494-
switch (m->driver_data) {
1495-
case 0:
1496-
break;
1497-
case 1:
1498-
if (!cpu_has(c, X86_FEATURE_CORE_CAPABILITIES))
1499-
return;
1500-
rdmsrl(MSR_IA32_CORE_CAPS, ia32_core_caps);
1501-
if (!(ia32_core_caps & MSR_IA32_CORE_CAPS_SPLIT_LOCK_DETECT))
1502-
return;
1503-
break;
1504-
default:
1477+
if (!cpu_has(c, X86_FEATURE_CORE_CAPABILITIES))
15051478
return;
1506-
}
15071479

1480+
/*
1481+
* Not all bits in MSR_IA32_CORE_CAPS are architectural, but
1482+
* MSR_IA32_CORE_CAPS_SPLIT_LOCK_DETECT is. All CPUs that set
1483+
* it have split lock detection.
1484+
*/
1485+
rdmsrl(MSR_IA32_CORE_CAPS, ia32_core_caps);
1486+
if (ia32_core_caps & MSR_IA32_CORE_CAPS_SPLIT_LOCK_DETECT)
1487+
goto supported;
1488+
1489+
/* CPU is not in the model list and does not have the MSR bit: */
1490+
return;
1491+
1492+
supported:
15081493
cpu_model_supports_sld = true;
15091494
__split_lock_setup();
15101495
}

0 commit comments

Comments
 (0)