blob: 0bc12655fa5be49e1feada576d01ba3a297b881c [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * Some macros to handle stack frames in assembly.
3 */
4
5#include <linux/config.h>
6
7#define R15 0
8#define R14 8
9#define R13 16
10#define R12 24
11#define RBP 32
12#define RBX 40
13/* arguments: interrupts/non tracing syscalls only save upto here*/
14#define R11 48
15#define R10 56
16#define R9 64
17#define R8 72
18#define RAX 80
19#define RCX 88
20#define RDX 96
21#define RSI 104
22#define RDI 112
23#define ORIG_RAX 120 /* + error_code */
24/* end of arguments */
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#define ARGOFFSET R11
32#define SWFRAME ORIG_RAX
33
34 .macro SAVE_ARGS addskip=0,norcx=0,nor891011=0
35 subq $9*8+\addskip,%rsp
36 CFI_ADJUST_CFA_OFFSET 9*8+\addskip
37 movq %rdi,8*8(%rsp)
38 CFI_REL_OFFSET rdi,8*8
39 movq %rsi,7*8(%rsp)
40 CFI_REL_OFFSET rsi,7*8
41 movq %rdx,6*8(%rsp)
42 CFI_REL_OFFSET rdx,6*8
43 .if \norcx
44 .else
45 movq %rcx,5*8(%rsp)
46 CFI_REL_OFFSET rcx,5*8
47 .endif
48 movq %rax,4*8(%rsp)
49 CFI_REL_OFFSET rax,4*8
50 .if \nor891011
51 .else
52 movq %r8,3*8(%rsp)
53 CFI_REL_OFFSET r8,3*8
54 movq %r9,2*8(%rsp)
55 CFI_REL_OFFSET r9,2*8
56 movq %r10,1*8(%rsp)
57 CFI_REL_OFFSET r10,1*8
58 movq %r11,(%rsp)
59 CFI_REL_OFFSET r11,0*8
60 .endif
61 .endm
62
63#define ARG_SKIP 9*8
64 .macro RESTORE_ARGS skiprax=0,addskip=0,skiprcx=0,skipr11=0,skipr8910=0,skiprdx=0
65 .if \skipr11
66 .else
67 movq (%rsp),%r11
68 .endif
69 .if \skipr8910
70 .else
71 movq 1*8(%rsp),%r10
72 movq 2*8(%rsp),%r9
73 movq 3*8(%rsp),%r8
74 .endif
75 .if \skiprax
76 .else
77 movq 4*8(%rsp),%rax
78 .endif
79 .if \skiprcx
80 .else
81 movq 5*8(%rsp),%rcx
82 .endif
83 .if \skiprdx
84 .else
85 movq 6*8(%rsp),%rdx
86 .endif
87 movq 7*8(%rsp),%rsi
88 movq 8*8(%rsp),%rdi
89 .if ARG_SKIP+\addskip > 0
90 addq $ARG_SKIP+\addskip,%rsp
91 CFI_ADJUST_CFA_OFFSET -(ARG_SKIP+\addskip)
92 .endif
93 .endm
94
95 .macro LOAD_ARGS offset
96 movq \offset(%rsp),%r11
97 movq \offset+8(%rsp),%r10
98 movq \offset+16(%rsp),%r9
99 movq \offset+24(%rsp),%r8
100 movq \offset+40(%rsp),%rcx
101 movq \offset+48(%rsp),%rdx
102 movq \offset+56(%rsp),%rsi
103 movq \offset+64(%rsp),%rdi
104 movq \offset+72(%rsp),%rax
105 .endm
106
107#define REST_SKIP 6*8
108 .macro SAVE_REST
109 subq $REST_SKIP,%rsp
110 CFI_ADJUST_CFA_OFFSET REST_SKIP
111 movq %rbx,5*8(%rsp)
112 CFI_REL_OFFSET rbx,5*8
113 movq %rbp,4*8(%rsp)
114 CFI_REL_OFFSET rbp,4*8
115 movq %r12,3*8(%rsp)
116 CFI_REL_OFFSET r12,3*8
117 movq %r13,2*8(%rsp)
118 CFI_REL_OFFSET r13,2*8
119 movq %r14,1*8(%rsp)
120 CFI_REL_OFFSET r14,1*8
121 movq %r15,(%rsp)
122 CFI_REL_OFFSET r15,0*8
123 .endm
124
125 .macro RESTORE_REST
126 movq (%rsp),%r15
127 movq 1*8(%rsp),%r14
128 movq 2*8(%rsp),%r13
129 movq 3*8(%rsp),%r12
130 movq 4*8(%rsp),%rbp
131 movq 5*8(%rsp),%rbx
132 addq $REST_SKIP,%rsp
133 CFI_ADJUST_CFA_OFFSET -(REST_SKIP)
134 .endm
135
136 .macro SAVE_ALL
137 SAVE_ARGS
138 SAVE_REST
139 .endm
140
141 .macro RESTORE_ALL addskip=0
142 RESTORE_REST
143 RESTORE_ARGS 0,\addskip
144 .endm
145
146 .macro icebp
147 .byte 0xf1
148 .endm
149
150#ifdef CONFIG_FRAME_POINTER
151#define ENTER enter
152#define LEAVE leave
153#else
154#define ENTER
155#define LEAVE
156#endif