LCOV - code coverage report
Current view: top level - arch/x86/include/asm - traps.h (source / functions) Hit Total Coverage
Test: combined.info Lines: 0 4 0.0 %
Date: 2022-03-28 13:20:08 Functions: 0 0 -
Branches: 0 4 0.0 %

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

Generated by: LCOV version 1.14