]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - arch/sh/include/asm/traps_32.h
Merge remote-tracking branch 'ipsec/master'
[karo-tx-linux.git] / arch / sh / include / asm / traps_32.h
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);
46 asmlinkage void do_reserved_inst(void);
47 asmlinkage void do_illegal_slot_inst(void);
48 asmlinkage void do_exception_error(void);
49
50 #define BUILD_TRAP_HANDLER(name)                                        \
51 asmlinkage void name##_trap_handler(unsigned long r4, unsigned long r5, \
52                                     unsigned long r6, unsigned long r7, \
53                                     struct pt_regs __regs)
54
55 #define TRAP_HANDLER_DECL                               \
56         struct pt_regs *regs = RELOC_HIDE(&__regs, 0);  \
57         unsigned int vec = regs->tra;                   \
58         (void)vec;
59
60 #endif /* __ASM_SH_TRAPS_32_H */