162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef _ASM_X86_TRAPS_H 362306a36Sopenharmony_ci#define _ASM_X86_TRAPS_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include <linux/context_tracking_state.h> 662306a36Sopenharmony_ci#include <linux/kprobes.h> 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <asm/debugreg.h> 962306a36Sopenharmony_ci#include <asm/idtentry.h> 1062306a36Sopenharmony_ci#include <asm/siginfo.h> /* TRAP_TRACE, ... */ 1162306a36Sopenharmony_ci#include <asm/trap_pf.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#ifdef CONFIG_X86_64 1462306a36Sopenharmony_ciasmlinkage __visible notrace struct pt_regs *sync_regs(struct pt_regs *eregs); 1562306a36Sopenharmony_ciasmlinkage __visible notrace 1662306a36Sopenharmony_cistruct pt_regs *fixup_bad_iret(struct pt_regs *bad_regs); 1762306a36Sopenharmony_civoid __init trap_init(void); 1862306a36Sopenharmony_ciasmlinkage __visible noinstr struct pt_regs *vc_switch_off_ist(struct pt_regs *eregs); 1962306a36Sopenharmony_ci#endif 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ciextern int ibt_selftest(void); 2262306a36Sopenharmony_ciextern int ibt_selftest_noendbr(void); 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#ifdef CONFIG_X86_F00F_BUG 2562306a36Sopenharmony_ci/* For handling the FOOF bug */ 2662306a36Sopenharmony_civoid handle_invalid_op(struct pt_regs *regs); 2762306a36Sopenharmony_ci#endif 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_cistatic inline int get_si_code(unsigned long condition) 3062306a36Sopenharmony_ci{ 3162306a36Sopenharmony_ci if (condition & DR_STEP) 3262306a36Sopenharmony_ci return TRAP_TRACE; 3362306a36Sopenharmony_ci else if (condition & (DR_TRAP0|DR_TRAP1|DR_TRAP2|DR_TRAP3)) 3462306a36Sopenharmony_ci return TRAP_HWBKPT; 3562306a36Sopenharmony_ci else 3662306a36Sopenharmony_ci return TRAP_BRKPT; 3762306a36Sopenharmony_ci} 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ciextern int panic_on_unrecovered_nmi; 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_civoid math_emulate(struct math_emu_info *); 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_cibool fault_in_kernel_space(unsigned long address); 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci#ifdef CONFIG_VMAP_STACK 4662306a36Sopenharmony_civoid __noreturn handle_stack_overflow(struct pt_regs *regs, 4762306a36Sopenharmony_ci unsigned long fault_address, 4862306a36Sopenharmony_ci struct stack_info *info); 4962306a36Sopenharmony_ci#endif 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_cistatic inline void cond_local_irq_enable(struct pt_regs *regs) 5262306a36Sopenharmony_ci{ 5362306a36Sopenharmony_ci if (regs->flags & X86_EFLAGS_IF) 5462306a36Sopenharmony_ci local_irq_enable(); 5562306a36Sopenharmony_ci} 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_cistatic inline void cond_local_irq_disable(struct pt_regs *regs) 5862306a36Sopenharmony_ci{ 5962306a36Sopenharmony_ci if (regs->flags & X86_EFLAGS_IF) 6062306a36Sopenharmony_ci local_irq_disable(); 6162306a36Sopenharmony_ci} 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci#endif /* _ASM_X86_TRAPS_H */ 64