calling.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:3k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* 
  2.  * Some macros to handle stack frames in assembly.
  3.  */ 
  4. #include <linux/config.h>
  5. #define R15 0
  6. #define R14 8
  7. #define R13 16
  8. #define R12 24
  9. #define RBP 36
  10. #define RBX 40
  11. /* arguments: interrupts/non tracing syscalls only save upto here*/
  12. #define R11 48
  13. #define R10 56
  14. #define R9 64
  15. #define R8 72
  16. #define RAX 80
  17. #define RCX 88
  18. #define RDX 96
  19. #define RSI 104
  20. #define RDI 112
  21. #define ORIG_RAX 120       /* + error_code */ 
  22. /* end of arguments */ 
  23. /* cpu exception frame or undefined in case of fast syscall. */
  24. #define RIP 128
  25. #define CS 136
  26. #define EFLAGS 144
  27. #define RSP 152
  28. #define SS 160
  29. #define ARGOFFSET R11
  30. .macro SAVE_ARGS addskip=0,norcx=0 
  31. subq  $9*8+addskip,%rsp
  32. movq  %rdi,8*8(%rsp) 
  33. movq  %rsi,7*8(%rsp) 
  34. movq  %rdx,6*8(%rsp)
  35. .if norcx
  36. .else
  37. movq  %rcx,5*8(%rsp)
  38. .endif
  39. movq  %rax,4*8(%rsp) 
  40. movq  %r8,3*8(%rsp) 
  41. movq  %r9,2*8(%rsp) 
  42. movq  %r10,1*8(%rsp) 
  43. movq  %r11,(%rsp) 
  44. .endm
  45. #define ARG_SKIP 9*8
  46. .macro RESTORE_ARGS skiprax=0,addskip=0,skiprcx=0
  47. movq (%rsp),%r11
  48. movq 1*8(%rsp),%r10
  49. movq 2*8(%rsp),%r9
  50. movq 3*8(%rsp),%r8
  51. .if skiprax
  52. .else
  53. movq 4*8(%rsp),%rax
  54. .endif
  55. .if skiprcx
  56. .else
  57. movq 5*8(%rsp),%rcx
  58. .endif
  59. movq 6*8(%rsp),%rdx
  60. movq 7*8(%rsp),%rsi
  61. movq 8*8(%rsp),%rdi
  62. .if ARG_SKIP+addskip > 0
  63. addq $ARG_SKIP+addskip,%rsp
  64. .endif
  65. .endm
  66. .macro LOAD_ARGS offset
  67. movq offset(%rsp),%r11
  68. movq offset+8(%rsp),%r10
  69. movq offset+16(%rsp),%r9
  70. movq offset+24(%rsp),%r8
  71. movq offset+40(%rsp),%rcx
  72. movq offset+48(%rsp),%rdx
  73. movq offset+56(%rsp),%rsi
  74. movq offset+64(%rsp),%rdi
  75. movq offset+72(%rsp),%rax
  76. .endm
  77. .macro SAVE_REST
  78. subq $6*8,%rsp
  79. movq %rbx,5*8(%rsp) 
  80. movq %rbp,4*8(%rsp) 
  81. movq %r12,3*8(%rsp) 
  82. movq %r13,2*8(%rsp) 
  83. movq %r14,1*8(%rsp) 
  84. movq %r15,(%rsp) 
  85. .endm
  86. #define REST_SKIP 6*8
  87. .macro RESTORE_REST
  88. movq (%rsp),%r15
  89. movq 1*8(%rsp),%r14
  90. movq 2*8(%rsp),%r13
  91. movq 3*8(%rsp),%r12
  92. movq 4*8(%rsp),%rbp
  93. movq 5*8(%rsp),%rbx
  94. addq $REST_SKIP,%rsp
  95. .endm
  96. .macro SAVE_ALL
  97. SAVE_ARGS
  98. SAVE_REST
  99. .endm
  100. .macro RESTORE_ALL addskip=0
  101. RESTORE_REST
  102. RESTORE_ARGS 0,addskip
  103. .endm
  104. /* push in order ss, rsp, eflags, cs, rip */
  105. .macro FAKE_STACK_FRAME child_rip
  106. xorl %eax,%eax
  107. subq $6*8,%rsp
  108. movq %rax,5*8(%rsp)  /* ss */
  109. movq %rax,4*8(%rsp)  /* rsp */
  110. movq $(1<<9),3*8(%rsp)  /* eflags - enable interrupts */
  111. movq $__KERNEL_CS,2*8(%rsp) /* cs */
  112. movq child_rip,1*8(%rsp)  /* rip */ 
  113. movq %rax,(%rsp)   /* orig_rax */ 
  114. .endm
  115. .macro UNFAKE_STACK_FRAME
  116. addq $8*6, %rsp
  117. .endm
  118. .macro icebp
  119. .byte 0xf1
  120. .endm
  121. #ifdef CONFIG_FRAME_POINTER
  122. #define ENTER enter
  123. #define LEAVE leave
  124. #else
  125. #define ENTER
  126. #define LEAVE
  127. #endif