Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  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
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         movq \offset+72(%rsp), %rax
117         .endm
118 
119 #define REST_SKIP       6*8
120 
121         .macro SAVE_REST
122         subq $REST_SKIP, %rsp
123         CFI_ADJUST_CFA_OFFSET   REST_SKIP
124         movq %rbx, 5*8(%rsp)
125         CFI_REL_OFFSET  rbx, 5*8
126         movq %rbp, 4*8(%rsp)
127         CFI_REL_OFFSET  rbp, 4*8
128         movq %r12, 3*8(%rsp)
129         CFI_REL_OFFSET  r12, 3*8
130         movq %r13, 2*8(%rsp)
131         CFI_REL_OFFSET  r13, 2*8
132         movq %r14, 1*8(%rsp)
133         CFI_REL_OFFSET  r14, 1*8
134         movq %r15, (%rsp)
135         CFI_REL_OFFSET  r15, 0*8
136         .endm
137 
138         .macro RESTORE_REST
139         movq (%rsp),     %r15
140         CFI_RESTORE r15
141         movq 1*8(%rsp),  %r14
142         CFI_RESTORE r14
143         movq 2*8(%rsp),  %r13
144         CFI_RESTORE r13
145         movq 3*8(%rsp),  %r12
146         CFI_RESTORE r12
147         movq 4*8(%rsp),  %rbp
148         CFI_RESTORE rbp
149         movq 5*8(%rsp),  %rbx
150         CFI_RESTORE rbx
151         addq $REST_SKIP, %rsp
152         CFI_ADJUST_CFA_OFFSET   -(REST_SKIP)
153         .endm
154 
155         .macro SAVE_ALL
156         SAVE_ARGS
157         SAVE_REST
158         .endm
159 
160         .macro RESTORE_ALL addskip=0
161         RESTORE_REST
162         RESTORE_ARGS 0, \addskip
163         .endm
164 
165         .macro icebp
166         .byte 0xf1
167         .endm
168 
169 
170 /*
171  * latency-tracing helpers:
172  */
173 
174         .macro TRACE_SYS_CALL
175 
176 #ifdef CONFIG_EVENT_TRACER
177         SAVE_ARGS
178 
179         mov     %rdx, %rcx
180         mov     %rsi, %rdx
181         mov     %rdi, %rsi
182         mov     %rax, %rdi
183 
184         call sys_call
185 
186         RESTORE_ARGS
187 #endif
188         .endm
189 
190 
191         .macro TRACE_SYS_IA32_CALL
192 
193 #ifdef CONFIG_EVENT_TRACER
194         SAVE_ARGS
195 
196         mov     %rdx, %rcx
197         mov     %rsi, %rdx
198         mov     %rdi, %rsi
199         mov     %rax, %rdi
200 
201         call sys_ia32_call
202 
203         RESTORE_ARGS
204 #endif
205         .endm
206 
207         .macro TRACE_SYS_RET
208 
209 #ifdef CONFIG_EVENT_TRACER
210         SAVE_ARGS
211 
212         mov     %rax, %rdi
213 
214         call sys_ret
215 
216         RESTORE_ARGS
217 #endif
218         .endm
219 
  This page was automatically generated by the LXR engine.