GNU Linux-libre 4.19.286-gnu1
[releases.git] / arch / sh / include / asm / traps_32.h
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
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_divide_error(unsigned long r4);
47 asmlinkage void do_reserved_inst(void);
48 asmlinkage void do_illegal_slot_inst(void);
49 asmlinkage void do_exception_error(void);
50
51 #define BUILD_TRAP_HANDLER(name)                                        \
52 asmlinkage void name##_trap_handler(unsigned long r4, unsigned long r5, \
53                                     unsigned long r6, unsigned long r7, \
54                                     struct pt_regs __regs)
55
56 #define TRAP_HANDLER_DECL                               \
57         struct pt_regs *regs = RELOC_HIDE(&__regs, 0);  \
58         unsigned int vec = regs->tra;                   \
59         (void)vec;
60
61 #endif /* __ASM_SH_TRAPS_32_H */