Merge branch 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6
[linux-2.6] / arch / x86 / include / asm / calling.h
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