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