1/*
2 * Some macros to handle stack frames in assembly.
3 */
4
5
6#define R15 0
7#define R14 8
8#define R13 16
9#define R12 24
10#define RBP 32
11#define RBX 40
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/* cpu exception frame or undefined in case of fast syscall. */
25#define RIP 128
26#define CS 136
27#define EFLAGS 144
28#define RSP 152
29#define SS 160
30#define ARGOFFSET R11
31#define SWFRAME ORIG_RAX
32
33	.macro SAVE_ARGS addskip=0,norcx=0,nor891011=0
34	subq  $9*8+\addskip,%rsp
35	CFI_ADJUST_CFA_OFFSET	9*8+\addskip
36	movq  %rdi,8*8(%rsp)
37	CFI_REL_OFFSET	rdi,8*8
38	movq  %rsi,7*8(%rsp)
39	CFI_REL_OFFSET	rsi,7*8
40	movq  %rdx,6*8(%rsp)
41	CFI_REL_OFFSET	rdx,6*8
42	.if \norcx
43	.else
44	movq  %rcx,5*8(%rsp)
45	CFI_REL_OFFSET	rcx,5*8
46	.endif
47	movq  %rax,4*8(%rsp)
48	CFI_REL_OFFSET	rax,4*8
49	.if \nor891011
50	.else
51	movq  %r8,3*8(%rsp)
52	CFI_REL_OFFSET	r8,3*8
53	movq  %r9,2*8(%rsp)
54	CFI_REL_OFFSET	r9,2*8
55	movq  %r10,1*8(%rsp)
56	CFI_REL_OFFSET	r10,1*8
57	movq  %r11,(%rsp)
58	CFI_REL_OFFSET	r11,0*8
59	.endif
60	.endm
61
62#define ARG_SKIP 9*8
63	.macro RESTORE_ARGS skiprax=0,addskip=0,skiprcx=0,skipr11=0,skipr8910=0,skiprdx=0
64	.if \skipr11
65	.else
66	movq (%rsp),%r11
67	CFI_RESTORE r11
68	.endif
69	.if \skipr8910
70	.else
71	movq 1*8(%rsp),%r10
72	CFI_RESTORE r10
73	movq 2*8(%rsp),%r9
74	CFI_RESTORE r9
75	movq 3*8(%rsp),%r8
76	CFI_RESTORE r8
77	.endif
78	.if \skiprax
79	.else
80	movq 4*8(%rsp),%rax
81	CFI_RESTORE rax
82	.endif
83	.if \skiprcx
84	.else
85	movq 5*8(%rsp),%rcx
86	CFI_RESTORE rcx
87	.endif
88	.if \skiprdx
89	.else
90	movq 6*8(%rsp),%rdx
91	CFI_RESTORE rdx
92	.endif
93	movq 7*8(%rsp),%rsi
94	CFI_RESTORE rsi
95	movq 8*8(%rsp),%rdi
96	CFI_RESTORE rdi
97	.if ARG_SKIP+\addskip > 0
98	addq $ARG_SKIP+\addskip,%rsp
99	CFI_ADJUST_CFA_OFFSET	-(ARG_SKIP+\addskip)
100	.endif
101	.endm
102
103	.macro LOAD_ARGS offset
104	movq \offset(%rsp),%r11
105	movq \offset+8(%rsp),%r10
106	movq \offset+16(%rsp),%r9
107	movq \offset+24(%rsp),%r8
108	movq \offset+40(%rsp),%rcx
109	movq \offset+48(%rsp),%rdx
110	movq \offset+56(%rsp),%rsi
111	movq \offset+64(%rsp),%rdi
112	movq \offset+72(%rsp),%rax
113	.endm
114
115#define REST_SKIP 6*8
116	.macro SAVE_REST
117	subq $REST_SKIP,%rsp
118	CFI_ADJUST_CFA_OFFSET	REST_SKIP
119	movq %rbx,5*8(%rsp)
120	CFI_REL_OFFSET	rbx,5*8
121	movq %rbp,4*8(%rsp)
122	CFI_REL_OFFSET	rbp,4*8
123	movq %r12,3*8(%rsp)
124	CFI_REL_OFFSET	r12,3*8
125	movq %r13,2*8(%rsp)
126	CFI_REL_OFFSET	r13,2*8
127	movq %r14,1*8(%rsp)
128	CFI_REL_OFFSET	r14,1*8
129	movq %r15,(%rsp)
130	CFI_REL_OFFSET	r15,0*8
131	.endm
132
133	.macro RESTORE_REST
134	movq (%rsp),%r15
135	CFI_RESTORE r15
136	movq 1*8(%rsp),%r14
137	CFI_RESTORE r14
138	movq 2*8(%rsp),%r13
139	CFI_RESTORE r13
140	movq 3*8(%rsp),%r12
141	CFI_RESTORE r12
142	movq 4*8(%rsp),%rbp
143	CFI_RESTORE rbp
144	movq 5*8(%rsp),%rbx
145	CFI_RESTORE rbx
146	addq $REST_SKIP,%rsp
147	CFI_ADJUST_CFA_OFFSET	-(REST_SKIP)
148	.endm
149
150	.macro SAVE_ALL
151	SAVE_ARGS
152	SAVE_REST
153	.endm
154
155	.macro RESTORE_ALL addskip=0
156	RESTORE_REST
157	RESTORE_ARGS 0,\addskip
158	.endm
159
160	.macro icebp
161	.byte 0xf1
162	.endm
163