2008-01-30 15:32:49 +03:00
/*
2005-04-17 02:20:36 +04:00
* Some macros to handle stack frames in assembly .
2008-01-30 15:32:49 +03:00
*/
2005-04-17 02:20:36 +04:00
2008-01-30 15:32:49 +03:00
# define R15 0
# define R14 8
# define R13 16
# define R12 24
# define RBP 32
# define RBX 40
2005-04-17 02:20:36 +04:00
/* arguments: interrupts/non tracing syscalls only save upto here*/
2008-01-30 15:32:49 +03:00
# 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 */
2005-04-17 02:20:36 +04:00
/* cpu exception frame or undefined in case of fast syscall. */
2008-01-30 15:32:49 +03:00
# define RIP 128
# define CS 136
# define EFLAGS 144
# define RSP 152
# define SS 160
# define ARGOFFSET R11
# define SWFRAME ORIG_RAX
2005-04-17 02:20:36 +04:00
2008-01-30 15:32:49 +03:00
. macro SAVE_ARGS addskip = 0 , norcx = 0 , nor891011 = 0
subq $ 9 * 8 + \ addskip , % rsp
2005-04-17 02:20:36 +04:00
CFI_ADJUST_CFA_OFFSET 9 * 8 + \ addskip
2008-01-30 15:32:49 +03:00
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
2005-04-17 02:20:36 +04:00
. if \ norcx
. else
2008-01-30 15:32:49 +03:00
movq % rcx , 5 * 8 ( % rsp )
CFI_REL_OFFSET rcx , 5 * 8
2005-04-17 02:20:36 +04:00
. endif
2008-01-30 15:32:49 +03:00
movq % rax , 4 * 8 ( % rsp )
CFI_REL_OFFSET rax , 4 * 8
2005-04-17 02:20:36 +04:00
. if \ nor891011
. else
2008-01-30 15:32:49 +03:00
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
2005-04-17 02:20:36 +04:00
. endif
. endm
2008-01-30 15:32:49 +03:00
# define ARG_SKIP 9*8
. macro RESTORE_ARGS skiprax = 0 , addskip = 0 , skiprcx = 0 , skipr11 = 0 , \
skipr8910 = 0 , skiprdx = 0
2005-04-17 02:20:36 +04:00
. if \ skipr11
. else
2008-01-30 15:32:49 +03:00
movq ( % rsp ) , % r11
2005-09-12 20:49:24 +04:00
CFI_RESTORE r11
2005-04-17 02:20:36 +04:00
. endif
. if \ skipr8910
. else
2008-01-30 15:32:49 +03:00
movq 1 * 8 ( % rsp ) , % r10
2005-09-12 20:49:24 +04:00
CFI_RESTORE r10
2008-01-30 15:32:49 +03:00
movq 2 * 8 ( % rsp ) , % r9
2005-09-12 20:49:24 +04:00
CFI_RESTORE r9
2008-01-30 15:32:49 +03:00
movq 3 * 8 ( % rsp ) , % r8
2005-09-12 20:49:24 +04:00
CFI_RESTORE r8
2005-04-17 02:20:36 +04:00
. endif
. if \ skiprax
. else
2008-01-30 15:32:49 +03:00
movq 4 * 8 ( % rsp ) , % rax
2005-09-12 20:49:24 +04:00
CFI_RESTORE rax
2005-04-17 02:20:36 +04:00
. endif
. if \ skiprcx
. else
2008-01-30 15:32:49 +03:00
movq 5 * 8 ( % rsp ) , % rcx
2005-09-12 20:49:24 +04:00
CFI_RESTORE rcx
2005-04-17 02:20:36 +04:00
. endif
. if \ skiprdx
. else
2008-01-30 15:32:49 +03:00
movq 6 * 8 ( % rsp ) , % rdx
2005-09-12 20:49:24 +04:00
CFI_RESTORE rdx
2005-04-17 02:20:36 +04:00
. endif
2008-01-30 15:32:49 +03:00
movq 7 * 8 ( % rsp ) , % rsi
2005-09-12 20:49:24 +04:00
CFI_RESTORE rsi
2008-01-30 15:32:49 +03:00
movq 8 * 8 ( % rsp ) , % rdi
2005-09-12 20:49:24 +04:00
CFI_RESTORE rdi
2005-04-17 02:20:36 +04:00
. if ARG_SKIP + \ addskip > 0
2008-01-30 15:32:49 +03:00
addq $ ARG_SKIP + \ addskip , % rsp
2005-04-17 02:20:36 +04:00
CFI_ADJUST_CFA_OFFSET - ( ARG_SKIP + \ addskip )
. endif
2008-01-30 15:32:49 +03:00
. endm
2005-04-17 02:20:36 +04:00
. macro LOAD_ARGS offset
2008-01-30 15:32:49 +03:00
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
2005-04-17 02:20:36 +04:00
. endm
2008-01-30 15:32:49 +03:00
# define REST_SKIP 6*8
2005-04-17 02:20:36 +04:00
. macro SAVE_REST
2008-01-30 15:32:49 +03:00
subq $ REST_SKIP , % rsp
2005-04-17 02:20:36 +04:00
CFI_ADJUST_CFA_OFFSET REST_SKIP
2008-01-30 15:32:49 +03:00
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
2005-04-17 02:20:36 +04:00
. macro RESTORE_REST
2008-01-30 15:32:49 +03:00
movq ( % rsp ) , % r15
2005-09-12 20:49:24 +04:00
CFI_RESTORE r15
2008-01-30 15:32:49 +03:00
movq 1 * 8 ( % rsp ) , % r14
2005-09-12 20:49:24 +04:00
CFI_RESTORE r14
2008-01-30 15:32:49 +03:00
movq 2 * 8 ( % rsp ) , % r13
2005-09-12 20:49:24 +04:00
CFI_RESTORE r13
2008-01-30 15:32:49 +03:00
movq 3 * 8 ( % rsp ) , % r12
2005-09-12 20:49:24 +04:00
CFI_RESTORE r12
2008-01-30 15:32:49 +03:00
movq 4 * 8 ( % rsp ) , % rbp
2005-09-12 20:49:24 +04:00
CFI_RESTORE rbp
2008-01-30 15:32:49 +03:00
movq 5 * 8 ( % rsp ) , % rbx
2005-09-12 20:49:24 +04:00
CFI_RESTORE rbx
2008-01-30 15:32:49 +03:00
addq $ REST_SKIP , % rsp
2005-04-17 02:20:36 +04:00
CFI_ADJUST_CFA_OFFSET - ( REST_SKIP )
. endm
2008-01-30 15:32:49 +03:00
2005-04-17 02:20:36 +04:00
. macro SAVE_ALL
SAVE_ARGS
SAVE_REST
. endm
2008-01-30 15:32:49 +03:00
2005-04-17 02:20:36 +04:00
. macro RESTORE_ALL addskip = 0
RESTORE_REST
2008-01-30 15:32:49 +03:00
RESTORE_ARGS 0 , \ addskip
2005-04-17 02:20:36 +04:00
. endm
. macro icebp
. byte 0xf1
. endm
2008-01-30 15:32:49 +03:00