• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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