home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / arch / x86 / include / asm / calling.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  3.1 KB  |  171 lines

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