ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / include / asm-x86_64 / calling.h
1 /* 
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         /* push in order ss, rsp, eflags, cs, rip */
147         .macro FAKE_STACK_FRAME child_rip
148         xorl %eax,%eax
149         subq $6*8,%rsp
150         movq %rax,5*8(%rsp)  /* ss */
151         movq %rax,4*8(%rsp)  /* rsp */
152         movq $(1<<9),3*8(%rsp)  /* eflags */
153         movq $__KERNEL_CS,2*8(%rsp) /* cs */
154         movq \child_rip,1*8(%rsp)  /* rip */ 
155         movq %rax,(%rsp)   /* orig_rax */ 
156         .endm
157
158         .macro UNFAKE_STACK_FRAME
159         addq $8*6, %rsp
160         .endm
161
162         .macro icebp
163         .byte 0xf1
164         .endm
165
166 #ifdef CONFIG_FRAME_POINTER
167 #define ENTER enter
168 #define LEAVE leave
169 #else
170 #define ENTER
171 #define LEAVE
172 #endif