162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef _ASMARM_TRAP_H
362306a36Sopenharmony_ci#define _ASMARM_TRAP_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <linux/list.h>
662306a36Sopenharmony_ci
762306a36Sopenharmony_cistruct pt_regs;
862306a36Sopenharmony_cistruct task_struct;
962306a36Sopenharmony_ci
1062306a36Sopenharmony_cistruct undef_hook {
1162306a36Sopenharmony_ci	struct list_head node;
1262306a36Sopenharmony_ci	u32 instr_mask;
1362306a36Sopenharmony_ci	u32 instr_val;
1462306a36Sopenharmony_ci	u32 cpsr_mask;
1562306a36Sopenharmony_ci	u32 cpsr_val;
1662306a36Sopenharmony_ci	int (*fn)(struct pt_regs *regs, unsigned int instr);
1762306a36Sopenharmony_ci};
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_civoid register_undef_hook(struct undef_hook *hook);
2062306a36Sopenharmony_civoid unregister_undef_hook(struct undef_hook *hook);
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cistatic inline int __in_irqentry_text(unsigned long ptr)
2362306a36Sopenharmony_ci{
2462306a36Sopenharmony_ci	extern char __irqentry_text_start[];
2562306a36Sopenharmony_ci	extern char __irqentry_text_end[];
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci	return ptr >= (unsigned long)&__irqentry_text_start &&
2862306a36Sopenharmony_ci	       ptr < (unsigned long)&__irqentry_text_end;
2962306a36Sopenharmony_ci}
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ciextern void __init early_trap_init(void *);
3262306a36Sopenharmony_ciextern void dump_backtrace_entry(unsigned long where, unsigned long from,
3362306a36Sopenharmony_ci				 unsigned long frame, const char *loglvl);
3462306a36Sopenharmony_ciextern void ptrace_break(struct pt_regs *regs);
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ciextern void *vectors_page;
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ciasmlinkage void dump_backtrace_stm(u32 *stack, u32 instruction, const char *loglvl);
3962306a36Sopenharmony_ciasmlinkage void do_undefinstr(struct pt_regs *regs);
4062306a36Sopenharmony_ciasmlinkage void handle_fiq_as_nmi(struct pt_regs *regs);
4162306a36Sopenharmony_ciasmlinkage void bad_mode(struct pt_regs *regs, int reason);
4262306a36Sopenharmony_ciasmlinkage int arm_syscall(int no, struct pt_regs *regs);
4362306a36Sopenharmony_ciasmlinkage void baddataabort(int code, unsigned long instr, struct pt_regs *regs);
4462306a36Sopenharmony_ciasmlinkage void __div0(void);
4562306a36Sopenharmony_ciasmlinkage void handle_bad_stack(struct pt_regs *regs);
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci#endif
48