calling.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  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,skipr8910=0,skiprdx=0
  60. .if \skipr11
  61. .else
  62. movq (%rsp),%r11
  63. CFI_RESTORE r11
  64. .endif
  65. .if \skipr8910
  66. .else
  67. movq 1*8(%rsp),%r10
  68. CFI_RESTORE r10
  69. movq 2*8(%rsp),%r9
  70. CFI_RESTORE r9
  71. movq 3*8(%rsp),%r8
  72. CFI_RESTORE r8
  73. .endif
  74. .if \skiprax
  75. .else
  76. movq 4*8(%rsp),%rax
  77. CFI_RESTORE rax
  78. .endif
  79. .if \skiprcx
  80. .else
  81. movq 5*8(%rsp),%rcx
  82. CFI_RESTORE rcx
  83. .endif
  84. .if \skiprdx
  85. .else
  86. movq 6*8(%rsp),%rdx
  87. CFI_RESTORE rdx
  88. .endif
  89. movq 7*8(%rsp),%rsi
  90. CFI_RESTORE rsi
  91. movq 8*8(%rsp),%rdi
  92. CFI_RESTORE rdi
  93. .if ARG_SKIP+\addskip > 0
  94. addq $ARG_SKIP+\addskip,%rsp
  95. CFI_ADJUST_CFA_OFFSET -(ARG_SKIP+\addskip)
  96. .endif
  97. .endm
  98. .macro LOAD_ARGS offset
  99. movq \offset(%rsp),%r11
  100. movq \offset+8(%rsp),%r10
  101. movq \offset+16(%rsp),%r9
  102. movq \offset+24(%rsp),%r8
  103. movq \offset+40(%rsp),%rcx
  104. movq \offset+48(%rsp),%rdx
  105. movq \offset+56(%rsp),%rsi
  106. movq \offset+64(%rsp),%rdi
  107. movq \offset+72(%rsp),%rax
  108. .endm
  109. #define REST_SKIP 6*8
  110. .macro SAVE_REST
  111. subq $REST_SKIP,%rsp
  112. CFI_ADJUST_CFA_OFFSET REST_SKIP
  113. movq %rbx,5*8(%rsp)
  114. CFI_REL_OFFSET rbx,5*8
  115. movq %rbp,4*8(%rsp)
  116. CFI_REL_OFFSET rbp,4*8
  117. movq %r12,3*8(%rsp)
  118. CFI_REL_OFFSET r12,3*8
  119. movq %r13,2*8(%rsp)
  120. CFI_REL_OFFSET r13,2*8
  121. movq %r14,1*8(%rsp)
  122. CFI_REL_OFFSET r14,1*8
  123. movq %r15,(%rsp)
  124. CFI_REL_OFFSET r15,0*8
  125. .endm
  126. .macro RESTORE_REST
  127. movq (%rsp),%r15
  128. CFI_RESTORE r15
  129. movq 1*8(%rsp),%r14
  130. CFI_RESTORE r14
  131. movq 2*8(%rsp),%r13
  132. CFI_RESTORE r13
  133. movq 3*8(%rsp),%r12
  134. CFI_RESTORE r12
  135. movq 4*8(%rsp),%rbp
  136. CFI_RESTORE rbp
  137. movq 5*8(%rsp),%rbx
  138. CFI_RESTORE rbx
  139. addq $REST_SKIP,%rsp
  140. CFI_ADJUST_CFA_OFFSET -(REST_SKIP)
  141. .endm
  142. .macro SAVE_ALL
  143. SAVE_ARGS
  144. SAVE_REST
  145. .endm
  146. .macro RESTORE_ALL addskip=0
  147. RESTORE_REST
  148. RESTORE_ARGS 0,\addskip
  149. .endm
  150. .macro icebp
  151. .byte 0xf1
  152. .endm