1
2
3
4
5
6
7
8
9
10
11
12
13#include <linux/spinlock.h>
14#include <linux/kprobes.h>
15#include <linux/kdebug.h>
16#include <linux/nmi.h>
17#include <linux/debugfs.h>
18#include <linux/delay.h>
19#include <linux/hardirq.h>
20#include <linux/slab.h>
21#include <linux/export.h>
22
23#if defined(CONFIG_EDAC)
24#include <linux/edac.h>
25#endif
26
27#include <linux/atomic.h>
28#include <asm/traps.h>
29#include <asm/mach_traps.h>
30#include <asm/nmi.h>
31#include <asm/x86_init.h>
32
33#define CREATE_TRACE_POINTS
34#include <trace/events/nmi.h>
35
36struct nmi_desc {
37 spinlock_t lock;
38 struct list_head head;
39};
40
41static struct nmi_desc nmi_desc[NMI_MAX] =
42{
43 {
44 .lock = __SPIN_LOCK_UNLOCKED(&nmi_desc[0].lock),
45 .head = LIST_HEAD_INIT(nmi_desc[0].head),
46 },
47 {
48 .lock = __SPIN_LOCK_UNLOCKED(&nmi_desc[1].lock),
49 .head = LIST_HEAD_INIT(nmi_desc[1].head),
50 },
51 {
52 .lock = __SPIN_LOCK_UNLOCKED(&nmi_desc[2].lock),
53 .head = LIST_HEAD_INIT(nmi_desc[2].head),
54 },
55 {
56 .lock = __SPIN_LOCK_UNLOCKED(&nmi_desc[3].lock),
57 .head = LIST_HEAD_INIT(nmi_desc[3].head),
58 },
59
60};
61
62struct nmi_stats {
63 unsigned int normal;
64 unsigned int unknown;
65 unsigned int external;
66 unsigned int swallow;
67};
68
69static DEFINE_PER_CPU(struct nmi_stats, nmi_stats);
70
71static int ignore_nmis;
72
73int unknown_nmi_panic;
74
75
76
77
78static DEFINE_RAW_SPINLOCK(nmi_reason_lock);
79
80static int __init setup_unknown_nmi_panic(char *str)
81{
82 unknown_nmi_panic = 1;
83 return 1;
84}
85__setup("unknown_nmi_panic", setup_unknown_nmi_panic);
86
87#define nmi_to_desc(type) (&nmi_desc[type])
88
89static u64 nmi_longest_ns = 1 * NSEC_PER_MSEC;
90
91static int __init nmi_warning_debugfs(void)
92{
93 debugfs_create_u64("nmi_longest_ns", 0644,
94 arch_debugfs_dir, &nmi_longest_ns);
95 return 0;
96}
97fs_initcall(nmi_warning_debugfs);
98
99static void nmi_max_handler(struct irq_work *w)
100{
101 struct nmiaction *a = container_of(w, struct nmiaction, irq_work);
102 int remainder_ns, decimal_msecs;
103 u64 whole_msecs = ACCESS_ONCE(a->max_duration);
104
105 remainder_ns = do_div(whole_msecs, (1000 * 1000));
106 decimal_msecs = remainder_ns / 1000;
107
108 printk_ratelimited(KERN_INFO
109 "INFO: NMI handler (%ps) took too long to run: %lld.%03d msecs\n",
110 a->handler, whole_msecs, decimal_msecs);
111}
112
113static int __kprobes nmi_handle(unsigned int type, struct pt_regs *regs, bool b2b)
114{
115 struct nmi_desc *desc = nmi_to_desc(type);
116 struct nmiaction *a;
117 int handled=0;
118
119 rcu_read_lock();
120
121
122
123
124
125
126
127 list_for_each_entry_rcu(a, &desc->head, list) {
128 int thishandled;
129 u64 delta;
130
131 delta = sched_clock();
132 thishandled = a->handler(type, regs);
133 handled += thishandled;
134 delta = sched_clock() - delta;
135 trace_nmi_handler(a->handler, (int)delta, thishandled);
136
137 if (delta < nmi_longest_ns || delta < a->max_duration)
138 continue;
139
140 a->max_duration = delta;
141 irq_work_queue(&a->irq_work);
142 }
143
144 rcu_read_unlock();
145
146
147 return handled;
148}
149
150int __register_nmi_handler(unsigned int type, struct nmiaction *action)
151{
152 struct nmi_desc *desc = nmi_to_desc(type);
153 unsigned long flags;
154
155 if (!action->handler)
156 return -EINVAL;
157
158 init_irq_work(&action->irq_work, nmi_max_handler);
159
160 spin_lock_irqsave(&desc->lock, flags);
161
162
163
164
165
166
167 WARN_ON_ONCE(type == NMI_UNKNOWN && !list_empty(&desc->head));
168 WARN_ON_ONCE(type == NMI_SERR && !list_empty(&desc->head));
169 WARN_ON_ONCE(type == NMI_IO_CHECK && !list_empty(&desc->head));
170
171
172
173
174
175 if (action->flags & NMI_FLAG_FIRST)
176 list_add_rcu(&action->list, &desc->head);
177 else
178 list_add_tail_rcu(&action->list, &desc->head);
179
180 spin_unlock_irqrestore(&desc->lock, flags);
181 return 0;
182}
183EXPORT_SYMBOL(__register_nmi_handler);
184
185void unregister_nmi_handler(unsigned int type, const char *name)
186{
187 struct nmi_desc *desc = nmi_to_desc(type);
188 struct nmiaction *n;
189 unsigned long flags;
190
191 spin_lock_irqsave(&desc->lock, flags);
192
193 list_for_each_entry_rcu(n, &desc->head, list) {
194
195
196
197
198 if (!strcmp(n->name, name)) {
199 WARN(in_nmi(),
200 "Trying to free NMI (%s) from NMI context!\n", n->name);
201 list_del_rcu(&n->list);
202 break;
203 }
204 }
205
206 spin_unlock_irqrestore(&desc->lock, flags);
207 synchronize_rcu();
208}
209EXPORT_SYMBOL_GPL(unregister_nmi_handler);
210
211static __kprobes void
212pci_serr_error(unsigned char reason, struct pt_regs *regs)
213{
214
215 if (nmi_handle(NMI_SERR, regs, false))
216 return;
217
218 pr_emerg("NMI: PCI system error (SERR) for reason %02x on CPU %d.\n",
219 reason, smp_processor_id());
220
221
222
223
224
225#if defined(CONFIG_EDAC)
226 if (edac_handler_set()) {
227 edac_atomic_assert_error();
228 return;
229 }
230#endif
231
232 if (panic_on_unrecovered_nmi)
233 panic("NMI: Not continuing");
234
235 pr_emerg("Dazed and confused, but trying to continue\n");
236
237
238 reason = (reason & NMI_REASON_CLEAR_MASK) | NMI_REASON_CLEAR_SERR;
239 outb(reason, NMI_REASON_PORT);
240}
241
242static __kprobes void
243io_check_error(unsigned char reason, struct pt_regs *regs)
244{
245 unsigned long i;
246
247
248 if (nmi_handle(NMI_IO_CHECK, regs, false))
249 return;
250
251 pr_emerg(
252 "NMI: IOCK error (debug interrupt?) for reason %02x on CPU %d.\n",
253 reason, smp_processor_id());
254 show_regs(regs);
255
256 if (panic_on_io_nmi)
257 panic("NMI IOCK error: Not continuing");
258
259
260 reason = (reason & NMI_REASON_CLEAR_MASK) | NMI_REASON_CLEAR_IOCHK;
261 outb(reason, NMI_REASON_PORT);
262
263 i = 20000;
264 while (--i) {
265 touch_nmi_watchdog();
266 udelay(100);
267 }
268
269 reason &= ~NMI_REASON_CLEAR_IOCHK;
270 outb(reason, NMI_REASON_PORT);
271}
272
273static __kprobes void
274unknown_nmi_error(unsigned char reason, struct pt_regs *regs)
275{
276 int handled;
277
278
279
280
281
282
283
284 handled = nmi_handle(NMI_UNKNOWN, regs, false);
285 if (handled) {
286 __this_cpu_add(nmi_stats.unknown, handled);
287 return;
288 }
289
290 __this_cpu_add(nmi_stats.unknown, 1);
291
292 pr_emerg("Uhhuh. NMI received for unknown reason %02x on CPU %d.\n",
293 reason, smp_processor_id());
294
295 pr_emerg("Do you have a strange power saving mode enabled?\n");
296 if (unknown_nmi_panic || panic_on_unrecovered_nmi)
297 panic("NMI: Not continuing");
298
299 pr_emerg("Dazed and confused, but trying to continue\n");
300}
301
302static DEFINE_PER_CPU(bool, swallow_nmi);
303static DEFINE_PER_CPU(unsigned long, last_nmi_rip);
304
305static __kprobes void default_do_nmi(struct pt_regs *regs)
306{
307 unsigned char reason = 0;
308 int handled;
309 bool b2b = false;
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324 if (regs->ip == __this_cpu_read(last_nmi_rip))
325 b2b = true;
326 else
327 __this_cpu_write(swallow_nmi, false);
328
329 __this_cpu_write(last_nmi_rip, regs->ip);
330
331 handled = nmi_handle(NMI_LOCAL, regs, b2b);
332 __this_cpu_add(nmi_stats.normal, handled);
333 if (handled) {
334
335
336
337
338
339
340
341
342 if (handled > 1)
343 __this_cpu_write(swallow_nmi, true);
344 return;
345 }
346
347
348 raw_spin_lock(&nmi_reason_lock);
349 reason = x86_platform.get_nmi_reason();
350
351 if (reason & NMI_REASON_MASK) {
352 if (reason & NMI_REASON_SERR)
353 pci_serr_error(reason, regs);
354 else if (reason & NMI_REASON_IOCHK)
355 io_check_error(reason, regs);
356#ifdef CONFIG_X86_32
357
358
359
360
361 reassert_nmi();
362#endif
363 __this_cpu_add(nmi_stats.external, 1);
364 raw_spin_unlock(&nmi_reason_lock);
365 return;
366 }
367 raw_spin_unlock(&nmi_reason_lock);
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399 if (b2b && __this_cpu_read(swallow_nmi))
400 __this_cpu_add(nmi_stats.swallow, 1);
401 else
402 unknown_nmi_error(reason, regs);
403}
404
405
406
407
408
409#ifdef CONFIG_X86_32
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451enum nmi_states {
452 NMI_NOT_RUNNING = 0,
453 NMI_EXECUTING,
454 NMI_LATCHED,
455};
456static DEFINE_PER_CPU(enum nmi_states, nmi_state);
457static DEFINE_PER_CPU(unsigned long, nmi_cr2);
458
459#define nmi_nesting_preprocess(regs) \
460 do { \
461 if (this_cpu_read(nmi_state) != NMI_NOT_RUNNING) { \
462 this_cpu_write(nmi_state, NMI_LATCHED); \
463 return; \
464 } \
465 this_cpu_write(nmi_state, NMI_EXECUTING); \
466 this_cpu_write(nmi_cr2, read_cr2()); \
467 } while (0); \
468 nmi_restart:
469
470#define nmi_nesting_postprocess() \
471 do { \
472 if (unlikely(this_cpu_read(nmi_cr2) != read_cr2())) \
473 write_cr2(this_cpu_read(nmi_cr2)); \
474 if (this_cpu_dec_return(nmi_state)) \
475 goto nmi_restart; \
476 } while (0)
477#else
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498static DEFINE_PER_CPU(int, update_debug_stack);
499
500static inline void nmi_nesting_preprocess(struct pt_regs *regs)
501{
502
503
504
505
506
507
508 if (unlikely(is_debug_stack(regs->sp))) {
509 debug_stack_set_zero();
510 this_cpu_write(update_debug_stack, 1);
511 }
512}
513
514static inline void nmi_nesting_postprocess(void)
515{
516 if (unlikely(this_cpu_read(update_debug_stack))) {
517 debug_stack_reset();
518 this_cpu_write(update_debug_stack, 0);
519 }
520}
521#endif
522
523dotraplinkage notrace __kprobes void
524do_nmi(struct pt_regs *regs, long error_code)
525{
526 nmi_nesting_preprocess(regs);
527
528 nmi_enter();
529
530 inc_irq_stat(__nmi_count);
531
532 if (!ignore_nmis)
533 default_do_nmi(regs);
534
535 nmi_exit();
536
537
538 nmi_nesting_postprocess();
539}
540
541void stop_nmi(void)
542{
543 ignore_nmis++;
544}
545
546void restart_nmi(void)
547{
548 ignore_nmis--;
549}
550
551
552void local_touch_nmi(void)
553{
554 __this_cpu_write(last_nmi_rip, 0);
555}
556EXPORT_SYMBOL_GPL(local_touch_nmi);
557