asm-extable.h 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. #ifndef __ASM_ASM_EXTABLE_H
  3. #define __ASM_ASM_EXTABLE_H
  4. #define EX_TYPE_NONE 0
  5. #define EX_TYPE_FIXUP 1
  6. #define EX_TYPE_BPF 2
  7. #define EX_TYPE_UACCESS_ERR_ZERO 3
  8. #define EX_TYPE_LOAD_UNALIGNED_ZEROPAD 4
  9. #ifdef CONFIG_MMU
  10. #ifdef __ASSEMBLY__
  11. #define __ASM_EXTABLE_RAW(insn, fixup, type, data) \
  12. .pushsection __ex_table, "a"; \
  13. .balign 4; \
  14. .long ((insn) - .); \
  15. .long ((fixup) - .); \
  16. .short (type); \
  17. .short (data); \
  18. .popsection;
  19. .macro _asm_extable, insn, fixup
  20. __ASM_EXTABLE_RAW(\insn, \fixup, EX_TYPE_FIXUP, 0)
  21. .endm
  22. #else /* __ASSEMBLY__ */
  23. #include <linux/bits.h>
  24. #include <linux/stringify.h>
  25. #include <asm/gpr-num.h>
  26. #define __ASM_EXTABLE_RAW(insn, fixup, type, data) \
  27. ".pushsection __ex_table, \"a\"\n" \
  28. ".balign 4\n" \
  29. ".long ((" insn ") - .)\n" \
  30. ".long ((" fixup ") - .)\n" \
  31. ".short (" type ")\n" \
  32. ".short (" data ")\n" \
  33. ".popsection\n"
  34. #define _ASM_EXTABLE(insn, fixup) \
  35. __ASM_EXTABLE_RAW(#insn, #fixup, __stringify(EX_TYPE_FIXUP), "0")
  36. #define EX_DATA_REG_ERR_SHIFT 0
  37. #define EX_DATA_REG_ERR GENMASK(4, 0)
  38. #define EX_DATA_REG_ZERO_SHIFT 5
  39. #define EX_DATA_REG_ZERO GENMASK(9, 5)
  40. #define EX_DATA_REG_DATA_SHIFT 0
  41. #define EX_DATA_REG_DATA GENMASK(4, 0)
  42. #define EX_DATA_REG_ADDR_SHIFT 5
  43. #define EX_DATA_REG_ADDR GENMASK(9, 5)
  44. #define EX_DATA_REG(reg, gpr) \
  45. "((.L__gpr_num_" #gpr ") << " __stringify(EX_DATA_REG_##reg##_SHIFT) ")"
  46. #define _ASM_EXTABLE_UACCESS_ERR_ZERO(insn, fixup, err, zero) \
  47. __DEFINE_ASM_GPR_NUMS \
  48. __ASM_EXTABLE_RAW(#insn, #fixup, \
  49. __stringify(EX_TYPE_UACCESS_ERR_ZERO), \
  50. "(" \
  51. EX_DATA_REG(ERR, err) " | " \
  52. EX_DATA_REG(ZERO, zero) \
  53. ")")
  54. #define _ASM_EXTABLE_UACCESS_ERR(insn, fixup, err) \
  55. _ASM_EXTABLE_UACCESS_ERR_ZERO(insn, fixup, err, zero)
  56. #define _ASM_EXTABLE_LOAD_UNALIGNED_ZEROPAD(insn, fixup, data, addr) \
  57. __DEFINE_ASM_GPR_NUMS \
  58. __ASM_EXTABLE_RAW(#insn, #fixup, \
  59. __stringify(EX_TYPE_LOAD_UNALIGNED_ZEROPAD), \
  60. "(" \
  61. EX_DATA_REG(DATA, data) " | " \
  62. EX_DATA_REG(ADDR, addr) \
  63. ")")
  64. #endif /* __ASSEMBLY__ */
  65. #else /* CONFIG_MMU */
  66. #define _ASM_EXTABLE_UACCESS_ERR(insn, fixup, err)
  67. #endif /* CONFIG_MMU */
  68. #endif /* __ASM_ASM_EXTABLE_H */