ia32entry.S 13.2 KB
Newer Older
L
Linus Torvalds 已提交
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>
9
#include <asm/asm-offsets.h>
L
Linus Torvalds 已提交
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>
15
#include <asm/irqflags.h>
L
Linus Torvalds 已提交
16
#include <linux/linkage.h>
17
#include <linux/err.h>
L
Linus Torvalds 已提交
18

19 20 21 22 23 24
/* 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
25 26
#define sysexit_audit ia32_ret_from_sys_call
#define sysretl_audit ia32_ret_from_sys_call
27 28
#endif

J
Jiri Olsa 已提交
29 30
	.section .entry.text, "ax"

L
Linus Torvalds 已提交
31 32 33 34 35 36 37 38 39 40 41 42
	.macro IA32_ARG_FIXUP noebp=0
	movl	%edi,%r8d
	.if \noebp
	.else
	movl	%ebp,%r9d
	.endif
	xchg	%ecx,%esi
	movl	%ebx,%edi
	movl	%edx,%edx	/* zero extension */
	.endm 

	/* clobbers %eax */	
43
	.macro  CLEAR_RREGS offset=0, _r9=rax
L
Linus Torvalds 已提交
44
	xorl 	%eax,%eax
45 46 47 48
	movq	%rax,\offset+R11(%rsp)
	movq	%rax,\offset+R10(%rsp)
	movq	%\_r9,\offset+R9(%rsp)
	movq	%rax,\offset+R8(%rsp)
L
Linus Torvalds 已提交
49 50
	.endm

51 52 53
	/*
	 * Reload arg registers from stack in case ptrace changed them.
	 * We don't reload %eax because syscall_trace_enter() returned
54 55 56 57 58 59
	 * 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.
60
	 */
61 62
	.macro LOAD_ARGS32 offset, _r9=0
	.if \_r9
63
	movl \offset+16(%rsp),%r9d
64
	.endif
65 66 67 68
	movl \offset+40(%rsp),%ecx
	movl \offset+48(%rsp),%edx
	movl \offset+56(%rsp),%esi
	movl \offset+64(%rsp),%edi
69
	movl %eax,%eax			/* zero extension */
70 71
	.endm
	
72 73 74 75 76 77 78 79 80 81 82 83
	.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

84 85 86 87 88 89 90 91 92 93 94 95 96
#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

L
Linus Torvalds 已提交
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
/*
 * 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)
117
	CFI_STARTPROC32	simple
118
	CFI_SIGNAL_FRAME
119 120
	CFI_DEF_CFA	rsp,0
	CFI_REGISTER	rsp,rbp
121
	SWAPGS_UNSAFE_STACK
122 123
	movq	PER_CPU_VAR(kernel_stack), %rsp
	addq	$(KERNEL_STACK_OFFSET),%rsp
124 125 126 127
	/*
	 * No need to follow this irqs on/off section: the syscall
	 * disabled irqs, here we enable it straight after entry:
	 */
128
	ENABLE_INTERRUPTS(CLBR_NONE)
L
Linus Torvalds 已提交
129
 	movl	%ebp,%ebp		/* zero extension */
130
	pushq_cfi $__USER32_DS
131
	/*CFI_REL_OFFSET ss,0*/
132
	pushq_cfi %rbp
133
	CFI_REL_OFFSET rsp,0
134
	pushfq_cfi
135
	/*CFI_REL_OFFSET rflags,0*/
136
	movl	TI_sysenter_return+THREAD_INFO(%rsp,3*8-KERNEL_STACK_OFFSET),%r10d
137
	CFI_REGISTER rip,r10
138
	pushq_cfi $__USER32_CS
139
	/*CFI_REL_OFFSET cs,0*/
L
Linus Torvalds 已提交
140
	movl	%eax, %eax
141
	pushq_cfi %r10
142
	CFI_REL_OFFSET rip,0
143
	pushq_cfi %rax
L
Linus Torvalds 已提交
144
	cld
145
	SAVE_ARGS 0,1,0
L
Linus Torvalds 已提交
146 147
 	/* no need to do an access_ok check here because rbp has been
 	   32bit zero extended */ 
148
1:	movl	(%rbp),%ebp
L
Linus Torvalds 已提交
149 150 151
 	.section __ex_table,"a"
 	.quad 1b,ia32_badarg
 	.previous	
152 153
	orl     $TS_COMPAT,TI_status+THREAD_INFO(%rsp,RIP-ARGOFFSET)
	testl   $_TIF_WORK_SYSCALL_ENTRY,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET)
154
	CFI_REMEMBER_STATE
L
Linus Torvalds 已提交
155
	jnz  sysenter_tracesys
156
	cmpq	$(IA32_NR_syscalls-1),%rax
157
	ja	ia32_badsys
158
sysenter_do_call:
159
	IA32_ARG_FIXUP
160
sysenter_dispatch:
L
Linus Torvalds 已提交
161 162
	call	*ia32_sys_call_table(,%rax,8)
	movq	%rax,RAX-ARGOFFSET(%rsp)
163
	DISABLE_INTERRUPTS(CLBR_NONE)
164
	TRACE_IRQS_OFF
165
	testl	$_TIF_ALLWORK_MASK,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET)
166 167
	jnz	sysexit_audit
sysexit_from_sys_call:
168
	andl    $~TS_COMPAT,TI_status+THREAD_INFO(%rsp,RIP-ARGOFFSET)
L
Linus Torvalds 已提交
169 170
	/* clear IF, that popfq doesn't enable interrupts early */
	andl  $~0x200,EFLAGS-R11(%rsp) 
R
Roland McGrath 已提交
171 172
	movl	RIP-R11(%rsp),%edx		/* User %eip */
	CFI_REGISTER rip,rdx
173
	RESTORE_ARGS 0,24,0,0,0,0
174 175 176 177
	xorq	%r8,%r8
	xorq	%r9,%r9
	xorq	%r10,%r10
	xorq	%r11,%r11
178
	popfq_cfi
179
	/*CFI_RESTORE rflags*/
180
	popq_cfi %rcx				/* User %esp */
181
	CFI_REGISTER rsp,rcx
182
	TRACE_IRQS_ON
183
	ENABLE_INTERRUPTS_SYSEXIT32
L
Linus Torvalds 已提交
184

185 186 187 188 189 190 191 192
#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 */
193
	call __audit_syscall_entry
194
	movl RAX-ARGOFFSET(%rsp),%eax	/* reload syscall number */
195
	cmpq $(IA32_NR_syscalls-1),%rax
196 197 198 199 200 201 202 203
	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

204
	.macro auditsys_exit exit
205
	testl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET)
206
	jnz ia32_ret_from_sys_call
207 208 209
	TRACE_IRQS_ON
	sti
	movl %eax,%esi		/* second arg, syscall return value */
210
	cmpl $-MAX_ERRNO,%eax	/* is it an error ? */
211 212 213
	jbe 1f
	movslq %eax, %rsi	/* if error sign extend to 64 bits */
1:	setbe %al		/* 1 if error, 0 if not */
214
	movzbl %al,%edi		/* zero-extend that into %edi */
215 216
	call __audit_syscall_exit
	movq RAX-ARGOFFSET(%rsp),%rax	/* reload syscall return value */
217 218 219
	movl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),%edi
	cli
	TRACE_IRQS_OFF
220
	testl %edi,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET)
221 222 223
	jz \exit
	CLEAR_RREGS -ARGOFFSET
	jmp int_with_check
224 225 226
	.endm

sysenter_auditsys:
227
	CFI_RESTORE_STATE
228 229 230 231 232 233 234 235 236 237
	auditsys_entry_common
	movl %ebp,%r9d			/* reload 6th syscall arg */
	jmp sysenter_dispatch

sysexit_audit:
	auditsys_exit sysexit_from_sys_call
#endif

sysenter_tracesys:
#ifdef CONFIG_AUDITSYSCALL
238
	testl	$(_TIF_WORK_SYSCALL_ENTRY & ~_TIF_SYSCALL_AUDIT),TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET)
239 240
	jz	sysenter_auditsys
#endif
L
Linus Torvalds 已提交
241 242
	SAVE_REST
	CLEAR_RREGS
243
	movq	$-ENOSYS,RAX(%rsp)/* ptrace can change this for a bad syscall */
L
Linus Torvalds 已提交
244 245
	movq	%rsp,%rdi        /* &pt_regs -> arg1 */
	call	syscall_trace_enter
246
	LOAD_ARGS32 ARGOFFSET  /* reload args from stack in case ptrace changed it */
L
Linus Torvalds 已提交
247
	RESTORE_REST
248
	cmpq	$(IA32_NR_syscalls-1),%rax
249
	ja	int_ret_from_sys_call /* sysenter_tracesys has set RAX(%rsp) */
L
Linus Torvalds 已提交
250 251
	jmp	sysenter_do_call
	CFI_ENDPROC
252
ENDPROC(ia32_sysenter_target)
L
Linus Torvalds 已提交
253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274

/*
 * 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)
275
	CFI_STARTPROC32	simple
276
	CFI_SIGNAL_FRAME
277
	CFI_DEF_CFA	rsp,KERNEL_STACK_OFFSET
278 279
	CFI_REGISTER	rip,rcx
	/*CFI_REGISTER	rflags,r11*/
280
	SWAPGS_UNSAFE_STACK
L
Linus Torvalds 已提交
281
	movl	%esp,%r8d
282
	CFI_REGISTER	rsp,r8
283
	movq	PER_CPU_VAR(kernel_stack),%rsp
284 285 286 287
	/*
	 * No need to follow this irqs on/off section: the syscall
	 * disabled irqs and here we enable it straight after entry:
	 */
288
	ENABLE_INTERRUPTS(CLBR_NONE)
289
	SAVE_ARGS 8,0,0
L
Linus Torvalds 已提交
290 291 292
	movl 	%eax,%eax	/* zero extension */
	movq	%rax,ORIG_RAX-ARGOFFSET(%rsp)
	movq	%rcx,RIP-ARGOFFSET(%rsp)
293
	CFI_REL_OFFSET rip,RIP-ARGOFFSET
L
Linus Torvalds 已提交
294 295 296 297 298
	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)
299
	/*CFI_REL_OFFSET rflags,EFLAGS-ARGOFFSET*/
L
Linus Torvalds 已提交
300
	movq	%r8,RSP-ARGOFFSET(%rsp)	
301
	CFI_REL_OFFSET rsp,RSP-ARGOFFSET
L
Linus Torvalds 已提交
302 303 304 305 306 307 308
	/* 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	
309 310
	orl     $TS_COMPAT,TI_status+THREAD_INFO(%rsp,RIP-ARGOFFSET)
	testl   $_TIF_WORK_SYSCALL_ENTRY,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET)
311
	CFI_REMEMBER_STATE
L
Linus Torvalds 已提交
312
	jnz   cstar_tracesys
313
	cmpq $IA32_NR_syscalls-1,%rax
314
	ja  ia32_badsys
315
cstar_do_call:
L
Linus Torvalds 已提交
316
	IA32_ARG_FIXUP 1
317
cstar_dispatch:
L
Linus Torvalds 已提交
318 319
	call *ia32_sys_call_table(,%rax,8)
	movq %rax,RAX-ARGOFFSET(%rsp)
320
	DISABLE_INTERRUPTS(CLBR_NONE)
321
	TRACE_IRQS_OFF
322
	testl $_TIF_ALLWORK_MASK,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET)
323 324
	jnz sysretl_audit
sysretl_from_sys_call:
325
	andl $~TS_COMPAT,TI_status+THREAD_INFO(%rsp,RIP-ARGOFFSET)
326
	RESTORE_ARGS 0,-ARG_SKIP,0,0,0
L
Linus Torvalds 已提交
327
	movl RIP-ARGOFFSET(%rsp),%ecx
328
	CFI_REGISTER rip,rcx
L
Linus Torvalds 已提交
329
	movl EFLAGS-ARGOFFSET(%rsp),%r11d	
330
	/*CFI_REGISTER rflags,r11*/
331 332 333
	xorq	%r10,%r10
	xorq	%r9,%r9
	xorq	%r8,%r8
334
	TRACE_IRQS_ON
L
Linus Torvalds 已提交
335
	movl RSP-ARGOFFSET(%rsp),%esp
336
	CFI_RESTORE rsp
337
	USERGS_SYSRET32
L
Linus Torvalds 已提交
338
	
339 340
#ifdef CONFIG_AUDITSYSCALL
cstar_auditsys:
341
	CFI_RESTORE_STATE
342 343 344 345 346 347
	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:
348
	auditsys_exit sysretl_from_sys_call
349 350 351 352
#endif

cstar_tracesys:
#ifdef CONFIG_AUDITSYSCALL
353
	testl $(_TIF_WORK_SYSCALL_ENTRY & ~_TIF_SYSCALL_AUDIT),TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET)
354 355
	jz cstar_auditsys
#endif
356
	xchgl %r9d,%ebp
L
Linus Torvalds 已提交
357
	SAVE_REST
358
	CLEAR_RREGS 0, r9
359
	movq $-ENOSYS,RAX(%rsp)	/* ptrace can change this for a bad syscall */
L
Linus Torvalds 已提交
360 361
	movq %rsp,%rdi        /* &pt_regs -> arg1 */
	call syscall_trace_enter
362
	LOAD_ARGS32 ARGOFFSET, 1  /* reload args from stack in case ptrace changed it */
L
Linus Torvalds 已提交
363
	RESTORE_REST
364
	xchgl %ebp,%r9d
365
	cmpq $(IA32_NR_syscalls-1),%rax
366
	ja int_ret_from_sys_call /* cstar_tracesys has set RAX(%rsp) */
L
Linus Torvalds 已提交
367
	jmp cstar_do_call
368
END(ia32_cstar_target)
L
Linus Torvalds 已提交
369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396
				
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)
J
Jan Beulich 已提交
397
	CFI_STARTPROC32	simple
398
	CFI_SIGNAL_FRAME
399 400 401 402 403 404
	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
405
	PARAVIRT_ADJUST_EXCEPTION_FRAME
406
	SWAPGS
407 408 409 410
	/*
	 * No need to follow this irqs on/off section: the syscall
	 * disabled irqs and here we enable it straight after entry:
	 */
411
	ENABLE_INTERRUPTS(CLBR_NONE)
L
Linus Torvalds 已提交
412
	movl %eax,%eax
413
	pushq_cfi %rax
L
Linus Torvalds 已提交
414 415 416
	cld
	/* note the registers are not zero extended to the sf.
	   this could be a problem. */
417
	SAVE_ARGS 0,1,0
418 419
	orl $TS_COMPAT,TI_status+THREAD_INFO(%rsp,RIP-ARGOFFSET)
	testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET)
L
Linus Torvalds 已提交
420
	jnz ia32_tracesys
421
	cmpq $(IA32_NR_syscalls-1),%rax
422 423
	ja ia32_badsys
ia32_do_call:
L
Linus Torvalds 已提交
424 425 426 427
	IA32_ARG_FIXUP
	call *ia32_sys_call_table(,%rax,8) # xxx: rip relative
ia32_sysret:
	movq %rax,RAX-ARGOFFSET(%rsp)
428 429
ia32_ret_from_sys_call:
	CLEAR_RREGS -ARGOFFSET
L
Linus Torvalds 已提交
430 431 432 433
	jmp int_ret_from_sys_call 

ia32_tracesys:			 
	SAVE_REST
J
Jan Beulich 已提交
434
	CLEAR_RREGS
R
Roland McGrath 已提交
435
	movq $-ENOSYS,RAX(%rsp)	/* ptrace can change this for a bad syscall */
L
Linus Torvalds 已提交
436 437
	movq %rsp,%rdi        /* &pt_regs -> arg1 */
	call syscall_trace_enter
438
	LOAD_ARGS32 ARGOFFSET  /* reload args from stack in case ptrace changed it */
L
Linus Torvalds 已提交
439
	RESTORE_REST
440
	cmpq $(IA32_NR_syscalls-1),%rax
441 442
	ja  int_ret_from_sys_call	/* ia32_tracesys has set RAX(%rsp) */
	jmp ia32_do_call
443
END(ia32_syscall)
L
Linus Torvalds 已提交
444 445 446

ia32_badsys:
	movq $0,ORIG_RAX-ARGOFFSET(%rsp)
447 448
	movq $-ENOSYS,%rax
	jmp ia32_sysret
L
Linus Torvalds 已提交
449 450 451 452

	CFI_ENDPROC
	
	.macro PTREGSCALL label, func, arg
453 454
	ALIGN
GLOBAL(\label)
L
Linus Torvalds 已提交
455 456 457 458 459
	leaq \func(%rip),%rax
	leaq -ARGOFFSET+8(%rsp),\arg	/* 8 for return address */
	jmp  ia32_ptregs_common	
	.endm

460
	CFI_STARTPROC32
461

L
Linus Torvalds 已提交
462 463 464 465 466 467 468 469 470
	PTREGSCALL stub32_rt_sigreturn, sys32_rt_sigreturn, %rdi
	PTREGSCALL stub32_sigreturn, sys32_sigreturn, %rdi
	PTREGSCALL stub32_sigaltstack, sys32_sigaltstack, %rdx
	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

471 472
	ALIGN
ia32_ptregs_common:
L
Linus Torvalds 已提交
473
	popq %r11
474 475
	CFI_ENDPROC
	CFI_STARTPROC32	simple
476
	CFI_SIGNAL_FRAME
477 478 479 480 481 482 483 484 485 486 487
	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*/
L
Linus Torvalds 已提交
488 489 490 491 492
	SAVE_REST
	call *%rax
	RESTORE_REST
	jmp  ia32_sysret	/* misbalances the return cache */
	CFI_ENDPROC
493
END(ia32_ptregs_common)