xref: /linux/arch/x86/kernel/cpu/bus_lock.c (revision 60675d4ca1ef0857e44eba5849b74a3a998d0c0f)
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