calling.h 3.0 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
/* 
 * 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
67
	CFI_RESTORE r11
L
Linus Torvalds 已提交
68 69 70 71
	.endif
	.if \skipr8910
	.else
	movq 1*8(%rsp),%r10
72
	CFI_RESTORE r10
L
Linus Torvalds 已提交
73
	movq 2*8(%rsp),%r9
74
	CFI_RESTORE r9
L
Linus Torvalds 已提交
75
	movq 3*8(%rsp),%r8
76
	CFI_RESTORE r8
L
Linus Torvalds 已提交
77 78 79 80
	.endif
	.if \skiprax
	.else
	movq 4*8(%rsp),%rax
81
	CFI_RESTORE rax
L
Linus Torvalds 已提交
82 83 84 85
	.endif
	.if \skiprcx
	.else
	movq 5*8(%rsp),%rcx
86
	CFI_RESTORE rcx
L
Linus Torvalds 已提交
87 88 89 90
	.endif
	.if \skiprdx
	.else
	movq 6*8(%rsp),%rdx
91
	CFI_RESTORE rdx
L
Linus Torvalds 已提交
92 93
	.endif
	movq 7*8(%rsp),%rsi
94
	CFI_RESTORE rsi
L
Linus Torvalds 已提交
95
	movq 8*8(%rsp),%rdi
96
	CFI_RESTORE rdi
L
Linus Torvalds 已提交
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
	.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
135
	CFI_RESTORE r15
L
Linus Torvalds 已提交
136
	movq 1*8(%rsp),%r14
137
	CFI_RESTORE r14
L
Linus Torvalds 已提交
138
	movq 2*8(%rsp),%r13
139
	CFI_RESTORE r13
L
Linus Torvalds 已提交
140
	movq 3*8(%rsp),%r12
141
	CFI_RESTORE r12
L
Linus Torvalds 已提交
142
	movq 4*8(%rsp),%rbp
143
	CFI_RESTORE rbp
L
Linus Torvalds 已提交
144
	movq 5*8(%rsp),%rbx
145
	CFI_RESTORE rbx
L
Linus Torvalds 已提交
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
	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