asm-extable.h 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  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. #ifdef __ASSEMBLY__
  9. #define __ASM_EXTABLE_RAW(insn, fixup, type, data) \
  10. .pushsection __ex_table, "a"; \
  11. .balign 4; \
  12. .long ((insn) - .); \
  13. .long ((fixup) - .); \
  14. .short (type); \
  15. .short (data); \
  16. .popsection;
  17. .macro _asm_extable, insn, fixup
  18. __ASM_EXTABLE_RAW(\insn, \fixup, EX_TYPE_FIXUP, 0)
  19. .endm
  20. #else /* __ASSEMBLY__ */
  21. #include <linux/bits.h>
  22. #include <linux/stringify.h>
  23. #include <asm/gpr-num.h>
  24. #define __ASM_EXTABLE_RAW(insn, fixup, type, data) \
  25. ".pushsection __ex_table, \"a\"\n" \
  26. ".balign 4\n" \
  27. ".long ((" insn ") - .)\n" \
  28. ".long ((" fixup ") - .)\n" \
  29. ".short (" type ")\n" \
  30. ".short (" data ")\n" \
  31. ".popsection\n"
  32. #define _ASM_EXTABLE(insn, fixup) \
  33. __ASM_EXTABLE_RAW(#insn, #fixup, __stringify(EX_TYPE_FIXUP), "0")
  34. #define EX_DATA_REG_ERR_SHIFT 0
  35. #define EX_DATA_REG_ERR GENMASK(4, 0)
  36. #define EX_DATA_REG_ZERO_SHIFT 5
  37. #define EX_DATA_REG_ZERO GENMASK(9, 5)
  38. #define EX_DATA_REG(reg, gpr) \
  39. "((.L__gpr_num_" #gpr ") << " __stringify(EX_DATA_REG_##reg##_SHIFT) ")"
  40. #define _ASM_EXTABLE_UACCESS_ERR_ZERO(insn, fixup, err, zero) \
  41. __DEFINE_ASM_GPR_NUMS \
  42. __ASM_EXTABLE_RAW(#insn, #fixup, \
  43. __stringify(EX_TYPE_UACCESS_ERR_ZERO), \
  44. "(" \
  45. EX_DATA_REG(ERR, err) " | " \
  46. EX_DATA_REG(ZERO, zero) \
  47. ")")
  48. #define _ASM_EXTABLE_UACCESS_ERR(insn, fixup, err) \
  49. _ASM_EXTABLE_UACCESS_ERR_ZERO(insn, fixup, err, zero)
  50. #endif /* __ASSEMBLY__ */
  51. #endif /* __ASM_ASM_EXTABLE_H */