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