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_page_fault(struct pt_regs *regs, 47 unsigned long error_code, 48 unsigned long address); 49 asmlinkage void do_divide_error(unsigned long r4); 50 asmlinkage void do_reserved_inst(void); 51 asmlinkage void do_illegal_slot_inst(void); 52 asmlinkage void do_exception_error(void); 53 54 #define BUILD_TRAP_HANDLER(name) \ 55 asmlinkage void name##_trap_handler(unsigned long r4, unsigned long r5, \ 56 unsigned long r6, unsigned long r7, \ 57 struct pt_regs __regs) 58 59 #define TRAP_HANDLER_DECL \ 60 struct pt_regs *regs = RELOC_HIDE(&__regs, 0); \ 61 unsigned int vec = regs->tra; \ 62 (void)vec; 63 64 #endif /* __ASM_SH_TRAPS_32_H */ 65