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 
trigger_address_error(void)33 static 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 
43 asmlinkage void do_address_error(struct pt_regs *regs,
44 				 unsigned long writeaccess,
45 				 unsigned long address);
46 asmlinkage void do_page_fault(struct pt_regs *regs,
47 			      unsigned long error_code,
48 			      unsigned long address);
49 asmlinkage void do_divide_error(unsigned long r4);
50 asmlinkage void do_reserved_inst(void);
51 asmlinkage void do_illegal_slot_inst(void);
52 asmlinkage void do_exception_error(void);
53 
54 #define BUILD_TRAP_HANDLER(name)					\
55 asmlinkage 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