1
2
3
4
5
6
7
8
9
10
11
12
13#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
14
15#include <linux/context_tracking.h>
16#include <linux/interrupt.h>
17#include <linux/kallsyms.h>
18#include <linux/spinlock.h>
19#include <linux/kprobes.h>
20#include <linux/uaccess.h>
21#include <linux/kdebug.h>
22#include <linux/kgdb.h>
23#include <linux/kernel.h>
24#include <linux/export.h>
25#include <linux/ptrace.h>
26#include <linux/uprobes.h>
27#include <linux/string.h>
28#include <linux/delay.h>
29#include <linux/errno.h>
30#include <linux/kexec.h>
31#include <linux/sched.h>
32#include <linux/sched/task_stack.h>
33#include <linux/timer.h>
34#include <linux/init.h>
35#include <linux/bug.h>
36#include <linux/nmi.h>
37#include <linux/mm.h>
38#include <linux/smp.h>
39#include <linux/io.h>
40
41#if defined(CONFIG_EDAC)
42#include <linux/edac.h>
43#endif
44
45#include <asm/stacktrace.h>
46#include <asm/processor.h>
47#include <asm/debugreg.h>
48#include <linux/atomic.h>
49#include <asm/text-patching.h>
50#include <asm/ftrace.h>
51#include <asm/traps.h>
52#include <asm/desc.h>
53#include <asm/fpu/internal.h>
54#include <asm/cpu_entry_area.h>
55#include <asm/mce.h>
56#include <asm/fixmap.h>
57#include <asm/mach_traps.h>
58#include <asm/alternative.h>
59#include <asm/fpu/xstate.h>
60#include <asm/trace/mpx.h>
61#include <asm/mpx.h>
62#include <asm/vm86.h>
63#include <asm/umip.h>
64
65#ifdef CONFIG_X86_64
66#include <asm/x86_init.h>
67#include <asm/pgalloc.h>
68#include <asm/proto.h>
69#else
70#include <asm/processor-flags.h>
71#include <asm/setup.h>
72#include <asm/proto.h>
73#endif
74
75DECLARE_BITMAP(system_vectors, NR_VECTORS);
76
77static inline void cond_local_irq_enable(struct pt_regs *regs)
78{
79 if (regs->flags & X86_EFLAGS_IF)
80 local_irq_enable();
81}
82
83static inline void cond_local_irq_disable(struct pt_regs *regs)
84{
85 if (regs->flags & X86_EFLAGS_IF)
86 local_irq_disable();
87}
88
89
90
91
92
93
94
95void ist_enter(struct pt_regs *regs)
96{
97 if (user_mode(regs)) {
98 RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU");
99 } else {
100
101
102
103
104
105
106 rcu_nmi_enter();
107 }
108
109 preempt_disable();
110
111
112 RCU_LOCKDEP_WARN(!rcu_is_watching(), "ist_enter didn't work");
113}
114
115void ist_exit(struct pt_regs *regs)
116{
117 preempt_enable_no_resched();
118
119 if (!user_mode(regs))
120 rcu_nmi_exit();
121}
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136void ist_begin_non_atomic(struct pt_regs *regs)
137{
138 BUG_ON(!user_mode(regs));
139
140
141
142
143
144
145 BUG_ON(!on_thread_stack());
146
147 preempt_enable_no_resched();
148}
149
150
151
152
153
154
155void ist_end_non_atomic(void)
156{
157 preempt_disable();
158}
159
160int is_valid_bugaddr(unsigned long addr)
161{
162 unsigned short ud;
163
164 if (addr < TASK_SIZE_MAX)
165 return 0;
166
167 if (probe_kernel_address((unsigned short *)addr, ud))
168 return 0;
169
170 return ud == INSN_UD0 || ud == INSN_UD2;
171}
172
173int fixup_bug(struct pt_regs *regs, int trapnr)
174{
175 if (trapnr != X86_TRAP_UD)
176 return 0;
177
178 switch (report_bug(regs->ip, regs)) {
179 case BUG_TRAP_TYPE_NONE:
180 case BUG_TRAP_TYPE_BUG:
181 break;
182
183 case BUG_TRAP_TYPE_WARN:
184 regs->ip += LEN_UD2;
185 return 1;
186 }
187
188 return 0;
189}
190
191static nokprobe_inline int
192do_trap_no_signal(struct task_struct *tsk, int trapnr, const char *str,
193 struct pt_regs *regs, long error_code)
194{
195 if (v8086_mode(regs)) {
196
197
198
199
200 if (trapnr < X86_TRAP_UD) {
201 if (!handle_vm86_trap((struct kernel_vm86_regs *) regs,
202 error_code, trapnr))
203 return 0;
204 }
205 } else if (!user_mode(regs)) {
206 if (fixup_exception(regs, trapnr))
207 return 0;
208
209 tsk->thread.error_code = error_code;
210 tsk->thread.trap_nr = trapnr;
211 die(str, regs, error_code);
212 }
213
214
215
216
217
218
219
220
221
222
223 tsk->thread.error_code = error_code;
224 tsk->thread.trap_nr = trapnr;
225
226 return -1;
227}
228
229static void show_signal(struct task_struct *tsk, int signr,
230 const char *type, const char *desc,
231 struct pt_regs *regs, long error_code)
232{
233 if (show_unhandled_signals && unhandled_signal(tsk, signr) &&
234 printk_ratelimit()) {
235 pr_info("%s[%d] %s%s ip:%lx sp:%lx error:%lx",
236 tsk->comm, task_pid_nr(tsk), type, desc,
237 regs->ip, regs->sp, error_code);
238 print_vma_addr(KERN_CONT " in ", regs->ip);
239 pr_cont("\n");
240 }
241}
242
243static void
244do_trap(int trapnr, int signr, char *str, struct pt_regs *regs,
245 long error_code, int sicode, void __user *addr)
246{
247 struct task_struct *tsk = current;
248
249
250 if (!do_trap_no_signal(tsk, trapnr, str, regs, error_code))
251 return;
252
253 show_signal(tsk, signr, "trap ", str, regs, error_code);
254
255 if (!sicode)
256 force_sig(signr, tsk);
257 else
258 force_sig_fault(signr, sicode, addr, tsk);
259}
260NOKPROBE_SYMBOL(do_trap);
261
262static void do_error_trap(struct pt_regs *regs, long error_code, char *str,
263 unsigned long trapnr, int signr, int sicode, void __user *addr)
264{
265 RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU");
266
267
268
269
270
271 if (!user_mode(regs) && fixup_bug(regs, trapnr))
272 return;
273
274 if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) !=
275 NOTIFY_STOP) {
276 cond_local_irq_enable(regs);
277 do_trap(trapnr, signr, str, regs, error_code, sicode, addr);
278 }
279}
280
281#define IP ((void __user *)uprobe_get_trap_addr(regs))
282#define DO_ERROR(trapnr, signr, sicode, addr, str, name) \
283dotraplinkage void do_##name(struct pt_regs *regs, long error_code) \
284{ \
285 do_error_trap(regs, error_code, str, trapnr, signr, sicode, addr); \
286}
287
288DO_ERROR(X86_TRAP_DE, SIGFPE, FPE_INTDIV, IP, "divide error", divide_error)
289DO_ERROR(X86_TRAP_OF, SIGSEGV, 0, NULL, "overflow", overflow)
290DO_ERROR(X86_TRAP_UD, SIGILL, ILL_ILLOPN, IP, "invalid opcode", invalid_op)
291DO_ERROR(X86_TRAP_OLD_MF, SIGFPE, 0, NULL, "coprocessor segment overrun", coprocessor_segment_overrun)
292DO_ERROR(X86_TRAP_TS, SIGSEGV, 0, NULL, "invalid TSS", invalid_TSS)
293DO_ERROR(X86_TRAP_NP, SIGBUS, 0, NULL, "segment not present", segment_not_present)
294DO_ERROR(X86_TRAP_SS, SIGBUS, 0, NULL, "stack segment", stack_segment)
295DO_ERROR(X86_TRAP_AC, SIGBUS, BUS_ADRALN, NULL, "alignment check", alignment_check)
296#undef IP
297
298#ifdef CONFIG_VMAP_STACK
299__visible void __noreturn handle_stack_overflow(const char *message,
300 struct pt_regs *regs,
301 unsigned long fault_address)
302{
303 printk(KERN_EMERG "BUG: stack guard page was hit at %p (stack is %p..%p)\n",
304 (void *)fault_address, current->stack,
305 (char *)current->stack + THREAD_SIZE - 1);
306 die(message, regs, 0);
307
308
309 panic(message);
310}
311#endif
312
313#ifdef CONFIG_X86_64
314
315dotraplinkage void do_double_fault(struct pt_regs *regs, long error_code)
316{
317 static const char str[] = "double fault";
318 struct task_struct *tsk = current;
319#ifdef CONFIG_VMAP_STACK
320 unsigned long cr2;
321#endif
322
323#ifdef CONFIG_X86_ESPFIX64
324 extern unsigned char native_irq_return_iret[];
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340 if (((long)regs->sp >> P4D_SHIFT) == ESPFIX_PGD_ENTRY &&
341 regs->cs == __KERNEL_CS &&
342 regs->ip == (unsigned long)native_irq_return_iret)
343 {
344 struct pt_regs *gpregs = (struct pt_regs *)this_cpu_read(cpu_tss_rw.x86_tss.sp0) - 1;
345
346
347
348
349
350
351
352 memmove(&gpregs->ip, (void *)regs->sp, 5*8);
353 gpregs->orig_ax = 0;
354
355
356
357
358
359
360
361
362
363
364
365
366 regs->ip = (unsigned long)general_protection;
367 regs->sp = (unsigned long)&gpregs->orig_ax;
368
369 return;
370 }
371#endif
372
373 ist_enter(regs);
374 notify_die(DIE_TRAP, str, regs, error_code, X86_TRAP_DF, SIGSEGV);
375
376 tsk->thread.error_code = error_code;
377 tsk->thread.trap_nr = X86_TRAP_DF;
378
379#ifdef CONFIG_VMAP_STACK
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417 cr2 = read_cr2();
418 if ((unsigned long)task_stack_page(tsk) - 1 - cr2 < PAGE_SIZE)
419 handle_stack_overflow("kernel stack overflow (double-fault)", regs, cr2);
420#endif
421
422#ifdef CONFIG_DOUBLEFAULT
423 df_debug(regs, error_code);
424#endif
425
426
427
428
429 for (;;)
430 die(str, regs, error_code);
431}
432#endif
433
434dotraplinkage void do_bounds(struct pt_regs *regs, long error_code)
435{
436 const struct mpx_bndcsr *bndcsr;
437
438 RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU");
439 if (notify_die(DIE_TRAP, "bounds", regs, error_code,
440 X86_TRAP_BR, SIGSEGV) == NOTIFY_STOP)
441 return;
442 cond_local_irq_enable(regs);
443
444 if (!user_mode(regs))
445 die("bounds", regs, error_code);
446
447 if (!cpu_feature_enabled(X86_FEATURE_MPX)) {
448
449 goto exit_trap;
450 }
451
452
453
454
455
456
457
458 bndcsr = get_xsave_field_ptr(XFEATURE_MASK_BNDCSR);
459 if (!bndcsr)
460 goto exit_trap;
461
462 trace_bounds_exception_mpx(bndcsr);
463
464
465
466
467
468 switch (bndcsr->bndstatus & MPX_BNDSTA_ERROR_CODE) {
469 case 2:
470 if (mpx_handle_bd_fault())
471 goto exit_trap;
472 break;
473 case 1:
474 {
475 struct task_struct *tsk = current;
476 struct mpx_fault_info mpx;
477
478 if (mpx_fault_info(&mpx, regs)) {
479
480
481
482
483 goto exit_trap;
484 }
485
486
487
488
489
490
491
492 if (!do_trap_no_signal(tsk, X86_TRAP_BR, "bounds", regs,
493 error_code))
494 break;
495
496 show_signal(tsk, SIGSEGV, "trap ", "bounds", regs, error_code);
497
498 force_sig_bnderr(mpx.addr, mpx.lower, mpx.upper);
499 break;
500 }
501 case 0:
502 goto exit_trap;
503 default:
504 die("bounds", regs, error_code);
505 }
506
507 return;
508
509exit_trap:
510
511
512
513
514
515
516
517 do_trap(X86_TRAP_BR, SIGSEGV, "bounds", regs, error_code, 0, NULL);
518}
519
520dotraplinkage void
521do_general_protection(struct pt_regs *regs, long error_code)
522{
523 const char *desc = "general protection fault";
524 struct task_struct *tsk;
525
526 RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU");
527 cond_local_irq_enable(regs);
528
529 if (static_cpu_has(X86_FEATURE_UMIP)) {
530 if (user_mode(regs) && fixup_umip_exception(regs))
531 return;
532 }
533
534 if (v8086_mode(regs)) {
535 local_irq_enable();
536 handle_vm86_fault((struct kernel_vm86_regs *) regs, error_code);
537 return;
538 }
539
540 tsk = current;
541 if (!user_mode(regs)) {
542 if (fixup_exception(regs, X86_TRAP_GP))
543 return;
544
545 tsk->thread.error_code = error_code;
546 tsk->thread.trap_nr = X86_TRAP_GP;
547 if (notify_die(DIE_GPF, desc, regs, error_code,
548 X86_TRAP_GP, SIGSEGV) != NOTIFY_STOP)
549 die(desc, regs, error_code);
550 return;
551 }
552
553 tsk->thread.error_code = error_code;
554 tsk->thread.trap_nr = X86_TRAP_GP;
555
556 show_signal(tsk, SIGSEGV, "", desc, regs, error_code);
557
558 force_sig(SIGSEGV, tsk);
559}
560NOKPROBE_SYMBOL(do_general_protection);
561
562dotraplinkage void notrace do_int3(struct pt_regs *regs, long error_code)
563{
564#ifdef CONFIG_DYNAMIC_FTRACE
565
566
567
568
569 if (unlikely(atomic_read(&modifying_ftrace_code)) &&
570 ftrace_int3_handler(regs))
571 return;
572#endif
573 if (poke_int3_handler(regs))
574 return;
575
576
577
578
579
580
581
582
583 ist_enter(regs);
584 RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU");
585#ifdef CONFIG_KGDB_LOW_LEVEL_TRAP
586 if (kgdb_ll_trap(DIE_INT3, "int3", regs, error_code, X86_TRAP_BP,
587 SIGTRAP) == NOTIFY_STOP)
588 goto exit;
589#endif
590
591#ifdef CONFIG_KPROBES
592 if (kprobe_int3_handler(regs))
593 goto exit;
594#endif
595
596 if (notify_die(DIE_INT3, "int3", regs, error_code, X86_TRAP_BP,
597 SIGTRAP) == NOTIFY_STOP)
598 goto exit;
599
600 cond_local_irq_enable(regs);
601 do_trap(X86_TRAP_BP, SIGTRAP, "int3", regs, error_code, 0, NULL);
602 cond_local_irq_disable(regs);
603
604exit:
605 ist_exit(regs);
606}
607NOKPROBE_SYMBOL(do_int3);
608
609#ifdef CONFIG_X86_64
610
611
612
613
614
615asmlinkage __visible notrace struct pt_regs *sync_regs(struct pt_regs *eregs)
616{
617 struct pt_regs *regs = (struct pt_regs *)this_cpu_read(cpu_current_top_of_stack) - 1;
618 if (regs != eregs)
619 *regs = *eregs;
620 return regs;
621}
622NOKPROBE_SYMBOL(sync_regs);
623
624struct bad_iret_stack {
625 void *error_entry_ret;
626 struct pt_regs regs;
627};
628
629asmlinkage __visible notrace
630struct bad_iret_stack *fixup_bad_iret(struct bad_iret_stack *s)
631{
632
633
634
635
636
637
638
639
640 struct bad_iret_stack *new_stack =
641 (struct bad_iret_stack *)this_cpu_read(cpu_tss_rw.x86_tss.sp0) - 1;
642
643
644 memmove(&new_stack->regs.ip, (void *)s->regs.sp, 5*8);
645
646
647 memmove(new_stack, s, offsetof(struct bad_iret_stack, regs.ip));
648
649 BUG_ON(!user_mode(&new_stack->regs));
650 return new_stack;
651}
652NOKPROBE_SYMBOL(fixup_bad_iret);
653#endif
654
655static bool is_sysenter_singlestep(struct pt_regs *regs)
656{
657
658
659
660
661
662
663
664
665#ifdef CONFIG_X86_32
666 return (regs->ip - (unsigned long)__begin_SYSENTER_singlestep_region) <
667 (unsigned long)__end_SYSENTER_singlestep_region -
668 (unsigned long)__begin_SYSENTER_singlestep_region;
669#elif defined(CONFIG_IA32_EMULATION)
670 return (regs->ip - (unsigned long)entry_SYSENTER_compat) <
671 (unsigned long)__end_entry_SYSENTER_compat -
672 (unsigned long)entry_SYSENTER_compat;
673#else
674 return false;
675#endif
676}
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702dotraplinkage void do_debug(struct pt_regs *regs, long error_code)
703{
704 struct task_struct *tsk = current;
705 int user_icebp = 0;
706 unsigned long dr6;
707 int si_code;
708
709 ist_enter(regs);
710
711 get_debugreg(dr6, 6);
712
713
714
715
716
717
718
719
720
721
722
723 set_debugreg(0, 6);
724
725
726 dr6 &= ~DR6_RESERVED;
727
728
729
730
731
732
733 clear_tsk_thread_flag(tsk, TIF_BLOCKSTEP);
734
735 if (unlikely(!user_mode(regs) && (dr6 & DR_STEP) &&
736 is_sysenter_singlestep(regs))) {
737 dr6 &= ~DR_STEP;
738 if (!dr6)
739 goto exit;
740
741
742
743
744
745 }
746
747
748
749
750
751
752 if (!dr6 && user_mode(regs))
753 user_icebp = 1;
754
755
756 tsk->thread.debugreg6 = dr6;
757
758#ifdef CONFIG_KPROBES
759 if (kprobe_debug_handler(regs))
760 goto exit;
761#endif
762
763 if (notify_die(DIE_DEBUG, "debug", regs, (long)&dr6, error_code,
764 SIGTRAP) == NOTIFY_STOP)
765 goto exit;
766
767
768
769
770
771 debug_stack_usage_inc();
772
773
774 cond_local_irq_enable(regs);
775
776 if (v8086_mode(regs)) {
777 handle_vm86_trap((struct kernel_vm86_regs *) regs, error_code,
778 X86_TRAP_DB);
779 cond_local_irq_disable(regs);
780 debug_stack_usage_dec();
781 goto exit;
782 }
783
784 if (WARN_ON_ONCE((dr6 & DR_STEP) && !user_mode(regs))) {
785
786
787
788
789
790
791 tsk->thread.debugreg6 &= ~DR_STEP;
792 set_tsk_thread_flag(tsk, TIF_SINGLESTEP);
793 regs->flags &= ~X86_EFLAGS_TF;
794 }
795 si_code = get_si_code(tsk->thread.debugreg6);
796 if (tsk->thread.debugreg6 & (DR_STEP | DR_TRAP_BITS) || user_icebp)
797 send_sigtrap(tsk, regs, error_code, si_code);
798 cond_local_irq_disable(regs);
799 debug_stack_usage_dec();
800
801exit:
802 ist_exit(regs);
803}
804NOKPROBE_SYMBOL(do_debug);
805
806
807
808
809
810
811static void math_error(struct pt_regs *regs, int error_code, int trapnr)
812{
813 struct task_struct *task = current;
814 struct fpu *fpu = &task->thread.fpu;
815 int si_code;
816 char *str = (trapnr == X86_TRAP_MF) ? "fpu exception" :
817 "simd exception";
818
819 cond_local_irq_enable(regs);
820
821 if (!user_mode(regs)) {
822 if (fixup_exception(regs, trapnr))
823 return;
824
825 task->thread.error_code = error_code;
826 task->thread.trap_nr = trapnr;
827
828 if (notify_die(DIE_TRAP, str, regs, error_code,
829 trapnr, SIGFPE) != NOTIFY_STOP)
830 die(str, regs, error_code);
831 return;
832 }
833
834
835
836
837 fpu__save(fpu);
838
839 task->thread.trap_nr = trapnr;
840 task->thread.error_code = error_code;
841
842 si_code = fpu__exception_code(fpu, trapnr);
843
844 if (!si_code)
845 return;
846
847 force_sig_fault(SIGFPE, si_code,
848 (void __user *)uprobe_get_trap_addr(regs), task);
849}
850
851dotraplinkage void do_coprocessor_error(struct pt_regs *regs, long error_code)
852{
853 RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU");
854 math_error(regs, error_code, X86_TRAP_MF);
855}
856
857dotraplinkage void
858do_simd_coprocessor_error(struct pt_regs *regs, long error_code)
859{
860 RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU");
861 math_error(regs, error_code, X86_TRAP_XF);
862}
863
864dotraplinkage void
865do_spurious_interrupt_bug(struct pt_regs *regs, long error_code)
866{
867 cond_local_irq_enable(regs);
868}
869
870dotraplinkage void
871do_device_not_available(struct pt_regs *regs, long error_code)
872{
873 unsigned long cr0;
874
875 RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU");
876
877#ifdef CONFIG_MATH_EMULATION
878 if (!boot_cpu_has(X86_FEATURE_FPU) && (read_cr0() & X86_CR0_EM)) {
879 struct math_emu_info info = { };
880
881 cond_local_irq_enable(regs);
882
883 info.regs = regs;
884 math_emulate(&info);
885 return;
886 }
887#endif
888
889
890 cr0 = read_cr0();
891 if (WARN(cr0 & X86_CR0_TS, "CR0.TS was set")) {
892
893 write_cr0(cr0 & ~X86_CR0_TS);
894 } else {
895
896
897
898
899
900 die("unexpected #NM exception", regs, error_code);
901 }
902}
903NOKPROBE_SYMBOL(do_device_not_available);
904
905#ifdef CONFIG_X86_32
906dotraplinkage void do_iret_error(struct pt_regs *regs, long error_code)
907{
908 RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU");
909 local_irq_enable();
910
911 if (notify_die(DIE_TRAP, "iret exception", regs, error_code,
912 X86_TRAP_IRET, SIGILL) != NOTIFY_STOP) {
913 do_trap(X86_TRAP_IRET, SIGILL, "iret exception", regs, error_code,
914 ILL_BADSTK, (void __user *)NULL);
915 }
916}
917#endif
918
919void __init trap_init(void)
920{
921
922 setup_cpu_entry_areas();
923
924 idt_setup_traps();
925
926
927
928
929
930
931 cea_set_pte(CPU_ENTRY_AREA_RO_IDT_VADDR, __pa_symbol(idt_table),
932 PAGE_KERNEL_RO);
933 idt_descr.address = CPU_ENTRY_AREA_RO_IDT;
934
935
936
937
938 cpu_init();
939
940 idt_setup_ist_traps();
941
942 x86_init.irqs.trap_init();
943
944 idt_setup_debugidt_traps();
945}
946