Blame view
arch/x86/ia32/ia32entry.S
13.2 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 3 4 5 6 7 8 |
/* * Compatibility mode system call entry point for x86-64. * * Copyright 2000-2002 Andi Kleen, SuSE Labs. */ #include <asm/dwarf2.h> #include <asm/calling.h> |
e2d5df935 kbuild: alpha,x86... |
9 |
#include <asm/asm-offsets.h> |
1da177e4c Linux-2.6.12-rc2 |
10 11 12 13 14 |
#include <asm/current.h> #include <asm/errno.h> #include <asm/ia32_unistd.h> #include <asm/thread_info.h> #include <asm/segment.h> |
2601e64d2 [PATCH] lockdep: ... |
15 |
#include <asm/irqflags.h> |
1da177e4c Linux-2.6.12-rc2 |
16 |
#include <linux/linkage.h> |
5cbf1565f x86_64 ia32 sysca... |
17 18 19 20 21 22 |
/* Avoid __ASSEMBLER__'ifying <linux/audit.h> just for this. */ #include <linux/elf-em.h> #define AUDIT_ARCH_I386 (EM_386|__AUDIT_ARCH_LE) #define __AUDIT_ARCH_LE 0x40000000 #ifndef CONFIG_AUDITSYSCALL |
24e35800c x86: Don't leak 6... |
23 24 |
#define sysexit_audit ia32_ret_from_sys_call #define sysretl_audit ia32_ret_from_sys_call |
5cbf1565f x86_64 ia32 sysca... |
25 |
#endif |
ea7145477 x86: Separate out... |
26 |
.section .entry.text, "ax" |
1da177e4c Linux-2.6.12-rc2 |
27 28 29 30 31 32 33 34 35 36 37 38 39 |
.macro IA32_ARG_FIXUP noebp=0 movl %edi,%r8d .if oebp .else movl %ebp,%r9d .endif xchg %ecx,%esi movl %ebx,%edi movl %edx,%edx /* zero extension */ .endm /* clobbers %eax */ |
24e35800c x86: Don't leak 6... |
40 |
.macro CLEAR_RREGS offset=0, _r9=rax |
1da177e4c Linux-2.6.12-rc2 |
41 |
xorl %eax,%eax |
24e35800c x86: Don't leak 6... |
42 43 44 45 |
movq %rax,\offset+R11(%rsp) movq %rax,\offset+R10(%rsp) movq %\_r9,\offset+R9(%rsp) movq %rax,\offset+R8(%rsp) |
1da177e4c Linux-2.6.12-rc2 |
46 |
.endm |
d4d671501 x86 ptrace: unify... |
47 48 49 |
/* * Reload arg registers from stack in case ptrace changed them. * We don't reload %eax because syscall_trace_enter() returned |
eefdca043 x86-64, compat: R... |
50 51 52 53 54 55 |
* the %rax value we should see. Instead, we just truncate that * value to 32 bits again as we did on entry from user mode. * If it's a new value set by user_regset during entry tracing, * this matches the normal truncation of the user-mode value. * If it's -1 to make us punt the syscall, then (u32)-1 is still * an appropriately invalid value. |
d4d671501 x86 ptrace: unify... |
56 |
*/ |
295286a89 x86-64: slightly ... |
57 58 |
.macro LOAD_ARGS32 offset, _r9=0 .if \_r9 |
176df2457 x86_64: Zero exte... |
59 |
movl \offset+16(%rsp),%r9d |
295286a89 x86-64: slightly ... |
60 |
.endif |
176df2457 x86_64: Zero exte... |
61 62 63 64 |
movl \offset+40(%rsp),%ecx movl \offset+48(%rsp),%edx movl \offset+56(%rsp),%esi movl \offset+64(%rsp),%edi |
eefdca043 x86-64, compat: R... |
65 |
movl %eax,%eax /* zero extension */ |
176df2457 x86_64: Zero exte... |
66 67 |
.endm |
2765130b0 [PATCH] x86_64: M... |
68 69 70 71 72 73 74 75 76 77 78 |
.macro CFI_STARTPROC32 simple CFI_STARTPROC \simple CFI_UNDEFINED r8 CFI_UNDEFINED r9 CFI_UNDEFINED r10 CFI_UNDEFINED r11 CFI_UNDEFINED r12 CFI_UNDEFINED r13 CFI_UNDEFINED r14 CFI_UNDEFINED r15 .endm |
2be29982a x86/paravirt: add... |
79 80 81 82 83 84 85 86 87 88 89 90 |
#ifdef CONFIG_PARAVIRT ENTRY(native_usergs_sysret32) swapgs sysretl ENDPROC(native_usergs_sysret32) ENTRY(native_irq_enable_sysexit) swapgs sti sysexit ENDPROC(native_irq_enable_sysexit) #endif |
1da177e4c Linux-2.6.12-rc2 |
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
/* * 32bit SYSENTER instruction entry. * * Arguments: * %eax System call number. * %ebx Arg1 * %ecx Arg2 * %edx Arg3 * %esi Arg4 * %edi Arg5 * %ebp user stack * 0(%ebp) Arg6 * * Interrupts off. * * This is purely a fast path. For anything complicated we use the int 0x80 * path below. Set up a complete hardware stack frame to share code * with the int 0x80 path. */ ENTRY(ia32_sysenter_target) |
2765130b0 [PATCH] x86_64: M... |
111 |
CFI_STARTPROC32 simple |
adf142369 [PATCH] i386/x86-... |
112 |
CFI_SIGNAL_FRAME |
7effaa882 [PATCH] x86-64: F... |
113 114 |
CFI_DEF_CFA rsp,0 CFI_REGISTER rsp,rbp |
457da70ec x86/paravirt: gro... |
115 |
SWAPGS_UNSAFE_STACK |
9af45651f x86-64: Move kern... |
116 117 |
movq PER_CPU_VAR(kernel_stack), %rsp addq $(KERNEL_STACK_OFFSET),%rsp |
2601e64d2 [PATCH] lockdep: ... |
118 119 120 121 |
/* * No need to follow this irqs on/off section: the syscall * disabled irqs, here we enable it straight after entry: */ |
668041548 x86, 64-bit: ia32... |
122 |
ENABLE_INTERRUPTS(CLBR_NONE) |
1da177e4c Linux-2.6.12-rc2 |
123 |
movl %ebp,%ebp /* zero extension */ |
60cf637a1 x86: Use {push,po... |
124 |
pushq_cfi $__USER32_DS |
7effaa882 [PATCH] x86-64: F... |
125 |
/*CFI_REL_OFFSET ss,0*/ |
60cf637a1 x86: Use {push,po... |
126 |
pushq_cfi %rbp |
7effaa882 [PATCH] x86-64: F... |
127 |
CFI_REL_OFFSET rsp,0 |
60cf637a1 x86: Use {push,po... |
128 |
pushfq_cfi |
7effaa882 [PATCH] x86-64: F... |
129 |
/*CFI_REL_OFFSET rflags,0*/ |
46db09d3f x86-64: Slightly ... |
130 |
movl TI_sysenter_return+THREAD_INFO(%rsp,3*8-KERNEL_STACK_OFFSET),%r10d |
7effaa882 [PATCH] x86-64: F... |
131 |
CFI_REGISTER rip,r10 |
60cf637a1 x86: Use {push,po... |
132 |
pushq_cfi $__USER32_CS |
7effaa882 [PATCH] x86-64: F... |
133 |
/*CFI_REL_OFFSET cs,0*/ |
1da177e4c Linux-2.6.12-rc2 |
134 |
movl %eax, %eax |
60cf637a1 x86: Use {push,po... |
135 |
pushq_cfi %r10 |
7effaa882 [PATCH] x86-64: F... |
136 |
CFI_REL_OFFSET rip,0 |
60cf637a1 x86: Use {push,po... |
137 |
pushq_cfi %rax |
1da177e4c Linux-2.6.12-rc2 |
138 |
cld |
cac0e0a78 x86, asm: Flip SA... |
139 |
SAVE_ARGS 0,1,0 |
1da177e4c Linux-2.6.12-rc2 |
140 141 |
/* no need to do an access_ok check here because rbp has been 32bit zero extended */ |
295286a89 x86-64: slightly ... |
142 |
1: movl (%rbp),%ebp |
1da177e4c Linux-2.6.12-rc2 |
143 144 145 |
.section __ex_table,"a" .quad 1b,ia32_badarg .previous |
46db09d3f x86-64: Slightly ... |
146 147 |
orl $TS_COMPAT,TI_status+THREAD_INFO(%rsp,RIP-ARGOFFSET) testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) |
7effaa882 [PATCH] x86-64: F... |
148 |
CFI_REMEMBER_STATE |
1da177e4c Linux-2.6.12-rc2 |
149 |
jnz sysenter_tracesys |
36d001c70 x86-64, compat: T... |
150 |
cmpq $(IA32_NR_syscalls-1),%rax |
67d53ea5a [PATCH] x86_64: E... |
151 |
ja ia32_badsys |
d4d671501 x86 ptrace: unify... |
152 |
sysenter_do_call: |
295286a89 x86-64: slightly ... |
153 |
IA32_ARG_FIXUP |
5cbf1565f x86_64 ia32 sysca... |
154 |
sysenter_dispatch: |
1da177e4c Linux-2.6.12-rc2 |
155 156 |
call *ia32_sys_call_table(,%rax,8) movq %rax,RAX-ARGOFFSET(%rsp) |
668041548 x86, 64-bit: ia32... |
157 |
DISABLE_INTERRUPTS(CLBR_NONE) |
2601e64d2 [PATCH] lockdep: ... |
158 |
TRACE_IRQS_OFF |
46db09d3f x86-64: Slightly ... |
159 |
testl $_TIF_ALLWORK_MASK,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) |
5cbf1565f x86_64 ia32 sysca... |
160 161 |
jnz sysexit_audit sysexit_from_sys_call: |
46db09d3f x86-64: Slightly ... |
162 |
andl $~TS_COMPAT,TI_status+THREAD_INFO(%rsp,RIP-ARGOFFSET) |
1da177e4c Linux-2.6.12-rc2 |
163 164 |
/* clear IF, that popfq doesn't enable interrupts early */ andl $~0x200,EFLAGS-R11(%rsp) |
36197c92a x86 vDSO: ia32 sy... |
165 166 |
movl RIP-R11(%rsp),%edx /* User %eip */ CFI_REGISTER rip,rdx |
838feb475 x86, asm: Flip RE... |
167 |
RESTORE_ARGS 0,24,0,0,0,0 |
24e35800c x86: Don't leak 6... |
168 169 170 171 |
xorq %r8,%r8 xorq %r9,%r9 xorq %r10,%r10 xorq %r11,%r11 |
60cf637a1 x86: Use {push,po... |
172 |
popfq_cfi |
7effaa882 [PATCH] x86-64: F... |
173 |
/*CFI_RESTORE rflags*/ |
60cf637a1 x86: Use {push,po... |
174 |
popq_cfi %rcx /* User %esp */ |
7effaa882 [PATCH] x86-64: F... |
175 |
CFI_REGISTER rsp,rcx |
2601e64d2 [PATCH] lockdep: ... |
176 |
TRACE_IRQS_ON |
2be29982a x86/paravirt: add... |
177 |
ENABLE_INTERRUPTS_SYSEXIT32 |
1da177e4c Linux-2.6.12-rc2 |
178 |
|
5cbf1565f x86_64 ia32 sysca... |
179 180 181 182 183 184 185 186 187 188 |
#ifdef CONFIG_AUDITSYSCALL .macro auditsys_entry_common movl %esi,%r9d /* 6th arg: 4th syscall arg */ movl %edx,%r8d /* 5th arg: 3rd syscall arg */ /* (already in %ecx) 4th arg: 2nd syscall arg */ movl %ebx,%edx /* 3rd arg: 1st syscall arg */ movl %eax,%esi /* 2nd arg: syscall number */ movl $AUDIT_ARCH_I386,%edi /* 1st arg: audit arch */ call audit_syscall_entry movl RAX-ARGOFFSET(%rsp),%eax /* reload syscall number */ |
36d001c70 x86-64, compat: T... |
189 |
cmpq $(IA32_NR_syscalls-1),%rax |
5cbf1565f x86_64 ia32 sysca... |
190 191 192 193 194 195 196 |
ja ia32_badsys movl %ebx,%edi /* reload 1st syscall arg */ movl RCX-ARGOFFSET(%rsp),%esi /* reload 2nd syscall arg */ movl RDX-ARGOFFSET(%rsp),%edx /* reload 3rd syscall arg */ movl RSI-ARGOFFSET(%rsp),%ecx /* reload 4th syscall arg */ movl RDI-ARGOFFSET(%rsp),%r8d /* reload 5th syscall arg */ .endm |
81766741f x86-64: Fix regis... |
197 |
.macro auditsys_exit exit |
46db09d3f x86-64: Slightly ... |
198 |
testl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) |
24e35800c x86: Don't leak 6... |
199 |
jnz ia32_ret_from_sys_call |
5cbf1565f x86_64 ia32 sysca... |
200 201 202 203 204 205 206 207 |
TRACE_IRQS_ON sti movl %eax,%esi /* second arg, syscall return value */ cmpl $0,%eax /* is it < 0? */ setl %al /* 1 if so, 0 if not */ movzbl %al,%edi /* zero-extend that into %edi */ inc %edi /* first arg, 0->1(AUDITSC_SUCCESS), 1->2(AUDITSC_FAILURE) */ call audit_syscall_exit |
5cbf1565f x86_64 ia32 sysca... |
208 |
movl RAX-ARGOFFSET(%rsp),%eax /* reload syscall return value */ |
5cbf1565f x86_64 ia32 sysca... |
209 210 211 |
movl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),%edi cli TRACE_IRQS_OFF |
46db09d3f x86-64: Slightly ... |
212 |
testl %edi,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) |
24e35800c x86: Don't leak 6... |
213 214 215 |
jz \exit CLEAR_RREGS -ARGOFFSET jmp int_with_check |
5cbf1565f x86_64 ia32 sysca... |
216 217 218 |
.endm sysenter_auditsys: |
7effaa882 [PATCH] x86-64: F... |
219 |
CFI_RESTORE_STATE |
5cbf1565f x86_64 ia32 sysca... |
220 221 222 223 224 225 226 227 228 |
auditsys_entry_common movl %ebp,%r9d /* reload 6th syscall arg */ jmp sysenter_dispatch sysexit_audit: auditsys_exit sysexit_from_sys_call #endif sysenter_tracesys: |
5cbf1565f x86_64 ia32 sysca... |
229 |
#ifdef CONFIG_AUDITSYSCALL |
46db09d3f x86-64: Slightly ... |
230 |
testl $(_TIF_WORK_SYSCALL_ENTRY & ~_TIF_SYSCALL_AUDIT),TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) |
5cbf1565f x86_64 ia32 sysca... |
231 232 |
jz sysenter_auditsys #endif |
1da177e4c Linux-2.6.12-rc2 |
233 234 |
SAVE_REST CLEAR_RREGS |
48ee679a0 x86: ia32 ptrace ... |
235 |
movq $-ENOSYS,RAX(%rsp)/* ptrace can change this for a bad syscall */ |
1da177e4c Linux-2.6.12-rc2 |
236 237 |
movq %rsp,%rdi /* &pt_regs -> arg1 */ call syscall_trace_enter |
176df2457 x86_64: Zero exte... |
238 |
LOAD_ARGS32 ARGOFFSET /* reload args from stack in case ptrace changed it */ |
1da177e4c Linux-2.6.12-rc2 |
239 |
RESTORE_REST |
36d001c70 x86-64, compat: T... |
240 |
cmpq $(IA32_NR_syscalls-1),%rax |
48ee679a0 x86: ia32 ptrace ... |
241 |
ja int_ret_from_sys_call /* sysenter_tracesys has set RAX(%rsp) */ |
1da177e4c Linux-2.6.12-rc2 |
242 243 |
jmp sysenter_do_call CFI_ENDPROC |
4b787e0b8 [PATCH] x86_64: a... |
244 |
ENDPROC(ia32_sysenter_target) |
1da177e4c Linux-2.6.12-rc2 |
245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 |
/* * 32bit SYSCALL instruction entry. * * Arguments: * %eax System call number. * %ebx Arg1 * %ecx return EIP * %edx Arg3 * %esi Arg4 * %edi Arg5 * %ebp Arg2 [note: not saved in the stack frame, should not be touched] * %esp user stack * 0(%esp) Arg6 * * Interrupts off. * * This is purely a fast path. For anything complicated we use the int 0x80 * path below. Set up a complete hardware stack frame to share code * with the int 0x80 path. */ ENTRY(ia32_cstar_target) |
2765130b0 [PATCH] x86_64: M... |
267 |
CFI_STARTPROC32 simple |
adf142369 [PATCH] i386/x86-... |
268 |
CFI_SIGNAL_FRAME |
9af45651f x86-64: Move kern... |
269 |
CFI_DEF_CFA rsp,KERNEL_STACK_OFFSET |
7effaa882 [PATCH] x86-64: F... |
270 271 |
CFI_REGISTER rip,rcx /*CFI_REGISTER rflags,r11*/ |
457da70ec x86/paravirt: gro... |
272 |
SWAPGS_UNSAFE_STACK |
1da177e4c Linux-2.6.12-rc2 |
273 |
movl %esp,%r8d |
7effaa882 [PATCH] x86-64: F... |
274 |
CFI_REGISTER rsp,r8 |
9af45651f x86-64: Move kern... |
275 |
movq PER_CPU_VAR(kernel_stack),%rsp |
2601e64d2 [PATCH] lockdep: ... |
276 277 278 279 |
/* * No need to follow this irqs on/off section: the syscall * disabled irqs and here we enable it straight after entry: */ |
668041548 x86, 64-bit: ia32... |
280 |
ENABLE_INTERRUPTS(CLBR_NONE) |
cac0e0a78 x86, asm: Flip SA... |
281 |
SAVE_ARGS 8,0,0 |
1da177e4c Linux-2.6.12-rc2 |
282 283 284 |
movl %eax,%eax /* zero extension */ movq %rax,ORIG_RAX-ARGOFFSET(%rsp) movq %rcx,RIP-ARGOFFSET(%rsp) |
7effaa882 [PATCH] x86-64: F... |
285 |
CFI_REL_OFFSET rip,RIP-ARGOFFSET |
1da177e4c Linux-2.6.12-rc2 |
286 287 288 289 290 |
movq %rbp,RCX-ARGOFFSET(%rsp) /* this lies slightly to ptrace */ movl %ebp,%ecx movq $__USER32_CS,CS-ARGOFFSET(%rsp) movq $__USER32_DS,SS-ARGOFFSET(%rsp) movq %r11,EFLAGS-ARGOFFSET(%rsp) |
7effaa882 [PATCH] x86-64: F... |
291 |
/*CFI_REL_OFFSET rflags,EFLAGS-ARGOFFSET*/ |
1da177e4c Linux-2.6.12-rc2 |
292 |
movq %r8,RSP-ARGOFFSET(%rsp) |
7effaa882 [PATCH] x86-64: F... |
293 |
CFI_REL_OFFSET rsp,RSP-ARGOFFSET |
1da177e4c Linux-2.6.12-rc2 |
294 295 296 297 298 299 300 |
/* no need to do an access_ok check here because r8 has been 32bit zero extended */ /* hardware stack frame is complete now */ 1: movl (%r8),%r9d .section __ex_table,"a" .quad 1b,ia32_badarg .previous |
46db09d3f x86-64: Slightly ... |
301 302 |
orl $TS_COMPAT,TI_status+THREAD_INFO(%rsp,RIP-ARGOFFSET) testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) |
7effaa882 [PATCH] x86-64: F... |
303 |
CFI_REMEMBER_STATE |
1da177e4c Linux-2.6.12-rc2 |
304 |
jnz cstar_tracesys |
36d001c70 x86-64, compat: T... |
305 |
cmpq $IA32_NR_syscalls-1,%rax |
67d53ea5a [PATCH] x86_64: E... |
306 |
ja ia32_badsys |
295286a89 x86-64: slightly ... |
307 |
cstar_do_call: |
1da177e4c Linux-2.6.12-rc2 |
308 |
IA32_ARG_FIXUP 1 |
5cbf1565f x86_64 ia32 sysca... |
309 |
cstar_dispatch: |
1da177e4c Linux-2.6.12-rc2 |
310 311 |
call *ia32_sys_call_table(,%rax,8) movq %rax,RAX-ARGOFFSET(%rsp) |
668041548 x86, 64-bit: ia32... |
312 |
DISABLE_INTERRUPTS(CLBR_NONE) |
2601e64d2 [PATCH] lockdep: ... |
313 |
TRACE_IRQS_OFF |
46db09d3f x86-64: Slightly ... |
314 |
testl $_TIF_ALLWORK_MASK,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) |
5cbf1565f x86_64 ia32 sysca... |
315 316 |
jnz sysretl_audit sysretl_from_sys_call: |
46db09d3f x86-64: Slightly ... |
317 |
andl $~TS_COMPAT,TI_status+THREAD_INFO(%rsp,RIP-ARGOFFSET) |
838feb475 x86, asm: Flip RE... |
318 |
RESTORE_ARGS 0,-ARG_SKIP,0,0,0 |
1da177e4c Linux-2.6.12-rc2 |
319 |
movl RIP-ARGOFFSET(%rsp),%ecx |
7effaa882 [PATCH] x86-64: F... |
320 |
CFI_REGISTER rip,rcx |
1da177e4c Linux-2.6.12-rc2 |
321 |
movl EFLAGS-ARGOFFSET(%rsp),%r11d |
7effaa882 [PATCH] x86-64: F... |
322 |
/*CFI_REGISTER rflags,r11*/ |
24e35800c x86: Don't leak 6... |
323 324 325 |
xorq %r10,%r10 xorq %r9,%r9 xorq %r8,%r8 |
2601e64d2 [PATCH] lockdep: ... |
326 |
TRACE_IRQS_ON |
1da177e4c Linux-2.6.12-rc2 |
327 |
movl RSP-ARGOFFSET(%rsp),%esp |
7effaa882 [PATCH] x86-64: F... |
328 |
CFI_RESTORE rsp |
2be29982a x86/paravirt: add... |
329 |
USERGS_SYSRET32 |
1da177e4c Linux-2.6.12-rc2 |
330 |
|
5cbf1565f x86_64 ia32 sysca... |
331 332 |
#ifdef CONFIG_AUDITSYSCALL cstar_auditsys: |
7effaa882 [PATCH] x86-64: F... |
333 |
CFI_RESTORE_STATE |
5cbf1565f x86_64 ia32 sysca... |
334 335 336 337 338 339 |
movl %r9d,R9-ARGOFFSET(%rsp) /* register to be clobbered by call */ auditsys_entry_common movl R9-ARGOFFSET(%rsp),%r9d /* reload 6th syscall arg */ jmp cstar_dispatch sysretl_audit: |
81766741f x86-64: Fix regis... |
340 |
auditsys_exit sysretl_from_sys_call |
5cbf1565f x86_64 ia32 sysca... |
341 342 343 344 |
#endif cstar_tracesys: #ifdef CONFIG_AUDITSYSCALL |
46db09d3f x86-64: Slightly ... |
345 |
testl $(_TIF_WORK_SYSCALL_ENTRY & ~_TIF_SYSCALL_AUDIT),TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) |
5cbf1565f x86_64 ia32 sysca... |
346 347 |
jz cstar_auditsys #endif |
ecd744eec x86 - 32-bit ptra... |
348 |
xchgl %r9d,%ebp |
1da177e4c Linux-2.6.12-rc2 |
349 |
SAVE_REST |
24e35800c x86: Don't leak 6... |
350 |
CLEAR_RREGS 0, r9 |
48ee679a0 x86: ia32 ptrace ... |
351 |
movq $-ENOSYS,RAX(%rsp) /* ptrace can change this for a bad syscall */ |
1da177e4c Linux-2.6.12-rc2 |
352 353 |
movq %rsp,%rdi /* &pt_regs -> arg1 */ call syscall_trace_enter |
295286a89 x86-64: slightly ... |
354 |
LOAD_ARGS32 ARGOFFSET, 1 /* reload args from stack in case ptrace changed it */ |
1da177e4c Linux-2.6.12-rc2 |
355 |
RESTORE_REST |
ecd744eec x86 - 32-bit ptra... |
356 |
xchgl %ebp,%r9d |
36d001c70 x86-64, compat: T... |
357 |
cmpq $(IA32_NR_syscalls-1),%rax |
48ee679a0 x86: ia32 ptrace ... |
358 |
ja int_ret_from_sys_call /* cstar_tracesys has set RAX(%rsp) */ |
1da177e4c Linux-2.6.12-rc2 |
359 |
jmp cstar_do_call |
4b787e0b8 [PATCH] x86_64: a... |
360 |
END(ia32_cstar_target) |
1da177e4c Linux-2.6.12-rc2 |
361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 |
ia32_badarg: movq $-EFAULT,%rax jmp ia32_sysret CFI_ENDPROC /* * Emulated IA32 system calls via int 0x80. * * Arguments: * %eax System call number. * %ebx Arg1 * %ecx Arg2 * %edx Arg3 * %esi Arg4 * %edi Arg5 * %ebp Arg6 [note: not saved in the stack frame, should not be touched] * * Notes: * Uses the same stack frame as the x86-64 version. * All registers except %eax must be saved (but ptrace may violate that) * Arguments are zero extended. For system calls that want sign extension and * take long arguments a wrapper is needed. Most calls can just be called * directly. * Assumes it is only called from user space and entered with interrupts off. */ ENTRY(ia32_syscall) |
cdc1793ef x86_64: ia32entry... |
389 |
CFI_STARTPROC32 simple |
adf142369 [PATCH] i386/x86-... |
390 |
CFI_SIGNAL_FRAME |
7effaa882 [PATCH] x86-64: F... |
391 392 393 394 395 396 |
CFI_DEF_CFA rsp,SS+8-RIP /*CFI_REL_OFFSET ss,SS-RIP*/ CFI_REL_OFFSET rsp,RSP-RIP /*CFI_REL_OFFSET rflags,EFLAGS-RIP*/ /*CFI_REL_OFFSET cs,CS-RIP*/ CFI_REL_OFFSET rip,RIP-RIP |
360c044eb x86_64: adjust ex... |
397 |
PARAVIRT_ADJUST_EXCEPTION_FRAME |
668041548 x86, 64-bit: ia32... |
398 |
SWAPGS |
2601e64d2 [PATCH] lockdep: ... |
399 400 401 402 |
/* * No need to follow this irqs on/off section: the syscall * disabled irqs and here we enable it straight after entry: */ |
668041548 x86, 64-bit: ia32... |
403 |
ENABLE_INTERRUPTS(CLBR_NONE) |
1da177e4c Linux-2.6.12-rc2 |
404 |
movl %eax,%eax |
60cf637a1 x86: Use {push,po... |
405 |
pushq_cfi %rax |
1da177e4c Linux-2.6.12-rc2 |
406 407 408 |
cld /* note the registers are not zero extended to the sf. this could be a problem. */ |
cac0e0a78 x86, asm: Flip SA... |
409 |
SAVE_ARGS 0,1,0 |
46db09d3f x86-64: Slightly ... |
410 411 |
orl $TS_COMPAT,TI_status+THREAD_INFO(%rsp,RIP-ARGOFFSET) testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) |
1da177e4c Linux-2.6.12-rc2 |
412 |
jnz ia32_tracesys |
36d001c70 x86-64, compat: T... |
413 |
cmpq $(IA32_NR_syscalls-1),%rax |
c09249f8d x86-64: fix int $... |
414 415 |
ja ia32_badsys ia32_do_call: |
1da177e4c Linux-2.6.12-rc2 |
416 417 418 419 |
IA32_ARG_FIXUP call *ia32_sys_call_table(,%rax,8) # xxx: rip relative ia32_sysret: movq %rax,RAX-ARGOFFSET(%rsp) |
24e35800c x86: Don't leak 6... |
420 421 |
ia32_ret_from_sys_call: CLEAR_RREGS -ARGOFFSET |
1da177e4c Linux-2.6.12-rc2 |
422 423 424 425 |
jmp int_ret_from_sys_call ia32_tracesys: SAVE_REST |
cdc1793ef x86_64: ia32entry... |
426 |
CLEAR_RREGS |
8ab32bb89 x86: ia32 ptrace ... |
427 |
movq $-ENOSYS,RAX(%rsp) /* ptrace can change this for a bad syscall */ |
1da177e4c Linux-2.6.12-rc2 |
428 429 |
movq %rsp,%rdi /* &pt_regs -> arg1 */ call syscall_trace_enter |
176df2457 x86_64: Zero exte... |
430 |
LOAD_ARGS32 ARGOFFSET /* reload args from stack in case ptrace changed it */ |
1da177e4c Linux-2.6.12-rc2 |
431 |
RESTORE_REST |
36d001c70 x86-64, compat: T... |
432 |
cmpq $(IA32_NR_syscalls-1),%rax |
c09249f8d x86-64: fix int $... |
433 434 |
ja int_ret_from_sys_call /* ia32_tracesys has set RAX(%rsp) */ jmp ia32_do_call |
4b787e0b8 [PATCH] x86_64: a... |
435 |
END(ia32_syscall) |
1da177e4c Linux-2.6.12-rc2 |
436 437 438 |
ia32_badsys: movq $0,ORIG_RAX-ARGOFFSET(%rsp) |
24e35800c x86: Don't leak 6... |
439 440 |
movq $-ENOSYS,%rax jmp ia32_sysret |
1da177e4c Linux-2.6.12-rc2 |
441 |
|
1da177e4c Linux-2.6.12-rc2 |
442 443 444 |
CFI_ENDPROC .macro PTREGSCALL label, func, arg |
f6b2bc847 x86-64: Cleanup s... |
445 446 |
ALIGN GLOBAL(\label) |
1da177e4c Linux-2.6.12-rc2 |
447 448 449 450 |
leaq \func(%rip),%rax leaq -ARGOFFSET+8(%rsp),\arg /* 8 for return address */ jmp ia32_ptregs_common .endm |
2765130b0 [PATCH] x86_64: M... |
451 |
CFI_STARTPROC32 |
7effaa882 [PATCH] x86-64: F... |
452 |
|
1da177e4c Linux-2.6.12-rc2 |
453 454 455 |
PTREGSCALL stub32_rt_sigreturn, sys32_rt_sigreturn, %rdi PTREGSCALL stub32_sigreturn, sys32_sigreturn, %rdi PTREGSCALL stub32_sigaltstack, sys32_sigaltstack, %rdx |
1da177e4c Linux-2.6.12-rc2 |
456 457 458 459 460 |
PTREGSCALL stub32_execve, sys32_execve, %rcx PTREGSCALL stub32_fork, sys_fork, %rdi PTREGSCALL stub32_clone, sys32_clone, %rdx PTREGSCALL stub32_vfork, sys_vfork, %rdi PTREGSCALL stub32_iopl, sys_iopl, %rsi |
1da177e4c Linux-2.6.12-rc2 |
461 |
|
f6b2bc847 x86-64: Cleanup s... |
462 463 |
ALIGN ia32_ptregs_common: |
1da177e4c Linux-2.6.12-rc2 |
464 |
popq %r11 |
2765130b0 [PATCH] x86_64: M... |
465 466 |
CFI_ENDPROC CFI_STARTPROC32 simple |
adf142369 [PATCH] i386/x86-... |
467 |
CFI_SIGNAL_FRAME |
2765130b0 [PATCH] x86_64: M... |
468 469 470 471 472 473 474 475 476 477 478 |
CFI_DEF_CFA rsp,SS+8-ARGOFFSET CFI_REL_OFFSET rax,RAX-ARGOFFSET CFI_REL_OFFSET rcx,RCX-ARGOFFSET CFI_REL_OFFSET rdx,RDX-ARGOFFSET CFI_REL_OFFSET rsi,RSI-ARGOFFSET CFI_REL_OFFSET rdi,RDI-ARGOFFSET CFI_REL_OFFSET rip,RIP-ARGOFFSET /* CFI_REL_OFFSET cs,CS-ARGOFFSET*/ /* CFI_REL_OFFSET rflags,EFLAGS-ARGOFFSET*/ CFI_REL_OFFSET rsp,RSP-ARGOFFSET /* CFI_REL_OFFSET ss,SS-ARGOFFSET*/ |
1da177e4c Linux-2.6.12-rc2 |
479 480 481 482 483 |
SAVE_REST call *%rax RESTORE_REST jmp ia32_sysret /* misbalances the return cache */ CFI_ENDPROC |
4b787e0b8 [PATCH] x86_64: a... |
484 |
END(ia32_ptregs_common) |