calling.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. /*
  2. * Some macros to handle stack frames in assembly.
  3. */
  4. #define R15 0
  5. #define R14 8
  6. #define R13 16
  7. #define R12 24
  8. #define RBP 32
  9. #define RBX 40
  10. /* arguments: interrupts/non tracing syscalls only save upto here*/
  11. #define R11 48
  12. #define R10 56
  13. #define R9 64
  14. #define R8 72
  15. #define RAX 80
  16. #define RCX 88
  17. #define RDX 96
  18. #define RSI 104
  19. #define RDI 112
  20. #define ORIG_RAX 120 /* + error_code */
  21. /* end of arguments */
  22. /* cpu exception frame or undefined in case of fast syscall. */
  23. #define RIP 128
  24. #define CS 136
  25. #define EFLAGS 144
  26. #define RSP 152
  27. #define SS 160
  28. #define ARGOFFSET R11
  29. #define SWFRAME ORIG_RAX
  30. .macro SAVE_ARGS addskip=0, norcx=0, nor891011=0
  31. subq $9*8+\addskip, %rsp
  32. CFI_ADJUST_CFA_OFFSET 9*8+\addskip
  33. movq %rdi, 8*8(%rsp)
  34. CFI_REL_OFFSET rdi, 8*8
  35. movq %rsi, 7*8(%rsp)
  36. CFI_REL_OFFSET rsi, 7*8
  37. movq %rdx, 6*8(%rsp)
  38. CFI_REL_OFFSET rdx, 6*8
  39. .if \norcx
  40. .else
  41. movq %rcx, 5*8(%rsp)
  42. CFI_REL_OFFSET rcx, 5*8
  43. .endif
  44. movq %rax, 4*8(%rsp)
  45. CFI_REL_OFFSET rax, 4*8
  46. .if \nor891011
  47. .else
  48. movq %r8, 3*8(%rsp)
  49. CFI_REL_OFFSET r8, 3*8
  50. movq %r9, 2*8(%rsp)
  51. CFI_REL_OFFSET r9, 2*8
  52. movq %r10, 1*8(%rsp)
  53. CFI_REL_OFFSET r10, 1*8
  54. movq %r11, (%rsp)
  55. CFI_REL_OFFSET r11, 0*8
  56. .endif
  57. .endm
  58. #define ARG_SKIP 9*8
  59. .macro RESTORE_ARGS skiprax=0, addskip=0, skiprcx=0, skipr11=0, \
  60. skipr8910=0, skiprdx=0
  61. .if \skipr11
  62. .else
  63. movq (%rsp), %r11
  64. CFI_RESTORE r11
  65. .endif
  66. .if \skipr8910
  67. .else
  68. movq 1*8(%rsp), %r10
  69. CFI_RESTORE r10
  70. movq 2*8(%rsp), %r9
  71. CFI_RESTORE r9
  72. movq 3*8(%rsp), %r8
  73. CFI_RESTORE r8
  74. .endif
  75. .if \skiprax
  76. .else
  77. movq 4*8(%rsp), %rax
  78. CFI_RESTORE rax
  79. .endif
  80. .if \skiprcx
  81. .else
  82. movq 5*8(%rsp), %rcx
  83. CFI_RESTORE rcx
  84. .endif
  85. .if \skiprdx
  86. .else
  87. movq 6*8(%rsp), %rdx
  88. CFI_RESTORE rdx
  89. .endif
  90. movq 7*8(%rsp), %rsi
  91. CFI_RESTORE rsi
  92. movq 8*8(%rsp), %rdi
  93. CFI_RESTORE rdi
  94. .if ARG_SKIP+\addskip > 0
  95. addq $ARG_SKIP+\addskip, %rsp
  96. CFI_ADJUST_CFA_OFFSET -(ARG_SKIP+\addskip)
  97. .endif
  98. .endm
  99. .macro LOAD_ARGS offset, skiprax=0
  100. movq \offset(%rsp), %r11
  101. movq \offset+8(%rsp), %r10
  102. movq \offset+16(%rsp), %r9
  103. movq \offset+24(%rsp), %r8
  104. movq \offset+40(%rsp), %rcx
  105. movq \offset+48(%rsp), %rdx
  106. movq \offset+56(%rsp), %rsi
  107. movq \offset+64(%rsp), %rdi
  108. .if \skiprax
  109. .else
  110. movq \offset+72(%rsp), %rax
  111. .endif
  112. .endm
  113. #define REST_SKIP 6*8
  114. .macro SAVE_REST
  115. subq $REST_SKIP, %rsp
  116. CFI_ADJUST_CFA_OFFSET REST_SKIP
  117. movq %rbx, 5*8(%rsp)
  118. CFI_REL_OFFSET rbx, 5*8
  119. movq %rbp, 4*8(%rsp)
  120. CFI_REL_OFFSET rbp, 4*8
  121. movq %r12, 3*8(%rsp)
  122. CFI_REL_OFFSET r12, 3*8
  123. movq %r13, 2*8(%rsp)
  124. CFI_REL_OFFSET r13, 2*8
  125. movq %r14, 1*8(%rsp)
  126. CFI_REL_OFFSET r14, 1*8
  127. movq %r15, (%rsp)
  128. CFI_REL_OFFSET r15, 0*8
  129. .endm
  130. .macro RESTORE_REST
  131. movq (%rsp), %r15
  132. CFI_RESTORE r15
  133. movq 1*8(%rsp), %r14
  134. CFI_RESTORE r14
  135. movq 2*8(%rsp), %r13
  136. CFI_RESTORE r13
  137. movq 3*8(%rsp), %r12
  138. CFI_RESTORE r12
  139. movq 4*8(%rsp), %rbp
  140. CFI_RESTORE rbp
  141. movq 5*8(%rsp), %rbx
  142. CFI_RESTORE rbx
  143. addq $REST_SKIP, %rsp
  144. CFI_ADJUST_CFA_OFFSET -(REST_SKIP)
  145. .endm
  146. .macro SAVE_ALL
  147. SAVE_ARGS
  148. SAVE_REST
  149. .endm
  150. .macro RESTORE_ALL addskip=0
  151. RESTORE_REST
  152. RESTORE_ARGS 0, \addskip
  153. .endm
  154. .macro icebp
  155. .byte 0xf1
  156. .endm