1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef __ASM_SH_TRAPS_32_H
3#define __ASM_SH_TRAPS_32_H
4
5#include <linux/types.h>
6#include <asm/mmu.h>
7
8#ifdef CONFIG_CPU_HAS_SR_RB
9#define lookup_exception_vector()	\
10({					\
11	unsigned long _vec;		\
12					\
13	__asm__ __volatile__ (		\
14		"stc r2_bank, %0\n\t"	\
15		: "=r" (_vec)		\
16	);				\
17					\
18	_vec;				\
19})
20#else
21#define lookup_exception_vector()	\
22({					\
23	unsigned long _vec;		\
24	__asm__ __volatile__ (		\
25		"mov r4, %0\n\t"	\
26		: "=r" (_vec)		\
27	);				\
28					\
29	_vec;				\
30})
31#endif
32
33static inline void trigger_address_error(void)
34{
35	__asm__ __volatile__ (
36		"ldc %0, sr\n\t"
37		"mov.l @%1, %0"
38		:
39		: "r" (0x10000000), "r" (0x80000001)
40	);
41}
42
43asmlinkage void do_address_error(struct pt_regs *regs,
44				 unsigned long writeaccess,
45				 unsigned long address);
46asmlinkage void do_page_fault(struct pt_regs *regs,
47			      unsigned long error_code,
48			      unsigned long address);
49asmlinkage void do_divide_error(unsigned long r4);
50asmlinkage void do_reserved_inst(void);
51asmlinkage void do_illegal_slot_inst(void);
52asmlinkage void do_exception_error(void);
53
54#define BUILD_TRAP_HANDLER(name)					\
55asmlinkage void name##_trap_handler(unsigned long r4, unsigned long r5,	\
56				    unsigned long r6, unsigned long r7,	\
57				    struct pt_regs __regs)
58
59#define TRAP_HANDLER_DECL				\
60	struct pt_regs *regs = RELOC_HIDE(&__regs, 0);	\
61	unsigned int vec = regs->tra;			\
62	(void)vec;
63
64#endif /* __ASM_SH_TRAPS_32_H */
65