traps_32.h 1.3 KB

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