1*350afa8aSRavi Bangoria // SPDX-License-Identifier: GPL-2.0 2*350afa8aSRavi Bangoria 3*350afa8aSRavi Bangoria #define pr_fmt(fmt) "x86/split lock detection: " fmt 4*350afa8aSRavi Bangoria 5*350afa8aSRavi Bangoria #include <linux/semaphore.h> 6*350afa8aSRavi Bangoria #include <linux/workqueue.h> 7*350afa8aSRavi Bangoria #include <linux/delay.h> 8*350afa8aSRavi Bangoria #include <linux/cpuhotplug.h> 9*350afa8aSRavi Bangoria #include <asm/cpu_device_id.h> 10*350afa8aSRavi Bangoria #include <asm/cmdline.h> 11*350afa8aSRavi Bangoria #include <asm/traps.h> 12*350afa8aSRavi Bangoria #include <asm/cpu.h> 13*350afa8aSRavi Bangoria 14*350afa8aSRavi Bangoria enum split_lock_detect_state { 15*350afa8aSRavi Bangoria sld_off = 0, 16*350afa8aSRavi Bangoria sld_warn, 17*350afa8aSRavi Bangoria sld_fatal, 18*350afa8aSRavi Bangoria sld_ratelimit, 19*350afa8aSRavi Bangoria }; 20*350afa8aSRavi Bangoria 21*350afa8aSRavi Bangoria /* 22*350afa8aSRavi Bangoria * Default to sld_off because most systems do not support split lock detection. 23*350afa8aSRavi Bangoria * sld_state_setup() will switch this to sld_warn on systems that support 24*350afa8aSRavi Bangoria * split lock/bus lock detect, unless there is a command line override. 25*350afa8aSRavi Bangoria */ 26*350afa8aSRavi Bangoria static enum split_lock_detect_state sld_state __ro_after_init = sld_off; 27*350afa8aSRavi Bangoria static u64 msr_test_ctrl_cache __ro_after_init; 28*350afa8aSRavi Bangoria 29*350afa8aSRavi Bangoria /* 30*350afa8aSRavi Bangoria * With a name like MSR_TEST_CTL it should go without saying, but don't touch 31*350afa8aSRavi Bangoria * MSR_TEST_CTL unless the CPU is one of the whitelisted models. Writing it 32*350afa8aSRavi Bangoria * on CPUs that do not support SLD can cause fireworks, even when writing '0'. 33*350afa8aSRavi Bangoria */ 34*350afa8aSRavi Bangoria static bool cpu_model_supports_sld __ro_after_init; 35*350afa8aSRavi Bangoria 36*350afa8aSRavi Bangoria static const struct { 37*350afa8aSRavi Bangoria const char *option; 38*350afa8aSRavi Bangoria enum split_lock_detect_state state; 39*350afa8aSRavi Bangoria } sld_options[] __initconst = { 40*350afa8aSRavi Bangoria { "off", sld_off }, 41*350afa8aSRavi Bangoria { "warn", sld_warn }, 42*350afa8aSRavi Bangoria { "fatal", sld_fatal }, 43*350afa8aSRavi Bangoria { "ratelimit:", sld_ratelimit }, 44*350afa8aSRavi Bangoria }; 45*350afa8aSRavi Bangoria 46*350afa8aSRavi Bangoria static struct ratelimit_state bld_ratelimit; 47*350afa8aSRavi Bangoria 48*350afa8aSRavi Bangoria static unsigned int sysctl_sld_mitigate = 1; 49*350afa8aSRavi Bangoria static DEFINE_SEMAPHORE(buslock_sem, 1); 50*350afa8aSRavi Bangoria 51*350afa8aSRavi Bangoria #ifdef CONFIG_PROC_SYSCTL 52*350afa8aSRavi Bangoria static struct ctl_table sld_sysctls[] = { 53*350afa8aSRavi Bangoria { 54*350afa8aSRavi Bangoria .procname = "split_lock_mitigate", 55*350afa8aSRavi Bangoria .data = &sysctl_sld_mitigate, 56*350afa8aSRavi Bangoria .maxlen = sizeof(unsigned int), 57*350afa8aSRavi Bangoria .mode = 0644, 58*350afa8aSRavi Bangoria .proc_handler = proc_douintvec_minmax, 59*350afa8aSRavi Bangoria .extra1 = SYSCTL_ZERO, 60*350afa8aSRavi Bangoria .extra2 = SYSCTL_ONE, 61*350afa8aSRavi Bangoria }, 62*350afa8aSRavi Bangoria }; 63*350afa8aSRavi Bangoria 64*350afa8aSRavi Bangoria static int __init sld_mitigate_sysctl_init(void) 65*350afa8aSRavi Bangoria { 66*350afa8aSRavi Bangoria register_sysctl_init("kernel", sld_sysctls); 67*350afa8aSRavi Bangoria return 0; 68*350afa8aSRavi Bangoria } 69*350afa8aSRavi Bangoria 70*350afa8aSRavi Bangoria late_initcall(sld_mitigate_sysctl_init); 71*350afa8aSRavi Bangoria #endif 72*350afa8aSRavi Bangoria 73*350afa8aSRavi Bangoria static inline bool match_option(const char *arg, int arglen, const char *opt) 74*350afa8aSRavi Bangoria { 75*350afa8aSRavi Bangoria int len = strlen(opt), ratelimit; 76*350afa8aSRavi Bangoria 77*350afa8aSRavi Bangoria if (strncmp(arg, opt, len)) 78*350afa8aSRavi Bangoria return false; 79*350afa8aSRavi Bangoria 80*350afa8aSRavi Bangoria /* 81*350afa8aSRavi Bangoria * Min ratelimit is 1 bus lock/sec. 82*350afa8aSRavi Bangoria * Max ratelimit is 1000 bus locks/sec. 83*350afa8aSRavi Bangoria */ 84*350afa8aSRavi Bangoria if (sscanf(arg, "ratelimit:%d", &ratelimit) == 1 && 85*350afa8aSRavi Bangoria ratelimit > 0 && ratelimit <= 1000) { 86*350afa8aSRavi Bangoria ratelimit_state_init(&bld_ratelimit, HZ, ratelimit); 87*350afa8aSRavi Bangoria ratelimit_set_flags(&bld_ratelimit, RATELIMIT_MSG_ON_RELEASE); 88*350afa8aSRavi Bangoria return true; 89*350afa8aSRavi Bangoria } 90*350afa8aSRavi Bangoria 91*350afa8aSRavi Bangoria return len == arglen; 92*350afa8aSRavi Bangoria } 93*350afa8aSRavi Bangoria 94*350afa8aSRavi Bangoria static bool split_lock_verify_msr(bool on) 95*350afa8aSRavi Bangoria { 96*350afa8aSRavi Bangoria u64 ctrl, tmp; 97*350afa8aSRavi Bangoria 98*350afa8aSRavi Bangoria if (rdmsrl_safe(MSR_TEST_CTRL, &ctrl)) 99*350afa8aSRavi Bangoria return false; 100*350afa8aSRavi Bangoria if (on) 101*350afa8aSRavi Bangoria ctrl |= MSR_TEST_CTRL_SPLIT_LOCK_DETECT; 102*350afa8aSRavi Bangoria else 103*350afa8aSRavi Bangoria ctrl &= ~MSR_TEST_CTRL_SPLIT_LOCK_DETECT; 104*350afa8aSRavi Bangoria if (wrmsrl_safe(MSR_TEST_CTRL, ctrl)) 105*350afa8aSRavi Bangoria return false; 106*350afa8aSRavi Bangoria rdmsrl(MSR_TEST_CTRL, tmp); 107*350afa8aSRavi Bangoria return ctrl == tmp; 108*350afa8aSRavi Bangoria } 109*350afa8aSRavi Bangoria 110*350afa8aSRavi Bangoria static void __init sld_state_setup(void) 111*350afa8aSRavi Bangoria { 112*350afa8aSRavi Bangoria enum split_lock_detect_state state = sld_warn; 113*350afa8aSRavi Bangoria char arg[20]; 114*350afa8aSRavi Bangoria int i, ret; 115*350afa8aSRavi Bangoria 116*350afa8aSRavi Bangoria if (!boot_cpu_has(X86_FEATURE_SPLIT_LOCK_DETECT) && 117*350afa8aSRavi Bangoria !boot_cpu_has(X86_FEATURE_BUS_LOCK_DETECT)) 118*350afa8aSRavi Bangoria return; 119*350afa8aSRavi Bangoria 120*350afa8aSRavi Bangoria ret = cmdline_find_option(boot_command_line, "split_lock_detect", 121*350afa8aSRavi Bangoria arg, sizeof(arg)); 122*350afa8aSRavi Bangoria if (ret >= 0) { 123*350afa8aSRavi Bangoria for (i = 0; i < ARRAY_SIZE(sld_options); i++) { 124*350afa8aSRavi Bangoria if (match_option(arg, ret, sld_options[i].option)) { 125*350afa8aSRavi Bangoria state = sld_options[i].state; 126*350afa8aSRavi Bangoria break; 127*350afa8aSRavi Bangoria } 128*350afa8aSRavi Bangoria } 129*350afa8aSRavi Bangoria } 130*350afa8aSRavi Bangoria sld_state = state; 131*350afa8aSRavi Bangoria } 132*350afa8aSRavi Bangoria 133*350afa8aSRavi Bangoria static void __init __split_lock_setup(void) 134*350afa8aSRavi Bangoria { 135*350afa8aSRavi Bangoria if (!split_lock_verify_msr(false)) { 136*350afa8aSRavi Bangoria pr_info("MSR access failed: Disabled\n"); 137*350afa8aSRavi Bangoria return; 138*350afa8aSRavi Bangoria } 139*350afa8aSRavi Bangoria 140*350afa8aSRavi Bangoria rdmsrl(MSR_TEST_CTRL, msr_test_ctrl_cache); 141*350afa8aSRavi Bangoria 142*350afa8aSRavi Bangoria if (!split_lock_verify_msr(true)) { 143*350afa8aSRavi Bangoria pr_info("MSR access failed: Disabled\n"); 144*350afa8aSRavi Bangoria return; 145*350afa8aSRavi Bangoria } 146*350afa8aSRavi Bangoria 147*350afa8aSRavi Bangoria /* Restore the MSR to its cached value. */ 148*350afa8aSRavi Bangoria wrmsrl(MSR_TEST_CTRL, msr_test_ctrl_cache); 149*350afa8aSRavi Bangoria 150*350afa8aSRavi Bangoria setup_force_cpu_cap(X86_FEATURE_SPLIT_LOCK_DETECT); 151*350afa8aSRavi Bangoria } 152*350afa8aSRavi Bangoria 153*350afa8aSRavi Bangoria /* 154*350afa8aSRavi Bangoria * MSR_TEST_CTRL is per core, but we treat it like a per CPU MSR. Locking 155*350afa8aSRavi Bangoria * is not implemented as one thread could undo the setting of the other 156*350afa8aSRavi Bangoria * thread immediately after dropping the lock anyway. 157*350afa8aSRavi Bangoria */ 158*350afa8aSRavi Bangoria static void sld_update_msr(bool on) 159*350afa8aSRavi Bangoria { 160*350afa8aSRavi Bangoria u64 test_ctrl_val = msr_test_ctrl_cache; 161*350afa8aSRavi Bangoria 162*350afa8aSRavi Bangoria if (on) 163*350afa8aSRavi Bangoria test_ctrl_val |= MSR_TEST_CTRL_SPLIT_LOCK_DETECT; 164*350afa8aSRavi Bangoria 165*350afa8aSRavi Bangoria wrmsrl(MSR_TEST_CTRL, test_ctrl_val); 166*350afa8aSRavi Bangoria } 167*350afa8aSRavi Bangoria 168*350afa8aSRavi Bangoria void split_lock_init(void) 169*350afa8aSRavi Bangoria { 170*350afa8aSRavi Bangoria /* 171*350afa8aSRavi Bangoria * #DB for bus lock handles ratelimit and #AC for split lock is 172*350afa8aSRavi Bangoria * disabled. 173*350afa8aSRavi Bangoria */ 174*350afa8aSRavi Bangoria if (sld_state == sld_ratelimit) { 175*350afa8aSRavi Bangoria split_lock_verify_msr(false); 176*350afa8aSRavi Bangoria return; 177*350afa8aSRavi Bangoria } 178*350afa8aSRavi Bangoria 179*350afa8aSRavi Bangoria if (cpu_model_supports_sld) 180*350afa8aSRavi Bangoria split_lock_verify_msr(sld_state != sld_off); 181*350afa8aSRavi Bangoria } 182*350afa8aSRavi Bangoria 183*350afa8aSRavi Bangoria static void __split_lock_reenable_unlock(struct work_struct *work) 184*350afa8aSRavi Bangoria { 185*350afa8aSRavi Bangoria sld_update_msr(true); 186*350afa8aSRavi Bangoria up(&buslock_sem); 187*350afa8aSRavi Bangoria } 188*350afa8aSRavi Bangoria 189*350afa8aSRavi Bangoria static DECLARE_DELAYED_WORK(sl_reenable_unlock, __split_lock_reenable_unlock); 190*350afa8aSRavi Bangoria 191*350afa8aSRavi Bangoria static void __split_lock_reenable(struct work_struct *work) 192*350afa8aSRavi Bangoria { 193*350afa8aSRavi Bangoria sld_update_msr(true); 194*350afa8aSRavi Bangoria } 195*350afa8aSRavi Bangoria static DECLARE_DELAYED_WORK(sl_reenable, __split_lock_reenable); 196*350afa8aSRavi Bangoria 197*350afa8aSRavi Bangoria /* 198*350afa8aSRavi Bangoria * If a CPU goes offline with pending delayed work to re-enable split lock 199*350afa8aSRavi Bangoria * detection then the delayed work will be executed on some other CPU. That 200*350afa8aSRavi Bangoria * handles releasing the buslock_sem, but because it executes on a 201*350afa8aSRavi Bangoria * different CPU probably won't re-enable split lock detection. This is a 202*350afa8aSRavi Bangoria * problem on HT systems since the sibling CPU on the same core may then be 203*350afa8aSRavi Bangoria * left running with split lock detection disabled. 204*350afa8aSRavi Bangoria * 205*350afa8aSRavi Bangoria * Unconditionally re-enable detection here. 206*350afa8aSRavi Bangoria */ 207*350afa8aSRavi Bangoria static int splitlock_cpu_offline(unsigned int cpu) 208*350afa8aSRavi Bangoria { 209*350afa8aSRavi Bangoria sld_update_msr(true); 210*350afa8aSRavi Bangoria 211*350afa8aSRavi Bangoria return 0; 212*350afa8aSRavi Bangoria } 213*350afa8aSRavi Bangoria 214*350afa8aSRavi Bangoria static void split_lock_warn(unsigned long ip) 215*350afa8aSRavi Bangoria { 216*350afa8aSRavi Bangoria struct delayed_work *work; 217*350afa8aSRavi Bangoria int cpu; 218*350afa8aSRavi Bangoria 219*350afa8aSRavi Bangoria if (!current->reported_split_lock) 220*350afa8aSRavi Bangoria pr_warn_ratelimited("#AC: %s/%d took a split_lock trap at address: 0x%lx\n", 221*350afa8aSRavi Bangoria current->comm, current->pid, ip); 222*350afa8aSRavi Bangoria current->reported_split_lock = 1; 223*350afa8aSRavi Bangoria 224*350afa8aSRavi Bangoria if (sysctl_sld_mitigate) { 225*350afa8aSRavi Bangoria /* 226*350afa8aSRavi Bangoria * misery factor #1: 227*350afa8aSRavi Bangoria * sleep 10ms before trying to execute split lock. 228*350afa8aSRavi Bangoria */ 229*350afa8aSRavi Bangoria if (msleep_interruptible(10) > 0) 230*350afa8aSRavi Bangoria return; 231*350afa8aSRavi Bangoria /* 232*350afa8aSRavi Bangoria * Misery factor #2: 233*350afa8aSRavi Bangoria * only allow one buslocked disabled core at a time. 234*350afa8aSRavi Bangoria */ 235*350afa8aSRavi Bangoria if (down_interruptible(&buslock_sem) == -EINTR) 236*350afa8aSRavi Bangoria return; 237*350afa8aSRavi Bangoria work = &sl_reenable_unlock; 238*350afa8aSRavi Bangoria } else { 239*350afa8aSRavi Bangoria work = &sl_reenable; 240*350afa8aSRavi Bangoria } 241*350afa8aSRavi Bangoria 242*350afa8aSRavi Bangoria cpu = get_cpu(); 243*350afa8aSRavi Bangoria schedule_delayed_work_on(cpu, work, 2); 244*350afa8aSRavi Bangoria 245*350afa8aSRavi Bangoria /* Disable split lock detection on this CPU to make progress */ 246*350afa8aSRavi Bangoria sld_update_msr(false); 247*350afa8aSRavi Bangoria put_cpu(); 248*350afa8aSRavi Bangoria } 249*350afa8aSRavi Bangoria 250*350afa8aSRavi Bangoria bool handle_guest_split_lock(unsigned long ip) 251*350afa8aSRavi Bangoria { 252*350afa8aSRavi Bangoria if (sld_state == sld_warn) { 253*350afa8aSRavi Bangoria split_lock_warn(ip); 254*350afa8aSRavi Bangoria return true; 255*350afa8aSRavi Bangoria } 256*350afa8aSRavi Bangoria 257*350afa8aSRavi Bangoria pr_warn_once("#AC: %s/%d %s split_lock trap at address: 0x%lx\n", 258*350afa8aSRavi Bangoria current->comm, current->pid, 259*350afa8aSRavi Bangoria sld_state == sld_fatal ? "fatal" : "bogus", ip); 260*350afa8aSRavi Bangoria 261*350afa8aSRavi Bangoria current->thread.error_code = 0; 262*350afa8aSRavi Bangoria current->thread.trap_nr = X86_TRAP_AC; 263*350afa8aSRavi Bangoria force_sig_fault(SIGBUS, BUS_ADRALN, NULL); 264*350afa8aSRavi Bangoria return false; 265*350afa8aSRavi Bangoria } 266*350afa8aSRavi Bangoria EXPORT_SYMBOL_GPL(handle_guest_split_lock); 267*350afa8aSRavi Bangoria 268*350afa8aSRavi Bangoria void bus_lock_init(void) 269*350afa8aSRavi Bangoria { 270*350afa8aSRavi Bangoria u64 val; 271*350afa8aSRavi Bangoria 272*350afa8aSRavi Bangoria if (!boot_cpu_has(X86_FEATURE_BUS_LOCK_DETECT)) 273*350afa8aSRavi Bangoria return; 274*350afa8aSRavi Bangoria 275*350afa8aSRavi Bangoria rdmsrl(MSR_IA32_DEBUGCTLMSR, val); 276*350afa8aSRavi Bangoria 277*350afa8aSRavi Bangoria if ((boot_cpu_has(X86_FEATURE_SPLIT_LOCK_DETECT) && 278*350afa8aSRavi Bangoria (sld_state == sld_warn || sld_state == sld_fatal)) || 279*350afa8aSRavi Bangoria sld_state == sld_off) { 280*350afa8aSRavi Bangoria /* 281*350afa8aSRavi Bangoria * Warn and fatal are handled by #AC for split lock if #AC for 282*350afa8aSRavi Bangoria * split lock is supported. 283*350afa8aSRavi Bangoria */ 284*350afa8aSRavi Bangoria val &= ~DEBUGCTLMSR_BUS_LOCK_DETECT; 285*350afa8aSRavi Bangoria } else { 286*350afa8aSRavi Bangoria val |= DEBUGCTLMSR_BUS_LOCK_DETECT; 287*350afa8aSRavi Bangoria } 288*350afa8aSRavi Bangoria 289*350afa8aSRavi Bangoria wrmsrl(MSR_IA32_DEBUGCTLMSR, val); 290*350afa8aSRavi Bangoria } 291*350afa8aSRavi Bangoria 292*350afa8aSRavi Bangoria bool handle_user_split_lock(struct pt_regs *regs, long error_code) 293*350afa8aSRavi Bangoria { 294*350afa8aSRavi Bangoria if ((regs->flags & X86_EFLAGS_AC) || sld_state == sld_fatal) 295*350afa8aSRavi Bangoria return false; 296*350afa8aSRavi Bangoria split_lock_warn(regs->ip); 297*350afa8aSRavi Bangoria return true; 298*350afa8aSRavi Bangoria } 299*350afa8aSRavi Bangoria 300*350afa8aSRavi Bangoria void handle_bus_lock(struct pt_regs *regs) 301*350afa8aSRavi Bangoria { 302*350afa8aSRavi Bangoria switch (sld_state) { 303*350afa8aSRavi Bangoria case sld_off: 304*350afa8aSRavi Bangoria break; 305*350afa8aSRavi Bangoria case sld_ratelimit: 306*350afa8aSRavi Bangoria /* Enforce no more than bld_ratelimit bus locks/sec. */ 307*350afa8aSRavi Bangoria while (!__ratelimit(&bld_ratelimit)) 308*350afa8aSRavi Bangoria msleep(20); 309*350afa8aSRavi Bangoria /* Warn on the bus lock. */ 310*350afa8aSRavi Bangoria fallthrough; 311*350afa8aSRavi Bangoria case sld_warn: 312*350afa8aSRavi Bangoria pr_warn_ratelimited("#DB: %s/%d took a bus_lock trap at address: 0x%lx\n", 313*350afa8aSRavi Bangoria current->comm, current->pid, regs->ip); 314*350afa8aSRavi Bangoria break; 315*350afa8aSRavi Bangoria case sld_fatal: 316*350afa8aSRavi Bangoria force_sig_fault(SIGBUS, BUS_ADRALN, NULL); 317*350afa8aSRavi Bangoria break; 318*350afa8aSRavi Bangoria } 319*350afa8aSRavi Bangoria } 320*350afa8aSRavi Bangoria 321*350afa8aSRavi Bangoria /* 322*350afa8aSRavi Bangoria * CPU models that are known to have the per-core split-lock detection 323*350afa8aSRavi Bangoria * feature even though they do not enumerate IA32_CORE_CAPABILITIES. 324*350afa8aSRavi Bangoria */ 325*350afa8aSRavi Bangoria static const struct x86_cpu_id split_lock_cpu_ids[] __initconst = { 326*350afa8aSRavi Bangoria X86_MATCH_VFM(INTEL_ICELAKE_X, 0), 327*350afa8aSRavi Bangoria X86_MATCH_VFM(INTEL_ICELAKE_L, 0), 328*350afa8aSRavi Bangoria X86_MATCH_VFM(INTEL_ICELAKE_D, 0), 329*350afa8aSRavi Bangoria {} 330*350afa8aSRavi Bangoria }; 331*350afa8aSRavi Bangoria 332*350afa8aSRavi Bangoria static void __init split_lock_setup(struct cpuinfo_x86 *c) 333*350afa8aSRavi Bangoria { 334*350afa8aSRavi Bangoria const struct x86_cpu_id *m; 335*350afa8aSRavi Bangoria u64 ia32_core_caps; 336*350afa8aSRavi Bangoria 337*350afa8aSRavi Bangoria if (boot_cpu_has(X86_FEATURE_HYPERVISOR)) 338*350afa8aSRavi Bangoria return; 339*350afa8aSRavi Bangoria 340*350afa8aSRavi Bangoria /* Check for CPUs that have support but do not enumerate it: */ 341*350afa8aSRavi Bangoria m = x86_match_cpu(split_lock_cpu_ids); 342*350afa8aSRavi Bangoria if (m) 343*350afa8aSRavi Bangoria goto supported; 344*350afa8aSRavi Bangoria 345*350afa8aSRavi Bangoria if (!cpu_has(c, X86_FEATURE_CORE_CAPABILITIES)) 346*350afa8aSRavi Bangoria return; 347*350afa8aSRavi Bangoria 348*350afa8aSRavi Bangoria /* 349*350afa8aSRavi Bangoria * Not all bits in MSR_IA32_CORE_CAPS are architectural, but 350*350afa8aSRavi Bangoria * MSR_IA32_CORE_CAPS_SPLIT_LOCK_DETECT is. All CPUs that set 351*350afa8aSRavi Bangoria * it have split lock detection. 352*350afa8aSRavi Bangoria */ 353*350afa8aSRavi Bangoria rdmsrl(MSR_IA32_CORE_CAPS, ia32_core_caps); 354*350afa8aSRavi Bangoria if (ia32_core_caps & MSR_IA32_CORE_CAPS_SPLIT_LOCK_DETECT) 355*350afa8aSRavi Bangoria goto supported; 356*350afa8aSRavi Bangoria 357*350afa8aSRavi Bangoria /* CPU is not in the model list and does not have the MSR bit: */ 358*350afa8aSRavi Bangoria return; 359*350afa8aSRavi Bangoria 360*350afa8aSRavi Bangoria supported: 361*350afa8aSRavi Bangoria cpu_model_supports_sld = true; 362*350afa8aSRavi Bangoria __split_lock_setup(); 363*350afa8aSRavi Bangoria } 364*350afa8aSRavi Bangoria 365*350afa8aSRavi Bangoria static void sld_state_show(void) 366*350afa8aSRavi Bangoria { 367*350afa8aSRavi Bangoria if (!boot_cpu_has(X86_FEATURE_BUS_LOCK_DETECT) && 368*350afa8aSRavi Bangoria !boot_cpu_has(X86_FEATURE_SPLIT_LOCK_DETECT)) 369*350afa8aSRavi Bangoria return; 370*350afa8aSRavi Bangoria 371*350afa8aSRavi Bangoria switch (sld_state) { 372*350afa8aSRavi Bangoria case sld_off: 373*350afa8aSRavi Bangoria pr_info("disabled\n"); 374*350afa8aSRavi Bangoria break; 375*350afa8aSRavi Bangoria case sld_warn: 376*350afa8aSRavi Bangoria if (boot_cpu_has(X86_FEATURE_SPLIT_LOCK_DETECT)) { 377*350afa8aSRavi Bangoria pr_info("#AC: crashing the kernel on kernel split_locks and warning on user-space split_locks\n"); 378*350afa8aSRavi Bangoria if (cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, 379*350afa8aSRavi Bangoria "x86/splitlock", NULL, splitlock_cpu_offline) < 0) 380*350afa8aSRavi Bangoria pr_warn("No splitlock CPU offline handler\n"); 381*350afa8aSRavi Bangoria } else if (boot_cpu_has(X86_FEATURE_BUS_LOCK_DETECT)) { 382*350afa8aSRavi Bangoria pr_info("#DB: warning on user-space bus_locks\n"); 383*350afa8aSRavi Bangoria } 384*350afa8aSRavi Bangoria break; 385*350afa8aSRavi Bangoria case sld_fatal: 386*350afa8aSRavi Bangoria if (boot_cpu_has(X86_FEATURE_SPLIT_LOCK_DETECT)) { 387*350afa8aSRavi Bangoria pr_info("#AC: crashing the kernel on kernel split_locks and sending SIGBUS on user-space split_locks\n"); 388*350afa8aSRavi Bangoria } else if (boot_cpu_has(X86_FEATURE_BUS_LOCK_DETECT)) { 389*350afa8aSRavi Bangoria pr_info("#DB: sending SIGBUS on user-space bus_locks%s\n", 390*350afa8aSRavi Bangoria boot_cpu_has(X86_FEATURE_SPLIT_LOCK_DETECT) ? 391*350afa8aSRavi Bangoria " from non-WB" : ""); 392*350afa8aSRavi Bangoria } 393*350afa8aSRavi Bangoria break; 394*350afa8aSRavi Bangoria case sld_ratelimit: 395*350afa8aSRavi Bangoria if (boot_cpu_has(X86_FEATURE_BUS_LOCK_DETECT)) 396*350afa8aSRavi Bangoria pr_info("#DB: setting system wide bus lock rate limit to %u/sec\n", bld_ratelimit.burst); 397*350afa8aSRavi Bangoria break; 398*350afa8aSRavi Bangoria } 399*350afa8aSRavi Bangoria } 400*350afa8aSRavi Bangoria 401*350afa8aSRavi Bangoria void __init sld_setup(struct cpuinfo_x86 *c) 402*350afa8aSRavi Bangoria { 403*350afa8aSRavi Bangoria split_lock_setup(c); 404*350afa8aSRavi Bangoria sld_state_setup(); 405*350afa8aSRavi Bangoria sld_state_show(); 406*350afa8aSRavi Bangoria } 407