traps.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef _ASM_X86_TRAPS_H
  3. #define _ASM_X86_TRAPS_H
  4. #include <linux/context_tracking_state.h>
  5. #include <linux/kprobes.h>
  6. #include <asm/debugreg.h>
  7. #include <asm/siginfo.h> /* TRAP_TRACE, ... */
  8. #define dotraplinkage __visible
  9. asmlinkage void divide_error(void);
  10. asmlinkage void debug(void);
  11. asmlinkage void nmi(void);
  12. asmlinkage void int3(void);
  13. asmlinkage void overflow(void);
  14. asmlinkage void bounds(void);
  15. asmlinkage void invalid_op(void);
  16. asmlinkage void device_not_available(void);
  17. #ifdef CONFIG_X86_64
  18. asmlinkage void double_fault(void);
  19. #endif
  20. asmlinkage void coprocessor_segment_overrun(void);
  21. asmlinkage void invalid_TSS(void);
  22. asmlinkage void segment_not_present(void);
  23. asmlinkage void stack_segment(void);
  24. asmlinkage void general_protection(void);
  25. asmlinkage void page_fault(void);
  26. asmlinkage void async_page_fault(void);
  27. asmlinkage void spurious_interrupt_bug(void);
  28. asmlinkage void coprocessor_error(void);
  29. asmlinkage void alignment_check(void);
  30. #ifdef CONFIG_X86_MCE
  31. asmlinkage void machine_check(void);
  32. #endif /* CONFIG_X86_MCE */
  33. asmlinkage void simd_coprocessor_error(void);
  34. #if defined(CONFIG_X86_64) && defined(CONFIG_XEN_PV)
  35. asmlinkage void xen_divide_error(void);
  36. asmlinkage void xen_xennmi(void);
  37. asmlinkage void xen_xendebug(void);
  38. asmlinkage void xen_xenint3(void);
  39. asmlinkage void xen_overflow(void);
  40. asmlinkage void xen_bounds(void);
  41. asmlinkage void xen_invalid_op(void);
  42. asmlinkage void xen_device_not_available(void);
  43. asmlinkage void xen_double_fault(void);
  44. asmlinkage void xen_coprocessor_segment_overrun(void);
  45. asmlinkage void xen_invalid_TSS(void);
  46. asmlinkage void xen_segment_not_present(void);
  47. asmlinkage void xen_stack_segment(void);
  48. asmlinkage void xen_general_protection(void);
  49. asmlinkage void xen_page_fault(void);
  50. asmlinkage void xen_spurious_interrupt_bug(void);
  51. asmlinkage void xen_coprocessor_error(void);
  52. asmlinkage void xen_alignment_check(void);
  53. #ifdef CONFIG_X86_MCE
  54. asmlinkage void xen_machine_check(void);
  55. #endif /* CONFIG_X86_MCE */
  56. asmlinkage void xen_simd_coprocessor_error(void);
  57. #endif
  58. dotraplinkage void do_divide_error(struct pt_regs *, long);
  59. dotraplinkage void do_debug(struct pt_regs *, long);
  60. dotraplinkage void do_nmi(struct pt_regs *, long);
  61. dotraplinkage void do_int3(struct pt_regs *, long);
  62. dotraplinkage void do_overflow(struct pt_regs *, long);
  63. dotraplinkage void do_bounds(struct pt_regs *, long);
  64. dotraplinkage void do_invalid_op(struct pt_regs *, long);
  65. dotraplinkage void do_device_not_available(struct pt_regs *, long);
  66. dotraplinkage void do_coprocessor_segment_overrun(struct pt_regs *, long);
  67. dotraplinkage void do_invalid_TSS(struct pt_regs *, long);
  68. dotraplinkage void do_segment_not_present(struct pt_regs *, long);
  69. dotraplinkage void do_stack_segment(struct pt_regs *, long);
  70. #ifdef CONFIG_X86_64
  71. dotraplinkage void do_double_fault(struct pt_regs *, long);
  72. #endif
  73. dotraplinkage void do_general_protection(struct pt_regs *, long);
  74. dotraplinkage void do_page_fault(struct pt_regs *, unsigned long);
  75. dotraplinkage void do_spurious_interrupt_bug(struct pt_regs *, long);
  76. dotraplinkage void do_coprocessor_error(struct pt_regs *, long);
  77. dotraplinkage void do_alignment_check(struct pt_regs *, long);
  78. #ifdef CONFIG_X86_MCE
  79. dotraplinkage void do_machine_check(struct pt_regs *, long);
  80. #endif
  81. dotraplinkage void do_simd_coprocessor_error(struct pt_regs *, long);
  82. #ifdef CONFIG_X86_32
  83. dotraplinkage void do_iret_error(struct pt_regs *, long);
  84. #endif
  85. static inline int get_si_code(unsigned long condition)
  86. {
  87. if (condition & DR_STEP)
  88. return TRAP_TRACE;
  89. else if (condition & (DR_TRAP0|DR_TRAP1|DR_TRAP2|DR_TRAP3))
  90. return TRAP_HWBKPT;
  91. else
  92. return TRAP_BRKPT;
  93. }
  94. extern int panic_on_unrecovered_nmi;
  95. void math_emulate(struct math_emu_info *);
  96. #ifndef CONFIG_X86_32
  97. asmlinkage void smp_thermal_interrupt(void);
  98. asmlinkage void smp_threshold_interrupt(void);
  99. asmlinkage void smp_deferred_error_interrupt(void);
  100. #endif
  101. extern void ist_enter(struct pt_regs *regs);
  102. extern void ist_exit(struct pt_regs *regs);
  103. extern void ist_begin_non_atomic(struct pt_regs *regs);
  104. extern void ist_end_non_atomic(void);
  105. #ifdef CONFIG_VMAP_STACK
  106. void __noreturn handle_stack_overflow(const char *message,
  107. struct pt_regs *regs,
  108. unsigned long fault_address);
  109. #endif
  110. /* Interrupts/Exceptions */
  111. enum {
  112. X86_TRAP_DE = 0, /* 0, Divide-by-zero */
  113. X86_TRAP_DB, /* 1, Debug */
  114. X86_TRAP_NMI, /* 2, Non-maskable Interrupt */
  115. X86_TRAP_BP, /* 3, Breakpoint */
  116. X86_TRAP_OF, /* 4, Overflow */
  117. X86_TRAP_BR, /* 5, Bound Range Exceeded */
  118. X86_TRAP_UD, /* 6, Invalid Opcode */
  119. X86_TRAP_NM, /* 7, Device Not Available */
  120. X86_TRAP_DF, /* 8, Double Fault */
  121. X86_TRAP_OLD_MF, /* 9, Coprocessor Segment Overrun */
  122. X86_TRAP_TS, /* 10, Invalid TSS */
  123. X86_TRAP_NP, /* 11, Segment Not Present */
  124. X86_TRAP_SS, /* 12, Stack Segment Fault */
  125. X86_TRAP_GP, /* 13, General Protection Fault */
  126. X86_TRAP_PF, /* 14, Page Fault */
  127. X86_TRAP_SPURIOUS, /* 15, Spurious Interrupt */
  128. X86_TRAP_MF, /* 16, x87 Floating-Point Exception */
  129. X86_TRAP_AC, /* 17, Alignment Check */
  130. X86_TRAP_MC, /* 18, Machine Check */
  131. X86_TRAP_XF, /* 19, SIMD Floating-Point Exception */
  132. X86_TRAP_IRET = 32, /* 32, IRET Exception */
  133. };
  134. /*
  135. * Page fault error code bits:
  136. *
  137. * bit 0 == 0: no page found 1: protection fault
  138. * bit 1 == 0: read access 1: write access
  139. * bit 2 == 0: kernel-mode access 1: user-mode access
  140. * bit 3 == 1: use of reserved bit detected
  141. * bit 4 == 1: fault was an instruction fetch
  142. * bit 5 == 1: protection keys block access
  143. */
  144. enum x86_pf_error_code {
  145. X86_PF_PROT = 1 << 0,
  146. X86_PF_WRITE = 1 << 1,
  147. X86_PF_USER = 1 << 2,
  148. X86_PF_RSVD = 1 << 3,
  149. X86_PF_INSTR = 1 << 4,
  150. X86_PF_PK = 1 << 5,
  151. };
  152. #endif /* _ASM_X86_TRAPS_H */