linux/arch/x86/include/asm/calling.h
<<
>>
Prefs
   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
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.