mirror of
https://git.proxmox.com/git/mirror_ubuntu-kernels.git
synced 2026-01-06 05:54:17 +00:00
Convert #BP to IDTENTRY_RAW: - Implement the C entry point with DEFINE_IDTENTRY_RAW - Invoke idtentry_enter/exit() from the function body - Emit the ASM stub with DECLARE_IDTENTRY_RAW - Remove the ASM idtentry in 64bit - Remove the open coded ASM entry code in 32bit - Fixup the XEN/PV code - Remove the old prototypes No functional change. This could be a plain IDTENTRY, but as Peter pointed out INT3 is broken vs. the static key in the context tracking code as this static key might be in the state of being patched and has an int3 which would recurse forever. IDTENTRY_RAW is therefore chosen to allow addressing this issue without lots of code churn. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Alexandre Chartre <alexandre.chartre@oracle.com> Acked-by: Peter Zijlstra <peterz@infradead.org> Acked-by: Andy Lutomirski <luto@kernel.org> Link: https://lkml.kernel.org/r/20200505135313.938474960@linutronix.de
102 lines
3.0 KiB
C
102 lines
3.0 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef _ASM_X86_TRAPS_H
|
|
#define _ASM_X86_TRAPS_H
|
|
|
|
#include <linux/context_tracking_state.h>
|
|
#include <linux/kprobes.h>
|
|
|
|
#include <asm/debugreg.h>
|
|
#include <asm/idtentry.h>
|
|
#include <asm/siginfo.h> /* TRAP_TRACE, ... */
|
|
|
|
#define dotraplinkage __visible
|
|
|
|
asmlinkage void debug(void);
|
|
asmlinkage void nmi(void);
|
|
#ifdef CONFIG_X86_64
|
|
asmlinkage void double_fault(void);
|
|
#endif
|
|
asmlinkage void page_fault(void);
|
|
asmlinkage void async_page_fault(void);
|
|
#ifdef CONFIG_X86_MCE
|
|
asmlinkage void machine_check(void);
|
|
#endif /* CONFIG_X86_MCE */
|
|
|
|
#if defined(CONFIG_X86_64) && defined(CONFIG_XEN_PV)
|
|
asmlinkage void xen_xennmi(void);
|
|
asmlinkage void xen_xendebug(void);
|
|
asmlinkage void xen_double_fault(void);
|
|
asmlinkage void xen_page_fault(void);
|
|
#ifdef CONFIG_X86_MCE
|
|
asmlinkage void xen_machine_check(void);
|
|
#endif /* CONFIG_X86_MCE */
|
|
#endif
|
|
|
|
dotraplinkage void do_debug(struct pt_regs *regs, long error_code);
|
|
dotraplinkage void do_nmi(struct pt_regs *regs, long error_code);
|
|
dotraplinkage void do_double_fault(struct pt_regs *regs, long error_code, unsigned long cr2);
|
|
dotraplinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code, unsigned long address);
|
|
dotraplinkage void do_mce(struct pt_regs *regs, long error_code);
|
|
|
|
#ifdef CONFIG_X86_64
|
|
asmlinkage __visible notrace struct pt_regs *sync_regs(struct pt_regs *eregs);
|
|
asmlinkage __visible notrace
|
|
struct bad_iret_stack *fixup_bad_iret(struct bad_iret_stack *s);
|
|
void __init trap_init(void);
|
|
#endif
|
|
|
|
#ifdef CONFIG_X86_F00F_BUG
|
|
/* For handling the FOOF bug */
|
|
void handle_invalid_op(struct pt_regs *regs);
|
|
#endif
|
|
|
|
static inline int get_si_code(unsigned long condition)
|
|
{
|
|
if (condition & DR_STEP)
|
|
return TRAP_TRACE;
|
|
else if (condition & (DR_TRAP0|DR_TRAP1|DR_TRAP2|DR_TRAP3))
|
|
return TRAP_HWBKPT;
|
|
else
|
|
return TRAP_BRKPT;
|
|
}
|
|
|
|
extern int panic_on_unrecovered_nmi;
|
|
|
|
void math_emulate(struct math_emu_info *);
|
|
#ifndef CONFIG_X86_32
|
|
asmlinkage void smp_thermal_interrupt(struct pt_regs *regs);
|
|
asmlinkage void smp_threshold_interrupt(struct pt_regs *regs);
|
|
asmlinkage void smp_deferred_error_interrupt(struct pt_regs *regs);
|
|
#endif
|
|
|
|
void smp_apic_timer_interrupt(struct pt_regs *regs);
|
|
void smp_spurious_interrupt(struct pt_regs *regs);
|
|
void smp_error_interrupt(struct pt_regs *regs);
|
|
asmlinkage void smp_irq_move_cleanup_interrupt(void);
|
|
|
|
#ifdef CONFIG_VMAP_STACK
|
|
void __noreturn handle_stack_overflow(const char *message,
|
|
struct pt_regs *regs,
|
|
unsigned long fault_address);
|
|
#endif
|
|
|
|
/*
|
|
* Page fault error code bits:
|
|
*
|
|
* bit 0 == 0: no page found 1: protection fault
|
|
* bit 1 == 0: read access 1: write access
|
|
* bit 2 == 0: kernel-mode access 1: user-mode access
|
|
* bit 3 == 1: use of reserved bit detected
|
|
* bit 4 == 1: fault was an instruction fetch
|
|
* bit 5 == 1: protection keys block access
|
|
*/
|
|
enum x86_pf_error_code {
|
|
X86_PF_PROT = 1 << 0,
|
|
X86_PF_WRITE = 1 << 1,
|
|
X86_PF_USER = 1 << 2,
|
|
X86_PF_RSVD = 1 << 3,
|
|
X86_PF_INSTR = 1 << 4,
|
|
X86_PF_PK = 1 << 5,
|
|
};
|
|
#endif /* _ASM_X86_TRAPS_H */
|