123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- /*
- * Some macros to handle stack frames in assembly.
- */
- #define R15 0
- #define R14 8
- #define R13 16
- #define R12 24
- #define RBP 32
- #define RBX 40
- /* arguments: interrupts/non tracing syscalls only save upto here*/
- #define R11 48
- #define R10 56
- #define R9 64
- #define R8 72
- #define RAX 80
- #define RCX 88
- #define RDX 96
- #define RSI 104
- #define RDI 112
- #define ORIG_RAX 120 /* + error_code */
- /* end of arguments */
- /* cpu exception frame or undefined in case of fast syscall. */
- #define RIP 128
- #define CS 136
- #define EFLAGS 144
- #define RSP 152
- #define SS 160
- #define ARGOFFSET R11
- #define SWFRAME ORIG_RAX
- .macro SAVE_ARGS addskip=0,norcx=0,nor891011=0
- subq $9*8+\addskip,%rsp
- CFI_ADJUST_CFA_OFFSET 9*8+\addskip
- movq %rdi,8*8(%rsp)
- CFI_REL_OFFSET rdi,8*8
- movq %rsi,7*8(%rsp)
- CFI_REL_OFFSET rsi,7*8
- movq %rdx,6*8(%rsp)
- CFI_REL_OFFSET rdx,6*8
- .if \norcx
- .else
- movq %rcx,5*8(%rsp)
- CFI_REL_OFFSET rcx,5*8
- .endif
- movq %rax,4*8(%rsp)
- CFI_REL_OFFSET rax,4*8
- .if \nor891011
- .else
- movq %r8,3*8(%rsp)
- CFI_REL_OFFSET r8,3*8
- movq %r9,2*8(%rsp)
- CFI_REL_OFFSET r9,2*8
- movq %r10,1*8(%rsp)
- CFI_REL_OFFSET r10,1*8
- movq %r11,(%rsp)
- CFI_REL_OFFSET r11,0*8
- .endif
- .endm
- #define ARG_SKIP 9*8
- .macro RESTORE_ARGS skiprax=0,addskip=0,skiprcx=0,skipr11=0,skipr8910=0,skiprdx=0
- .if \skipr11
- .else
- movq (%rsp),%r11
- CFI_RESTORE r11
- .endif
- .if \skipr8910
- .else
- movq 1*8(%rsp),%r10
- CFI_RESTORE r10
- movq 2*8(%rsp),%r9
- CFI_RESTORE r9
- movq 3*8(%rsp),%r8
- CFI_RESTORE r8
- .endif
- .if \skiprax
- .else
- movq 4*8(%rsp),%rax
- CFI_RESTORE rax
- .endif
- .if \skiprcx
- .else
- movq 5*8(%rsp),%rcx
- CFI_RESTORE rcx
- .endif
- .if \skiprdx
- .else
- movq 6*8(%rsp),%rdx
- CFI_RESTORE rdx
- .endif
- movq 7*8(%rsp),%rsi
- CFI_RESTORE rsi
- movq 8*8(%rsp),%rdi
- CFI_RESTORE rdi
- .if ARG_SKIP+\addskip > 0
- addq $ARG_SKIP+\addskip,%rsp
- CFI_ADJUST_CFA_OFFSET -(ARG_SKIP+\addskip)
- .endif
- .endm
- .macro LOAD_ARGS offset
- movq \offset(%rsp),%r11
- movq \offset+8(%rsp),%r10
- movq \offset+16(%rsp),%r9
- movq \offset+24(%rsp),%r8
- movq \offset+40(%rsp),%rcx
- movq \offset+48(%rsp),%rdx
- movq \offset+56(%rsp),%rsi
- movq \offset+64(%rsp),%rdi
- movq \offset+72(%rsp),%rax
- .endm
-
- #define REST_SKIP 6*8
- .macro SAVE_REST
- subq $REST_SKIP,%rsp
- CFI_ADJUST_CFA_OFFSET REST_SKIP
- movq %rbx,5*8(%rsp)
- CFI_REL_OFFSET rbx,5*8
- movq %rbp,4*8(%rsp)
- CFI_REL_OFFSET rbp,4*8
- movq %r12,3*8(%rsp)
- CFI_REL_OFFSET r12,3*8
- movq %r13,2*8(%rsp)
- CFI_REL_OFFSET r13,2*8
- movq %r14,1*8(%rsp)
- CFI_REL_OFFSET r14,1*8
- movq %r15,(%rsp)
- CFI_REL_OFFSET r15,0*8
- .endm
- .macro RESTORE_REST
- movq (%rsp),%r15
- CFI_RESTORE r15
- movq 1*8(%rsp),%r14
- CFI_RESTORE r14
- movq 2*8(%rsp),%r13
- CFI_RESTORE r13
- movq 3*8(%rsp),%r12
- CFI_RESTORE r12
- movq 4*8(%rsp),%rbp
- CFI_RESTORE rbp
- movq 5*8(%rsp),%rbx
- CFI_RESTORE rbx
- addq $REST_SKIP,%rsp
- CFI_ADJUST_CFA_OFFSET -(REST_SKIP)
- .endm
-
- .macro SAVE_ALL
- SAVE_ARGS
- SAVE_REST
- .endm
-
- .macro RESTORE_ALL addskip=0
- RESTORE_REST
- RESTORE_ARGS 0,\addskip
- .endm
- .macro icebp
- .byte 0xf1
- .endm
|