Blame view

arch/x86/ia32/ia32entry.S 13.2 KB
1da177e4c   Linus Torvalds   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   Sam Ravnborg   kbuild: alpha,x86...
9
  #include <asm/asm-offsets.h>
1da177e4c   Linus Torvalds   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   Ingo Molnar   [PATCH] lockdep: ...
15
  #include <asm/irqflags.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
16
  #include <linux/linkage.h>
5cbf1565f   Roland McGrath   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   Jan Beulich   x86: Don't leak 6...
23
24
  #define sysexit_audit ia32_ret_from_sys_call
  #define sysretl_audit ia32_ret_from_sys_call
5cbf1565f   Roland McGrath   x86_64 ia32 sysca...
25
  #endif
ea7145477   Jiri Olsa   x86: Separate out...
26
  	.section .entry.text, "ax"
1da177e4c   Linus Torvalds   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   Jan Beulich   x86: Don't leak 6...
40
  	.macro  CLEAR_RREGS offset=0, _r9=rax
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
41
  	xorl 	%eax,%eax
24e35800c   Jan Beulich   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   Linus Torvalds   Linux-2.6.12-rc2
46
  	.endm
d4d671501   Roland McGrath   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   Roland McGrath   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   Roland McGrath   x86 ptrace: unify...
56
  	 */
295286a89   Jan Beulich   x86-64: slightly ...
57
58
  	.macro LOAD_ARGS32 offset, _r9=0
  	.if \_r9
176df2457   Andi Kleen   x86_64: Zero exte...
59
  	movl \offset+16(%rsp),%r9d
295286a89   Jan Beulich   x86-64: slightly ...
60
  	.endif
176df2457   Andi Kleen   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   Roland McGrath   x86-64, compat: R...
65
  	movl %eax,%eax			/* zero extension */
176df2457   Andi Kleen   x86_64: Zero exte...
66
67
  	.endm
  	
2765130b0   Jan Beulich   [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   Jeremy Fitzhardinge   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   Linus Torvalds   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   Jan Beulich   [PATCH] x86_64: M...
111
  	CFI_STARTPROC32	simple
adf142369   Jan Beulich   [PATCH] i386/x86-...
112
  	CFI_SIGNAL_FRAME
7effaa882   Jan Beulich   [PATCH] x86-64: F...
113
114
  	CFI_DEF_CFA	rsp,0
  	CFI_REGISTER	rsp,rbp
457da70ec   Jeremy Fitzhardinge   x86/paravirt: gro...
115
  	SWAPGS_UNSAFE_STACK
9af45651f   Brian Gerst   x86-64: Move kern...
116
117
  	movq	PER_CPU_VAR(kernel_stack), %rsp
  	addq	$(KERNEL_STACK_OFFSET),%rsp
2601e64d2   Ingo Molnar   [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   Jeremy Fitzhardinge   x86, 64-bit: ia32...
122
  	ENABLE_INTERRUPTS(CLBR_NONE)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
123
   	movl	%ebp,%ebp		/* zero extension */
60cf637a1   Jan Beulich   x86: Use {push,po...
124
  	pushq_cfi $__USER32_DS
7effaa882   Jan Beulich   [PATCH] x86-64: F...
125
  	/*CFI_REL_OFFSET ss,0*/
60cf637a1   Jan Beulich   x86: Use {push,po...
126
  	pushq_cfi %rbp
7effaa882   Jan Beulich   [PATCH] x86-64: F...
127
  	CFI_REL_OFFSET rsp,0
60cf637a1   Jan Beulich   x86: Use {push,po...
128
  	pushfq_cfi
7effaa882   Jan Beulich   [PATCH] x86-64: F...
129
  	/*CFI_REL_OFFSET rflags,0*/
46db09d3f   Jan Beulich   x86-64: Slightly ...
130
  	movl	TI_sysenter_return+THREAD_INFO(%rsp,3*8-KERNEL_STACK_OFFSET),%r10d
7effaa882   Jan Beulich   [PATCH] x86-64: F...
131
  	CFI_REGISTER rip,r10
60cf637a1   Jan Beulich   x86: Use {push,po...
132
  	pushq_cfi $__USER32_CS
7effaa882   Jan Beulich   [PATCH] x86-64: F...
133
  	/*CFI_REL_OFFSET cs,0*/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
134
  	movl	%eax, %eax
60cf637a1   Jan Beulich   x86: Use {push,po...
135
  	pushq_cfi %r10
7effaa882   Jan Beulich   [PATCH] x86-64: F...
136
  	CFI_REL_OFFSET rip,0
60cf637a1   Jan Beulich   x86: Use {push,po...
137
  	pushq_cfi %rax
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
138
  	cld
cac0e0a78   Borislav Petkov   x86, asm: Flip SA...
139
  	SAVE_ARGS 0,1,0
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
140
141
   	/* no need to do an access_ok check here because rbp has been
   	   32bit zero extended */ 
295286a89   Jan Beulich   x86-64: slightly ...
142
  1:	movl	(%rbp),%ebp
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
143
144
145
   	.section __ex_table,"a"
   	.quad 1b,ia32_badarg
   	.previous	
46db09d3f   Jan Beulich   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   Jan Beulich   [PATCH] x86-64: F...
148
  	CFI_REMEMBER_STATE
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
149
  	jnz  sysenter_tracesys
36d001c70   H. Peter Anvin   x86-64, compat: T...
150
  	cmpq	$(IA32_NR_syscalls-1),%rax
67d53ea5a   Andi Kleen   [PATCH] x86_64: E...
151
  	ja	ia32_badsys
d4d671501   Roland McGrath   x86 ptrace: unify...
152
  sysenter_do_call:
295286a89   Jan Beulich   x86-64: slightly ...
153
  	IA32_ARG_FIXUP
5cbf1565f   Roland McGrath   x86_64 ia32 sysca...
154
  sysenter_dispatch:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
155
156
  	call	*ia32_sys_call_table(,%rax,8)
  	movq	%rax,RAX-ARGOFFSET(%rsp)
668041548   Jeremy Fitzhardinge   x86, 64-bit: ia32...
157
  	DISABLE_INTERRUPTS(CLBR_NONE)
2601e64d2   Ingo Molnar   [PATCH] lockdep: ...
158
  	TRACE_IRQS_OFF
46db09d3f   Jan Beulich   x86-64: Slightly ...
159
  	testl	$_TIF_ALLWORK_MASK,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET)
5cbf1565f   Roland McGrath   x86_64 ia32 sysca...
160
161
  	jnz	sysexit_audit
  sysexit_from_sys_call:
46db09d3f   Jan Beulich   x86-64: Slightly ...
162
  	andl    $~TS_COMPAT,TI_status+THREAD_INFO(%rsp,RIP-ARGOFFSET)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
163
164
  	/* clear IF, that popfq doesn't enable interrupts early */
  	andl  $~0x200,EFLAGS-R11(%rsp) 
36197c92a   Roland McGrath   x86 vDSO: ia32 sy...
165
166
  	movl	RIP-R11(%rsp),%edx		/* User %eip */
  	CFI_REGISTER rip,rdx
838feb475   Borislav Petkov   x86, asm: Flip RE...
167
  	RESTORE_ARGS 0,24,0,0,0,0
24e35800c   Jan Beulich   x86: Don't leak 6...
168
169
170
171
  	xorq	%r8,%r8
  	xorq	%r9,%r9
  	xorq	%r10,%r10
  	xorq	%r11,%r11
60cf637a1   Jan Beulich   x86: Use {push,po...
172
  	popfq_cfi
7effaa882   Jan Beulich   [PATCH] x86-64: F...
173
  	/*CFI_RESTORE rflags*/
60cf637a1   Jan Beulich   x86: Use {push,po...
174
  	popq_cfi %rcx				/* User %esp */
7effaa882   Jan Beulich   [PATCH] x86-64: F...
175
  	CFI_REGISTER rsp,rcx
2601e64d2   Ingo Molnar   [PATCH] lockdep: ...
176
  	TRACE_IRQS_ON
2be29982a   Jeremy Fitzhardinge   x86/paravirt: add...
177
  	ENABLE_INTERRUPTS_SYSEXIT32
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
178

5cbf1565f   Roland McGrath   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   H. Peter Anvin   x86-64, compat: T...
189
  	cmpq $(IA32_NR_syscalls-1),%rax
5cbf1565f   Roland McGrath   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   Jan Beulich   x86-64: Fix regis...
197
  	.macro auditsys_exit exit
46db09d3f   Jan Beulich   x86-64: Slightly ...
198
  	testl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET)
24e35800c   Jan Beulich   x86: Don't leak 6...
199
  	jnz ia32_ret_from_sys_call
5cbf1565f   Roland McGrath   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   Roland McGrath   x86_64 ia32 sysca...
208
  	movl RAX-ARGOFFSET(%rsp),%eax	/* reload syscall return value */
5cbf1565f   Roland McGrath   x86_64 ia32 sysca...
209
210
211
  	movl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),%edi
  	cli
  	TRACE_IRQS_OFF
46db09d3f   Jan Beulich   x86-64: Slightly ...
212
  	testl %edi,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET)
24e35800c   Jan Beulich   x86: Don't leak 6...
213
214
215
  	jz \exit
  	CLEAR_RREGS -ARGOFFSET
  	jmp int_with_check
5cbf1565f   Roland McGrath   x86_64 ia32 sysca...
216
217
218
  	.endm
  
  sysenter_auditsys:
7effaa882   Jan Beulich   [PATCH] x86-64: F...
219
  	CFI_RESTORE_STATE
5cbf1565f   Roland McGrath   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   Roland McGrath   x86_64 ia32 sysca...
229
  #ifdef CONFIG_AUDITSYSCALL
46db09d3f   Jan Beulich   x86-64: Slightly ...
230
  	testl	$(_TIF_WORK_SYSCALL_ENTRY & ~_TIF_SYSCALL_AUDIT),TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET)
5cbf1565f   Roland McGrath   x86_64 ia32 sysca...
231
232
  	jz	sysenter_auditsys
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
233
234
  	SAVE_REST
  	CLEAR_RREGS
48ee679a0   Roland McGrath   x86: ia32 ptrace ...
235
  	movq	$-ENOSYS,RAX(%rsp)/* ptrace can change this for a bad syscall */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
236
237
  	movq	%rsp,%rdi        /* &pt_regs -> arg1 */
  	call	syscall_trace_enter
176df2457   Andi Kleen   x86_64: Zero exte...
238
  	LOAD_ARGS32 ARGOFFSET  /* reload args from stack in case ptrace changed it */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
239
  	RESTORE_REST
36d001c70   H. Peter Anvin   x86-64, compat: T...
240
  	cmpq	$(IA32_NR_syscalls-1),%rax
48ee679a0   Roland McGrath   x86: ia32 ptrace ...
241
  	ja	int_ret_from_sys_call /* sysenter_tracesys has set RAX(%rsp) */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
242
243
  	jmp	sysenter_do_call
  	CFI_ENDPROC
4b787e0b8   Jan Beulich   [PATCH] x86_64: a...
244
  ENDPROC(ia32_sysenter_target)
1da177e4c   Linus Torvalds   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   Jan Beulich   [PATCH] x86_64: M...
267
  	CFI_STARTPROC32	simple
adf142369   Jan Beulich   [PATCH] i386/x86-...
268
  	CFI_SIGNAL_FRAME
9af45651f   Brian Gerst   x86-64: Move kern...
269
  	CFI_DEF_CFA	rsp,KERNEL_STACK_OFFSET
7effaa882   Jan Beulich   [PATCH] x86-64: F...
270
271
  	CFI_REGISTER	rip,rcx
  	/*CFI_REGISTER	rflags,r11*/
457da70ec   Jeremy Fitzhardinge   x86/paravirt: gro...
272
  	SWAPGS_UNSAFE_STACK
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
273
  	movl	%esp,%r8d
7effaa882   Jan Beulich   [PATCH] x86-64: F...
274
  	CFI_REGISTER	rsp,r8
9af45651f   Brian Gerst   x86-64: Move kern...
275
  	movq	PER_CPU_VAR(kernel_stack),%rsp
2601e64d2   Ingo Molnar   [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   Jeremy Fitzhardinge   x86, 64-bit: ia32...
280
  	ENABLE_INTERRUPTS(CLBR_NONE)
cac0e0a78   Borislav Petkov   x86, asm: Flip SA...
281
  	SAVE_ARGS 8,0,0
1da177e4c   Linus Torvalds   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   Jan Beulich   [PATCH] x86-64: F...
285
  	CFI_REL_OFFSET rip,RIP-ARGOFFSET
1da177e4c   Linus Torvalds   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   Jan Beulich   [PATCH] x86-64: F...
291
  	/*CFI_REL_OFFSET rflags,EFLAGS-ARGOFFSET*/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
292
  	movq	%r8,RSP-ARGOFFSET(%rsp)	
7effaa882   Jan Beulich   [PATCH] x86-64: F...
293
  	CFI_REL_OFFSET rsp,RSP-ARGOFFSET
1da177e4c   Linus Torvalds   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   Jan Beulich   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   Jan Beulich   [PATCH] x86-64: F...
303
  	CFI_REMEMBER_STATE
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
304
  	jnz   cstar_tracesys
36d001c70   H. Peter Anvin   x86-64, compat: T...
305
  	cmpq $IA32_NR_syscalls-1,%rax
67d53ea5a   Andi Kleen   [PATCH] x86_64: E...
306
  	ja  ia32_badsys
295286a89   Jan Beulich   x86-64: slightly ...
307
  cstar_do_call:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
308
  	IA32_ARG_FIXUP 1
5cbf1565f   Roland McGrath   x86_64 ia32 sysca...
309
  cstar_dispatch:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
310
311
  	call *ia32_sys_call_table(,%rax,8)
  	movq %rax,RAX-ARGOFFSET(%rsp)
668041548   Jeremy Fitzhardinge   x86, 64-bit: ia32...
312
  	DISABLE_INTERRUPTS(CLBR_NONE)
2601e64d2   Ingo Molnar   [PATCH] lockdep: ...
313
  	TRACE_IRQS_OFF
46db09d3f   Jan Beulich   x86-64: Slightly ...
314
  	testl $_TIF_ALLWORK_MASK,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET)
5cbf1565f   Roland McGrath   x86_64 ia32 sysca...
315
316
  	jnz sysretl_audit
  sysretl_from_sys_call:
46db09d3f   Jan Beulich   x86-64: Slightly ...
317
  	andl $~TS_COMPAT,TI_status+THREAD_INFO(%rsp,RIP-ARGOFFSET)
838feb475   Borislav Petkov   x86, asm: Flip RE...
318
  	RESTORE_ARGS 0,-ARG_SKIP,0,0,0
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
319
  	movl RIP-ARGOFFSET(%rsp),%ecx
7effaa882   Jan Beulich   [PATCH] x86-64: F...
320
  	CFI_REGISTER rip,rcx
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
321
  	movl EFLAGS-ARGOFFSET(%rsp),%r11d	
7effaa882   Jan Beulich   [PATCH] x86-64: F...
322
  	/*CFI_REGISTER rflags,r11*/
24e35800c   Jan Beulich   x86: Don't leak 6...
323
324
325
  	xorq	%r10,%r10
  	xorq	%r9,%r9
  	xorq	%r8,%r8
2601e64d2   Ingo Molnar   [PATCH] lockdep: ...
326
  	TRACE_IRQS_ON
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
327
  	movl RSP-ARGOFFSET(%rsp),%esp
7effaa882   Jan Beulich   [PATCH] x86-64: F...
328
  	CFI_RESTORE rsp
2be29982a   Jeremy Fitzhardinge   x86/paravirt: add...
329
  	USERGS_SYSRET32
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
330
  	
5cbf1565f   Roland McGrath   x86_64 ia32 sysca...
331
332
  #ifdef CONFIG_AUDITSYSCALL
  cstar_auditsys:
7effaa882   Jan Beulich   [PATCH] x86-64: F...
333
  	CFI_RESTORE_STATE
5cbf1565f   Roland McGrath   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   Jan Beulich   x86-64: Fix regis...
340
  	auditsys_exit sysretl_from_sys_call
5cbf1565f   Roland McGrath   x86_64 ia32 sysca...
341
342
343
344
  #endif
  
  cstar_tracesys:
  #ifdef CONFIG_AUDITSYSCALL
46db09d3f   Jan Beulich   x86-64: Slightly ...
345
  	testl $(_TIF_WORK_SYSCALL_ENTRY & ~_TIF_SYSCALL_AUDIT),TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET)
5cbf1565f   Roland McGrath   x86_64 ia32 sysca...
346
347
  	jz cstar_auditsys
  #endif
ecd744eec   Chuck Ebbert   x86 - 32-bit ptra...
348
  	xchgl %r9d,%ebp
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
349
  	SAVE_REST
24e35800c   Jan Beulich   x86: Don't leak 6...
350
  	CLEAR_RREGS 0, r9
48ee679a0   Roland McGrath   x86: ia32 ptrace ...
351
  	movq $-ENOSYS,RAX(%rsp)	/* ptrace can change this for a bad syscall */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
352
353
  	movq %rsp,%rdi        /* &pt_regs -> arg1 */
  	call syscall_trace_enter
295286a89   Jan Beulich   x86-64: slightly ...
354
  	LOAD_ARGS32 ARGOFFSET, 1  /* reload args from stack in case ptrace changed it */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
355
  	RESTORE_REST
ecd744eec   Chuck Ebbert   x86 - 32-bit ptra...
356
  	xchgl %ebp,%r9d
36d001c70   H. Peter Anvin   x86-64, compat: T...
357
  	cmpq $(IA32_NR_syscalls-1),%rax
48ee679a0   Roland McGrath   x86: ia32 ptrace ...
358
  	ja int_ret_from_sys_call /* cstar_tracesys has set RAX(%rsp) */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
359
  	jmp cstar_do_call
4b787e0b8   Jan Beulich   [PATCH] x86_64: a...
360
  END(ia32_cstar_target)
1da177e4c   Linus Torvalds   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   Jan Beulich   x86_64: ia32entry...
389
  	CFI_STARTPROC32	simple
adf142369   Jan Beulich   [PATCH] i386/x86-...
390
  	CFI_SIGNAL_FRAME
7effaa882   Jan Beulich   [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   Jeremy Fitzhardinge   x86_64: adjust ex...
397
  	PARAVIRT_ADJUST_EXCEPTION_FRAME
668041548   Jeremy Fitzhardinge   x86, 64-bit: ia32...
398
  	SWAPGS
2601e64d2   Ingo Molnar   [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   Jeremy Fitzhardinge   x86, 64-bit: ia32...
403
  	ENABLE_INTERRUPTS(CLBR_NONE)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
404
  	movl %eax,%eax
60cf637a1   Jan Beulich   x86: Use {push,po...
405
  	pushq_cfi %rax
1da177e4c   Linus Torvalds   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   Borislav Petkov   x86, asm: Flip SA...
409
  	SAVE_ARGS 0,1,0
46db09d3f   Jan Beulich   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   Linus Torvalds   Linux-2.6.12-rc2
412
  	jnz ia32_tracesys
36d001c70   H. Peter Anvin   x86-64, compat: T...
413
  	cmpq $(IA32_NR_syscalls-1),%rax
c09249f8d   Roland McGrath   x86-64: fix int $...
414
415
  	ja ia32_badsys
  ia32_do_call:
1da177e4c   Linus Torvalds   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   Jan Beulich   x86: Don't leak 6...
420
421
  ia32_ret_from_sys_call:
  	CLEAR_RREGS -ARGOFFSET
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
422
423
424
425
  	jmp int_ret_from_sys_call 
  
  ia32_tracesys:			 
  	SAVE_REST
cdc1793ef   Jan Beulich   x86_64: ia32entry...
426
  	CLEAR_RREGS
8ab32bb89   Roland McGrath   x86: ia32 ptrace ...
427
  	movq $-ENOSYS,RAX(%rsp)	/* ptrace can change this for a bad syscall */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
428
429
  	movq %rsp,%rdi        /* &pt_regs -> arg1 */
  	call syscall_trace_enter
176df2457   Andi Kleen   x86_64: Zero exte...
430
  	LOAD_ARGS32 ARGOFFSET  /* reload args from stack in case ptrace changed it */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
431
  	RESTORE_REST
36d001c70   H. Peter Anvin   x86-64, compat: T...
432
  	cmpq $(IA32_NR_syscalls-1),%rax
c09249f8d   Roland McGrath   x86-64: fix int $...
433
434
  	ja  int_ret_from_sys_call	/* ia32_tracesys has set RAX(%rsp) */
  	jmp ia32_do_call
4b787e0b8   Jan Beulich   [PATCH] x86_64: a...
435
  END(ia32_syscall)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
436
437
438
  
  ia32_badsys:
  	movq $0,ORIG_RAX-ARGOFFSET(%rsp)
24e35800c   Jan Beulich   x86: Don't leak 6...
439
440
  	movq $-ENOSYS,%rax
  	jmp ia32_sysret
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
441

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
442
443
444
  	CFI_ENDPROC
  	
  	.macro PTREGSCALL label, func, arg
f6b2bc847   Jan Beulich   x86-64: Cleanup s...
445
446
  	ALIGN
  GLOBAL(\label)
1da177e4c   Linus Torvalds   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   Jan Beulich   [PATCH] x86_64: M...
451
  	CFI_STARTPROC32
7effaa882   Jan Beulich   [PATCH] x86-64: F...
452

1da177e4c   Linus Torvalds   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   Linus Torvalds   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   Linus Torvalds   Linux-2.6.12-rc2
461

f6b2bc847   Jan Beulich   x86-64: Cleanup s...
462
463
  	ALIGN
  ia32_ptregs_common:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
464
  	popq %r11
2765130b0   Jan Beulich   [PATCH] x86_64: M...
465
466
  	CFI_ENDPROC
  	CFI_STARTPROC32	simple
adf142369   Jan Beulich   [PATCH] i386/x86-...
467
  	CFI_SIGNAL_FRAME
2765130b0   Jan Beulich   [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   Linus Torvalds   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   Jan Beulich   [PATCH] x86_64: a...
484
  END(ia32_ptregs_common)