Loading...
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
33static 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
43asmlinkage void do_address_error(struct pt_regs *regs,
44 unsigned long writeaccess,
45 unsigned long address);
46asmlinkage void do_divide_error(unsigned long r4);
47asmlinkage void do_reserved_inst(void);
48asmlinkage void do_illegal_slot_inst(void);
49asmlinkage void do_exception_error(void);
50
51#define BUILD_TRAP_HANDLER(name) \
52asmlinkage 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 */
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
32static 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
42asmlinkage void do_address_error(struct pt_regs *regs,
43 unsigned long writeaccess,
44 unsigned long address);
45asmlinkage void do_divide_error(unsigned long r4, unsigned long r5,
46 unsigned long r6, unsigned long r7,
47 struct pt_regs __regs);
48asmlinkage void do_reserved_inst(unsigned long r4, unsigned long r5,
49 unsigned long r6, unsigned long r7,
50 struct pt_regs __regs);
51asmlinkage void do_illegal_slot_inst(unsigned long r4, unsigned long r5,
52 unsigned long r6, unsigned long r7,
53 struct pt_regs __regs);
54asmlinkage 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) \
59asmlinkage 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 */