calling.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  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
  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. movq \offset+72(%rsp), %rax
  109. .endm
  110. #define REST_SKIP 6*8
  111. .macro SAVE_REST
  112. subq $REST_SKIP, %rsp
  113. CFI_ADJUST_CFA_OFFSET REST_SKIP
  114. movq %rbx, 5*8(%rsp)
  115. CFI_REL_OFFSET rbx, 5*8
  116. movq %rbp, 4*8(%rsp)
  117. CFI_REL_OFFSET rbp, 4*8
  118. movq %r12, 3*8(%rsp)
  119. CFI_REL_OFFSET r12, 3*8
  120. movq %r13, 2*8(%rsp)
  121. CFI_REL_OFFSET r13, 2*8
  122. movq %r14, 1*8(%rsp)
  123. CFI_REL_OFFSET r14, 1*8
  124. movq %r15, (%rsp)
  125. CFI_REL_OFFSET r15, 0*8
  126. .endm
  127. .macro RESTORE_REST
  128. movq (%rsp), %r15
  129. CFI_RESTORE r15
  130. movq 1*8(%rsp), %r14
  131. CFI_RESTORE r14
  132. movq 2*8(%rsp), %r13
  133. CFI_RESTORE r13
  134. movq 3*8(%rsp), %r12
  135. CFI_RESTORE r12
  136. movq 4*8(%rsp), %rbp
  137. CFI_RESTORE rbp
  138. movq 5*8(%rsp), %rbx
  139. CFI_RESTORE rbx
  140. addq $REST_SKIP, %rsp
  141. CFI_ADJUST_CFA_OFFSET -(REST_SKIP)
  142. .endm
  143. .macro SAVE_ALL
  144. SAVE_ARGS
  145. SAVE_REST
  146. .endm
  147. .macro RESTORE_ALL addskip=0
  148. RESTORE_REST
  149. RESTORE_ARGS 0, \addskip
  150. .endm
  151. .macro icebp
  152. .byte 0xf1
  153. .endm