18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Based on arch/arm/include/asm/exception.h
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright (C) 2012 ARM Ltd.
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci#ifndef __ASM_EXCEPTION_H
88c2ecf20Sopenharmony_ci#define __ASM_EXCEPTION_H
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci#include <asm/esr.h>
118c2ecf20Sopenharmony_ci#include <asm/ptrace.h>
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci#include <linux/interrupt.h>
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci#define __exception_irq_entry	__irq_entry
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_cistatic inline u32 disr_to_esr(u64 disr)
188c2ecf20Sopenharmony_ci{
198c2ecf20Sopenharmony_ci	unsigned int esr = ESR_ELx_EC_SERROR << ESR_ELx_EC_SHIFT;
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci	if ((disr & DISR_EL1_IDS) == 0)
228c2ecf20Sopenharmony_ci		esr |= (disr & DISR_EL1_ESR_MASK);
238c2ecf20Sopenharmony_ci	else
248c2ecf20Sopenharmony_ci		esr |= (disr & ESR_ELx_ISS_MASK);
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci	return esr;
278c2ecf20Sopenharmony_ci}
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ciasmlinkage void noinstr enter_el1_irq_or_nmi(struct pt_regs *regs);
308c2ecf20Sopenharmony_ciasmlinkage void noinstr exit_el1_irq_or_nmi(struct pt_regs *regs);
318c2ecf20Sopenharmony_ciasmlinkage void enter_from_user_mode(void);
328c2ecf20Sopenharmony_ciasmlinkage void exit_to_user_mode(void);
338c2ecf20Sopenharmony_civoid arm64_enter_nmi(struct pt_regs *regs);
348c2ecf20Sopenharmony_civoid arm64_exit_nmi(struct pt_regs *regs);
358c2ecf20Sopenharmony_civoid do_mem_abort(unsigned long addr, unsigned int esr, struct pt_regs *regs);
368c2ecf20Sopenharmony_civoid do_el0_undef(struct pt_regs *regs, unsigned long esr);
378c2ecf20Sopenharmony_civoid do_el1_undef(struct pt_regs *regs, unsigned long esr);
388c2ecf20Sopenharmony_civoid do_el0_bti(struct pt_regs *regs);
398c2ecf20Sopenharmony_civoid do_el1_bti(struct pt_regs *regs, unsigned long esr);
408c2ecf20Sopenharmony_ciasmlinkage void bad_mode(struct pt_regs *regs, int reason, unsigned int esr);
418c2ecf20Sopenharmony_civoid do_debug_exception(unsigned long addr_if_watchpoint, unsigned int esr,
428c2ecf20Sopenharmony_ci			struct pt_regs *regs);
438c2ecf20Sopenharmony_civoid do_fpsimd_acc(unsigned int esr, struct pt_regs *regs);
448c2ecf20Sopenharmony_civoid do_sve_acc(unsigned int esr, struct pt_regs *regs);
458c2ecf20Sopenharmony_civoid do_fpsimd_exc(unsigned int esr, struct pt_regs *regs);
468c2ecf20Sopenharmony_civoid do_el0_sys(unsigned long esr, struct pt_regs *regs);
478c2ecf20Sopenharmony_civoid do_sp_pc_abort(unsigned long addr, unsigned int esr, struct pt_regs *regs);
488c2ecf20Sopenharmony_civoid bad_el0_sync(struct pt_regs *regs, int reason, unsigned int esr);
498c2ecf20Sopenharmony_civoid do_el0_cp15(unsigned long esr, struct pt_regs *regs);
508c2ecf20Sopenharmony_civoid do_el0_svc(struct pt_regs *regs);
518c2ecf20Sopenharmony_civoid do_el0_svc_compat(struct pt_regs *regs);
528c2ecf20Sopenharmony_civoid do_el0_fpac(struct pt_regs *regs, unsigned long esr);
538c2ecf20Sopenharmony_civoid do_el1_fpac(struct pt_regs *regs, unsigned long esr);
548c2ecf20Sopenharmony_ci#endif	/* __ASM_EXCEPTION_H */
55