1 /* 2 * Copyright (C) 1991, 1992 Linus Torvalds 3 * Copyright (C) 2000, 2001, 2002 Andi Kleen, SuSE Labs 4 * 5 * Pentium III FXSR, SSE support 6 * Gareth Hughes <gareth@valinux.com>, May 2000 7 */ 8 9 /* 10 * Handle hardware traps and faults. 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/module.h> 25 #include <linux/ptrace.h> 26 #include <linux/string.h> 27 #include <linux/delay.h> 28 #include <linux/errno.h> 29 #include <linux/kexec.h> 30 #include <linux/sched.h> 31 #include <linux/timer.h> 32 #include <linux/init.h> 33 #include <linux/bug.h> 34 #include <linux/nmi.h> 35 #include <linux/mm.h> 36 #include <linux/smp.h> 37 #include <linux/io.h> 38 39 #ifdef CONFIG_EISA 40 #include <linux/ioport.h> 41 #include <linux/eisa.h> 42 #endif 43 44 #if defined(CONFIG_EDAC) 45 #include <linux/edac.h> 46 #endif 47 48 #include <asm/kmemcheck.h> 49 #include <asm/stacktrace.h> 50 #include <asm/processor.h> 51 #include <asm/debugreg.h> 52 #include <linux/atomic.h> 53 #include <asm/ftrace.h> 54 #include <asm/traps.h> 55 #include <asm/desc.h> 56 #include <asm/i387.h> 57 #include <asm/fpu-internal.h> 58 #include <asm/mce.h> 59 #include <asm/fixmap.h> 60 #include <asm/mach_traps.h> 61 #include <asm/alternative.h> 62 63 #ifdef CONFIG_X86_64 64 #include <asm/x86_init.h> 65 #include <asm/pgalloc.h> 66 #include <asm/proto.h> 67 68 /* No need to be aligned, but done to keep all IDTs defined the same way. */ 69 gate_desc debug_idt_table[NR_VECTORS] __page_aligned_bss; 70 #else 71 #include <asm/processor-flags.h> 72 #include <asm/setup.h> 73 74 asmlinkage int system_call(void); 75 #endif 76 77 /* Must be page-aligned because the real IDT is used in a fixmap. */ 78 gate_desc idt_table[NR_VECTORS] __page_aligned_bss; 79 80 DECLARE_BITMAP(used_vectors, NR_VECTORS); 81 EXPORT_SYMBOL_GPL(used_vectors); 82 83 static inline void conditional_sti(struct pt_regs *regs) 84 { 85 if (regs->flags & X86_EFLAGS_IF) 86 local_irq_enable(); 87 } 88 89 static inline void preempt_conditional_sti(struct pt_regs *regs) 90 { 91 preempt_count_inc(); 92 if (regs->flags & X86_EFLAGS_IF) 93 local_irq_enable(); 94 } 95 96 static inline void conditional_cli(struct pt_regs *regs) 97 { 98 if (regs->flags & X86_EFLAGS_IF) 99 local_irq_disable(); 100 } 101 102 static inline void preempt_conditional_cli(struct pt_regs *regs) 103 { 104 if (regs->flags & X86_EFLAGS_IF) 105 local_irq_disable(); 106 preempt_count_dec(); 107 } 108 109 static int __kprobes 110 do_trap_no_signal(struct task_struct *tsk, int trapnr, char *str, 111 struct pt_regs *regs, long error_code) 112 { 113 #ifdef CONFIG_X86_32 114 if (regs->flags & X86_VM_MASK) { 115 /* 116 * Traps 0, 1, 3, 4, and 5 should be forwarded to vm86. 117 * On nmi (interrupt 2), do_trap should not be called. 118 */ 119 if (trapnr < X86_TRAP_UD) { 120 if (!handle_vm86_trap((struct kernel_vm86_regs *) regs, 121 error_code, trapnr)) 122 return 0; 123 } 124 return -1; 125 } 126 #endif 127 if (!user_mode(regs)) { 128 if (!fixup_exception(regs)) { 129 tsk->thread.error_code = error_code; 130 tsk->thread.trap_nr = trapnr; 131 die(str, regs, error_code); 132 } 133 return 0; 134 } 135 136 return -1; 137 } 138 139 static void __kprobes 140 do_trap(int trapnr, int signr, char *str, struct pt_regs *regs, 141 long error_code, siginfo_t *info) 142 { 143 struct task_struct *tsk = current; 144 145 146 if (!do_trap_no_signal(tsk, trapnr, str, regs, error_code)) 147 return; 148 /* 149 * We want error_code and trap_nr set for userspace faults and 150 * kernelspace faults which result in die(), but not 151 * kernelspace faults which are fixed up. die() gives the 152 * process no chance to handle the signal and notice the 153 * kernel fault information, so that won't result in polluting 154 * the information about previously queued, but not yet 155 * delivered, faults. See also do_general_protection below. 156 */ 157 tsk->thread.error_code = error_code; 158 tsk->thread.trap_nr = trapnr; 159 160 #ifdef CONFIG_X86_64 161 if (show_unhandled_signals && unhandled_signal(tsk, signr) && 162 printk_ratelimit()) { 163 pr_info("%s[%d] trap %s ip:%lx sp:%lx error:%lx", 164 tsk->comm, tsk->pid, str, 165 regs->ip, regs->sp, error_code); 166 print_vma_addr(" in ", regs->ip); 167 pr_cont("\n"); 168 } 169 #endif 170 171 if (info) 172 force_sig_info(signr, info, tsk); 173 else 174 force_sig(signr, tsk); 175 } 176 177 #define DO_ERROR(trapnr, signr, str, name) \ 178 dotraplinkage void do_##name(struct pt_regs *regs, long error_code) \ 179 { \ 180 enum ctx_state prev_state; \ 181 \ 182 prev_state = exception_enter(); \ 183 if (notify_die(DIE_TRAP, str, regs, error_code, \ 184 trapnr, signr) == NOTIFY_STOP) { \ 185 exception_exit(prev_state); \ 186 return; \ 187 } \ 188 conditional_sti(regs); \ 189 do_trap(trapnr, signr, str, regs, error_code, NULL); \ 190 exception_exit(prev_state); \ 191 } 192 193 #define DO_ERROR_INFO(trapnr, signr, str, name, sicode, siaddr) \ 194 dotraplinkage void do_##name(struct pt_regs *regs, long error_code) \ 195 { \ 196 siginfo_t info; \ 197 enum ctx_state prev_state; \ 198 \ 199 info.si_signo = signr; \ 200 info.si_errno = 0; \ 201 info.si_code = sicode; \ 202 info.si_addr = (void __user *)siaddr; \ 203 prev_state = exception_enter(); \ 204 if (notify_die(DIE_TRAP, str, regs, error_code, \ 205 trapnr, signr) == NOTIFY_STOP) { \ 206 exception_exit(prev_state); \ 207 return; \ 208 } \ 209 conditional_sti(regs); \ 210 do_trap(trapnr, signr, str, regs, error_code, &info); \ 211 exception_exit(prev_state); \ 212 } 213 214 DO_ERROR_INFO(X86_TRAP_DE, SIGFPE, "divide error", divide_error, FPE_INTDIV, regs->ip ) 215 DO_ERROR (X86_TRAP_OF, SIGSEGV, "overflow", overflow ) 216 DO_ERROR (X86_TRAP_BR, SIGSEGV, "bounds", bounds ) 217 DO_ERROR_INFO(X86_TRAP_UD, SIGILL, "invalid opcode", invalid_op, ILL_ILLOPN, regs->ip ) 218 DO_ERROR (X86_TRAP_OLD_MF, SIGFPE, "coprocessor segment overrun", coprocessor_segment_overrun ) 219 DO_ERROR (X86_TRAP_TS, SIGSEGV, "invalid TSS", invalid_TSS ) 220 DO_ERROR (X86_TRAP_NP, SIGBUS, "segment not present", segment_not_present ) 221 #ifdef CONFIG_X86_32 222 DO_ERROR (X86_TRAP_SS, SIGBUS, "stack segment", stack_segment ) 223 #endif 224 DO_ERROR_INFO(X86_TRAP_AC, SIGBUS, "alignment check", alignment_check, BUS_ADRALN, 0 ) 225 226 #ifdef CONFIG_X86_64 227 /* Runs on IST stack */ 228 dotraplinkage void do_stack_segment(struct pt_regs *regs, long error_code) 229 { 230 enum ctx_state prev_state; 231 232 prev_state = exception_enter(); 233 if (notify_die(DIE_TRAP, "stack segment", regs, error_code, 234 X86_TRAP_SS, SIGBUS) != NOTIFY_STOP) { 235 preempt_conditional_sti(regs); 236 do_trap(X86_TRAP_SS, SIGBUS, "stack segment", regs, error_code, NULL); 237 preempt_conditional_cli(regs); 238 } 239 exception_exit(prev_state); 240 } 241 242 dotraplinkage void do_double_fault(struct pt_regs *regs, long error_code) 243 { 244 static const char str[] = "double fault"; 245 struct task_struct *tsk = current; 246 247 exception_enter(); 248 /* Return not checked because double check cannot be ignored */ 249 notify_die(DIE_TRAP, str, regs, error_code, X86_TRAP_DF, SIGSEGV); 250 251 tsk->thread.error_code = error_code; 252 tsk->thread.trap_nr = X86_TRAP_DF; 253 254 #ifdef CONFIG_DOUBLEFAULT 255 df_debug(regs, error_code); 256 #endif 257 /* 258 * This is always a kernel trap and never fixable (and thus must 259 * never return). 260 */ 261 for (;;) 262 die(str, regs, error_code); 263 } 264 #endif 265 266 dotraplinkage void __kprobes 267 do_general_protection(struct pt_regs *regs, long error_code) 268 { 269 struct task_struct *tsk; 270 enum ctx_state prev_state; 271 272 prev_state = exception_enter(); 273 conditional_sti(regs); 274 275 #ifdef CONFIG_X86_32 276 if (regs->flags & X86_VM_MASK) { 277 local_irq_enable(); 278 handle_vm86_fault((struct kernel_vm86_regs *) regs, error_code); 279 goto exit; 280 } 281 #endif 282 283 tsk = current; 284 if (!user_mode(regs)) { 285 if (fixup_exception(regs)) 286 goto exit; 287 288 tsk->thread.error_code = error_code; 289 tsk->thread.trap_nr = X86_TRAP_GP; 290 if (notify_die(DIE_GPF, "general protection fault", regs, error_code, 291 X86_TRAP_GP, SIGSEGV) != NOTIFY_STOP) 292 die("general protection fault", regs, error_code); 293 goto exit; 294 } 295 296 tsk->thread.error_code = error_code; 297 tsk->thread.trap_nr = X86_TRAP_GP; 298 299 if (show_unhandled_signals && unhandled_signal(tsk, SIGSEGV) && 300 printk_ratelimit()) { 301 pr_info("%s[%d] general protection ip:%lx sp:%lx error:%lx", 302 tsk->comm, task_pid_nr(tsk), 303 regs->ip, regs->sp, error_code); 304 print_vma_addr(" in ", regs->ip); 305 pr_cont("\n"); 306 } 307 308 force_sig(SIGSEGV, tsk); 309 exit: 310 exception_exit(prev_state); 311 } 312 313 /* May run on IST stack. */ 314 dotraplinkage void __kprobes notrace do_int3(struct pt_regs *regs, long error_code) 315 { 316 enum ctx_state prev_state; 317 318 #ifdef CONFIG_DYNAMIC_FTRACE 319 /* 320 * ftrace must be first, everything else may cause a recursive crash. 321 * See note by declaration of modifying_ftrace_code in ftrace.c 322 */ 323 if (unlikely(atomic_read(&modifying_ftrace_code)) && 324 ftrace_int3_handler(regs)) 325 return; 326 #endif 327 if (poke_int3_handler(regs)) 328 return; 329 330 prev_state = exception_enter(); 331 #ifdef CONFIG_KGDB_LOW_LEVEL_TRAP 332 if (kgdb_ll_trap(DIE_INT3, "int3", regs, error_code, X86_TRAP_BP, 333 SIGTRAP) == NOTIFY_STOP) 334 goto exit; 335 #endif /* CONFIG_KGDB_LOW_LEVEL_TRAP */ 336 337 if (notify_die(DIE_INT3, "int3", regs, error_code, X86_TRAP_BP, 338 SIGTRAP) == NOTIFY_STOP) 339 goto exit; 340 341 /* 342 * Let others (NMI) know that the debug stack is in use 343 * as we may switch to the interrupt stack. 344 */ 345 debug_stack_usage_inc(); 346 preempt_conditional_sti(regs); 347 do_trap(X86_TRAP_BP, SIGTRAP, "int3", regs, error_code, NULL); 348 preempt_conditional_cli(regs); 349 debug_stack_usage_dec(); 350 exit: 351 exception_exit(prev_state); 352 } 353 354 #ifdef CONFIG_X86_64 355 /* 356 * Help handler running on IST stack to switch back to user stack 357 * for scheduling or signal handling. The actual stack switch is done in 358 * entry.S 359 */ 360 asmlinkage __kprobes struct pt_regs *sync_regs(struct pt_regs *eregs) 361 { 362 struct pt_regs *regs = eregs; 363 /* Did already sync */ 364 if (eregs == (struct pt_regs *)eregs->sp) 365 ; 366 /* Exception from user space */ 367 else if (user_mode(eregs)) 368 regs = task_pt_regs(current); 369 /* 370 * Exception from kernel and interrupts are enabled. Move to 371 * kernel process stack. 372 */ 373 else if (eregs->flags & X86_EFLAGS_IF) 374 regs = (struct pt_regs *)(eregs->sp -= sizeof(struct pt_regs)); 375 if (eregs != regs) 376 *regs = *eregs; 377 return regs; 378 } 379 #endif 380 381 /* 382 * Our handling of the processor debug registers is non-trivial. 383 * We do not clear them on entry and exit from the kernel. Therefore 384 * it is possible to get a watchpoint trap here from inside the kernel. 385 * However, the code in ./ptrace.c has ensured that the user can 386 * only set watchpoints on userspace addresses. Therefore the in-kernel 387 * watchpoint trap can only occur in code which is reading/writing 388 * from user space. Such code must not hold kernel locks (since it 389 * can equally take a page fault), therefore it is safe to call 390 * force_sig_info even though that claims and releases locks. 391 * 392 * Code in ./signal.c ensures that the debug control register 393 * is restored before we deliver any signal, and therefore that 394 * user code runs with the correct debug control register even though 395 * we clear it here. 396 * 397 * Being careful here means that we don't have to be as careful in a 398 * lot of more complicated places (task switching can be a bit lazy 399 * about restoring all the debug state, and ptrace doesn't have to 400 * find every occurrence of the TF bit that could be saved away even 401 * by user code) 402 * 403 * May run on IST stack. 404 */ 405 dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code) 406 { 407 struct task_struct *tsk = current; 408 enum ctx_state prev_state; 409 int user_icebp = 0; 410 unsigned long dr6; 411 int si_code; 412 413 prev_state = exception_enter(); 414 415 get_debugreg(dr6, 6); 416 417 /* Filter out all the reserved bits which are preset to 1 */ 418 dr6 &= ~DR6_RESERVED; 419 420 /* 421 * If dr6 has no reason to give us about the origin of this trap, 422 * then it's very likely the result of an icebp/int01 trap. 423 * User wants a sigtrap for that. 424 */ 425 if (!dr6 && user_mode(regs)) 426 user_icebp = 1; 427 428 /* Catch kmemcheck conditions first of all! */ 429 if ((dr6 & DR_STEP) && kmemcheck_trap(regs)) 430 goto exit; 431 432 /* DR6 may or may not be cleared by the CPU */ 433 set_debugreg(0, 6); 434 435 /* 436 * The processor cleared BTF, so don't mark that we need it set. 437 */ 438 clear_tsk_thread_flag(tsk, TIF_BLOCKSTEP); 439 440 /* Store the virtualized DR6 value */ 441 tsk->thread.debugreg6 = dr6; 442 443 if (notify_die(DIE_DEBUG, "debug", regs, (long)&dr6, error_code, 444 SIGTRAP) == NOTIFY_STOP) 445 goto exit; 446 447 /* 448 * Let others (NMI) know that the debug stack is in use 449 * as we may switch to the interrupt stack. 450 */ 451 debug_stack_usage_inc(); 452 453 /* It's safe to allow irq's after DR6 has been saved */ 454 preempt_conditional_sti(regs); 455 456 if (regs->flags & X86_VM_MASK) { 457 handle_vm86_trap((struct kernel_vm86_regs *) regs, error_code, 458 X86_TRAP_DB); 459 preempt_conditional_cli(regs); 460 debug_stack_usage_dec(); 461 goto exit; 462 } 463 464 /* 465 * Single-stepping through system calls: ignore any exceptions in 466 * kernel space, but re-enable TF when returning to user mode. 467 * 468 * We already checked v86 mode above, so we can check for kernel mode 469 * by just checking the CPL of CS. 470 */ 471 if ((dr6 & DR_STEP) && !user_mode(regs)) { 472 tsk->thread.debugreg6 &= ~DR_STEP; 473 set_tsk_thread_flag(tsk, TIF_SINGLESTEP); 474 regs->flags &= ~X86_EFLAGS_TF; 475 } 476 si_code = get_si_code(tsk->thread.debugreg6); 477 if (tsk->thread.debugreg6 & (DR_STEP | DR_TRAP_BITS) || user_icebp) 478 send_sigtrap(tsk, regs, error_code, si_code); 479 preempt_conditional_cli(regs); 480 debug_stack_usage_dec(); 481 482 exit: 483 exception_exit(prev_state); 484 } 485 486 /* 487 * Note that we play around with the 'TS' bit in an attempt to get 488 * the correct behaviour even in the presence of the asynchronous 489 * IRQ13 behaviour 490 */ 491 void math_error(struct pt_regs *regs, int error_code, int trapnr) 492 { 493 struct task_struct *task = current; 494 siginfo_t info; 495 unsigned short err; 496 char *str = (trapnr == X86_TRAP_MF) ? "fpu exception" : 497 "simd exception"; 498 499 if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, SIGFPE) == NOTIFY_STOP) 500 return; 501 conditional_sti(regs); 502 503 if (!user_mode_vm(regs)) 504 { 505 if (!fixup_exception(regs)) { 506 task->thread.error_code = error_code; 507 task->thread.trap_nr = trapnr; 508 die(str, regs, error_code); 509 } 510 return; 511 } 512 513 /* 514 * Save the info for the exception handler and clear the error. 515 */ 516 save_init_fpu(task); 517 task->thread.trap_nr = trapnr; 518 task->thread.error_code = error_code; 519 info.si_signo = SIGFPE; 520 info.si_errno = 0; 521 info.si_addr = (void __user *)regs->ip; 522 if (trapnr == X86_TRAP_MF) { 523 unsigned short cwd, swd; 524 /* 525 * (~cwd & swd) will mask out exceptions that are not set to unmasked 526 * status. 0x3f is the exception bits in these regs, 0x200 is the 527 * C1 reg you need in case of a stack fault, 0x040 is the stack 528 * fault bit. We should only be taking one exception at a time, 529 * so if this combination doesn't produce any single exception, 530 * then we have a bad program that isn't synchronizing its FPU usage 531 * and it will suffer the consequences since we won't be able to 532 * fully reproduce the context of the exception 533 */ 534 cwd = get_fpu_cwd(task); 535 swd = get_fpu_swd(task); 536 537 err = swd & ~cwd; 538 } else { 539 /* 540 * The SIMD FPU exceptions are handled a little differently, as there 541 * is only a single status/control register. Thus, to determine which 542 * unmasked exception was caught we must mask the exception mask bits 543 * at 0x1f80, and then use these to mask the exception bits at 0x3f. 544 */ 545 unsigned short mxcsr = get_fpu_mxcsr(task); 546 err = ~(mxcsr >> 7) & mxcsr; 547 } 548 549 if (err & 0x001) { /* Invalid op */ 550 /* 551 * swd & 0x240 == 0x040: Stack Underflow 552 * swd & 0x240 == 0x240: Stack Overflow 553 * User must clear the SF bit (0x40) if set 554 */ 555 info.si_code = FPE_FLTINV; 556 } else if (err & 0x004) { /* Divide by Zero */ 557 info.si_code = FPE_FLTDIV; 558 } else if (err & 0x008) { /* Overflow */ 559 info.si_code = FPE_FLTOVF; 560 } else if (err & 0x012) { /* Denormal, Underflow */ 561 info.si_code = FPE_FLTUND; 562 } else if (err & 0x020) { /* Precision */ 563 info.si_code = FPE_FLTRES; 564 } else { 565 /* 566 * If we're using IRQ 13, or supposedly even some trap 567 * X86_TRAP_MF implementations, it's possible 568 * we get a spurious trap, which is not an error. 569 */ 570 return; 571 } 572 force_sig_info(SIGFPE, &info, task); 573 } 574 575 dotraplinkage void do_coprocessor_error(struct pt_regs *regs, long error_code) 576 { 577 enum ctx_state prev_state; 578 579 prev_state = exception_enter(); 580 math_error(regs, error_code, X86_TRAP_MF); 581 exception_exit(prev_state); 582 } 583 584 dotraplinkage void 585 do_simd_coprocessor_error(struct pt_regs *regs, long error_code) 586 { 587 enum ctx_state prev_state; 588 589 prev_state = exception_enter(); 590 math_error(regs, error_code, X86_TRAP_XF); 591 exception_exit(prev_state); 592 } 593 594 dotraplinkage void 595 do_spurious_interrupt_bug(struct pt_regs *regs, long error_code) 596 { 597 conditional_sti(regs); 598 #if 0 599 /* No need to warn about this any longer. */ 600 pr_info("Ignoring P6 Local APIC Spurious Interrupt Bug...\n"); 601 #endif 602 } 603 604 asmlinkage void __attribute__((weak)) smp_thermal_interrupt(void) 605 { 606 } 607 608 asmlinkage void __attribute__((weak)) smp_threshold_interrupt(void) 609 { 610 } 611 612 /* 613 * 'math_state_restore()' saves the current math information in the 614 * old math state array, and gets the new ones from the current task 615 * 616 * Careful.. There are problems with IBM-designed IRQ13 behaviour. 617 * Don't touch unless you *really* know how it works. 618 * 619 * Must be called with kernel preemption disabled (eg with local 620 * local interrupts as in the case of do_device_not_available). 621 */ 622 void math_state_restore(void) 623 { 624 struct task_struct *tsk = current; 625 626 if (!tsk_used_math(tsk)) { 627 local_irq_enable(); 628 /* 629 * does a slab alloc which can sleep 630 */ 631 if (init_fpu(tsk)) { 632 /* 633 * ran out of memory! 634 */ 635 do_group_exit(SIGKILL); 636 return; 637 } 638 local_irq_disable(); 639 } 640 641 __thread_fpu_begin(tsk); 642 643 /* 644 * Paranoid restore. send a SIGSEGV if we fail to restore the state. 645 */ 646 if (unlikely(restore_fpu_checking(tsk))) { 647 drop_init_fpu(tsk); 648 force_sig(SIGSEGV, tsk); 649 return; 650 } 651 652 tsk->thread.fpu_counter++; 653 } 654 EXPORT_SYMBOL_GPL(math_state_restore); 655 656 dotraplinkage void __kprobes 657 do_device_not_available(struct pt_regs *regs, long error_code) 658 { 659 enum ctx_state prev_state; 660 661 prev_state = exception_enter(); 662 BUG_ON(use_eager_fpu()); 663 664 #ifdef CONFIG_MATH_EMULATION 665 if (read_cr0() & X86_CR0_EM) { 666 struct math_emu_info info = { }; 667 668 conditional_sti(regs); 669 670 info.regs = regs; 671 math_emulate(&info); 672 exception_exit(prev_state); 673 return; 674 } 675 #endif 676 math_state_restore(); /* interrupts still off */ 677 #ifdef CONFIG_X86_32 678 conditional_sti(regs); 679 #endif 680 exception_exit(prev_state); 681 } 682 683 #ifdef CONFIG_X86_32 684 dotraplinkage void do_iret_error(struct pt_regs *regs, long error_code) 685 { 686 siginfo_t info; 687 enum ctx_state prev_state; 688 689 prev_state = exception_enter(); 690 local_irq_enable(); 691 692 info.si_signo = SIGILL; 693 info.si_errno = 0; 694 info.si_code = ILL_BADSTK; 695 info.si_addr = NULL; 696 if (notify_die(DIE_TRAP, "iret exception", regs, error_code, 697 X86_TRAP_IRET, SIGILL) != NOTIFY_STOP) { 698 do_trap(X86_TRAP_IRET, SIGILL, "iret exception", regs, error_code, 699 &info); 700 } 701 exception_exit(prev_state); 702 } 703 #endif 704 705 /* Set of traps needed for early debugging. */ 706 void __init early_trap_init(void) 707 { 708 set_intr_gate_ist(X86_TRAP_DB, &debug, DEBUG_STACK); 709 /* int3 can be called from all */ 710 set_system_intr_gate_ist(X86_TRAP_BP, &int3, DEBUG_STACK); 711 #ifdef CONFIG_X86_32 712 set_intr_gate(X86_TRAP_PF, page_fault); 713 #endif 714 load_idt(&idt_descr); 715 } 716 717 void __init early_trap_pf_init(void) 718 { 719 #ifdef CONFIG_X86_64 720 set_intr_gate(X86_TRAP_PF, page_fault); 721 #endif 722 } 723 724 void __init trap_init(void) 725 { 726 int i; 727 728 #ifdef CONFIG_EISA 729 void __iomem *p = early_ioremap(0x0FFFD9, 4); 730 731 if (readl(p) == 'E' + ('I'<<8) + ('S'<<16) + ('A'<<24)) 732 EISA_bus = 1; 733 early_iounmap(p, 4); 734 #endif 735 736 set_intr_gate(X86_TRAP_DE, divide_error); 737 set_intr_gate_ist(X86_TRAP_NMI, &nmi, NMI_STACK); 738 /* int4 can be called from all */ 739 set_system_intr_gate(X86_TRAP_OF, &overflow); 740 set_intr_gate(X86_TRAP_BR, bounds); 741 set_intr_gate(X86_TRAP_UD, invalid_op); 742 set_intr_gate(X86_TRAP_NM, device_not_available); 743 #ifdef CONFIG_X86_32 744 set_task_gate(X86_TRAP_DF, GDT_ENTRY_DOUBLEFAULT_TSS); 745 #else 746 set_intr_gate_ist(X86_TRAP_DF, &double_fault, DOUBLEFAULT_STACK); 747 #endif 748 set_intr_gate(X86_TRAP_OLD_MF, coprocessor_segment_overrun); 749 set_intr_gate(X86_TRAP_TS, invalid_TSS); 750 set_intr_gate(X86_TRAP_NP, segment_not_present); 751 set_intr_gate_ist(X86_TRAP_SS, &stack_segment, STACKFAULT_STACK); 752 set_intr_gate(X86_TRAP_GP, general_protection); 753 set_intr_gate(X86_TRAP_SPURIOUS, spurious_interrupt_bug); 754 set_intr_gate(X86_TRAP_MF, coprocessor_error); 755 set_intr_gate(X86_TRAP_AC, alignment_check); 756 #ifdef CONFIG_X86_MCE 757 set_intr_gate_ist(X86_TRAP_MC, &machine_check, MCE_STACK); 758 #endif 759 set_intr_gate(X86_TRAP_XF, simd_coprocessor_error); 760 761 /* Reserve all the builtin and the syscall vector: */ 762 for (i = 0; i < FIRST_EXTERNAL_VECTOR; i++) 763 set_bit(i, used_vectors); 764 765 #ifdef CONFIG_IA32_EMULATION 766 set_system_intr_gate(IA32_SYSCALL_VECTOR, ia32_syscall); 767 set_bit(IA32_SYSCALL_VECTOR, used_vectors); 768 #endif 769 770 #ifdef CONFIG_X86_32 771 set_system_trap_gate(SYSCALL_VECTOR, &system_call); 772 set_bit(SYSCALL_VECTOR, used_vectors); 773 #endif 774 775 /* 776 * Set the IDT descriptor to a fixed read-only location, so that the 777 * "sidt" instruction will not leak the location of the kernel, and 778 * to defend the IDT against arbitrary memory write vulnerabilities. 779 * It will be reloaded in cpu_init() */ 780 __set_fixmap(FIX_RO_IDT, __pa_symbol(idt_table), PAGE_KERNEL_RO); 781 idt_descr.address = fix_to_virt(FIX_RO_IDT); 782 783 /* 784 * Should be a barrier for any external CPU state: 785 */ 786 cpu_init(); 787 788 x86_init.irqs.trap_init(); 789 790 #ifdef CONFIG_X86_64 791 memcpy(&debug_idt_table, &idt_table, IDT_ENTRIES * 16); 792 set_nmi_gate(X86_TRAP_DB, &debug); 793 set_nmi_gate(X86_TRAP_BP, &int3); 794 #endif 795 } 796