unwind_hints.h 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #ifndef _ASM_X86_UNWIND_HINTS_H
  2. #define _ASM_X86_UNWIND_HINTS_H
  3. #include <linux/objtool.h>
  4. #include "orc_types.h"
  5. #ifdef __ASSEMBLY__
  6. .macro UNWIND_HINT_EMPTY
  7. UNWIND_HINT type=UNWIND_HINT_TYPE_CALL end=1
  8. .endm
  9. .macro UNWIND_HINT_ENTRY
  10. UNWIND_HINT type=UNWIND_HINT_TYPE_ENTRY end=1
  11. .endm
  12. .macro UNWIND_HINT_REGS base=%rsp offset=0 indirect=0 extra=1 partial=0
  13. .if \base == %rsp
  14. .if \indirect
  15. .set sp_reg, ORC_REG_SP_INDIRECT
  16. .else
  17. .set sp_reg, ORC_REG_SP
  18. .endif
  19. .elseif \base == %rbp
  20. .set sp_reg, ORC_REG_BP
  21. .elseif \base == %rdi
  22. .set sp_reg, ORC_REG_DI
  23. .elseif \base == %rdx
  24. .set sp_reg, ORC_REG_DX
  25. .elseif \base == %r10
  26. .set sp_reg, ORC_REG_R10
  27. .else
  28. .error "UNWIND_HINT_REGS: bad base register"
  29. .endif
  30. .set sp_offset, \offset
  31. .if \partial
  32. .set type, UNWIND_HINT_TYPE_REGS_PARTIAL
  33. .elseif \extra == 0
  34. .set type, UNWIND_HINT_TYPE_REGS_PARTIAL
  35. .set sp_offset, \offset + (16*8)
  36. .else
  37. .set type, UNWIND_HINT_TYPE_REGS
  38. .endif
  39. UNWIND_HINT sp_reg=sp_reg sp_offset=sp_offset type=type
  40. .endm
  41. .macro UNWIND_HINT_IRET_REGS base=%rsp offset=0
  42. UNWIND_HINT_REGS base=\base offset=\offset partial=1
  43. .endm
  44. .macro UNWIND_HINT_FUNC
  45. UNWIND_HINT sp_reg=ORC_REG_SP sp_offset=8 type=UNWIND_HINT_TYPE_FUNC
  46. .endm
  47. .macro UNWIND_HINT_SAVE
  48. UNWIND_HINT type=UNWIND_HINT_TYPE_SAVE
  49. .endm
  50. .macro UNWIND_HINT_RESTORE
  51. UNWIND_HINT type=UNWIND_HINT_TYPE_RESTORE
  52. .endm
  53. #else
  54. #define UNWIND_HINT_FUNC \
  55. UNWIND_HINT(ORC_REG_SP, 8, UNWIND_HINT_TYPE_FUNC, 0)
  56. #endif /* __ASSEMBLY__ */
  57. #endif /* _ASM_X86_UNWIND_HINTS_H */