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