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