diff options
Diffstat (limited to 'arch/x86/ia32/ia32entry.S')
| -rw-r--r-- | arch/x86/ia32/ia32entry.S | 43 | 
1 files changed, 19 insertions, 24 deletions
diff --git a/arch/x86/ia32/ia32entry.S b/arch/x86/ia32/ia32entry.S index a6253ec1b28..3e274564f6b 100644 --- a/arch/x86/ia32/ia32entry.S +++ b/arch/x86/ia32/ia32entry.S @@ -134,7 +134,7 @@ ENTRY(ia32_sysenter_target)  	CFI_REL_OFFSET rsp,0  	pushfq_cfi  	/*CFI_REL_OFFSET rflags,0*/ -	movl	8*3-THREAD_SIZE+TI_sysenter_return(%rsp), %r10d +	movl	TI_sysenter_return+THREAD_INFO(%rsp,3*8-KERNEL_STACK_OFFSET),%r10d  	CFI_REGISTER rip,r10  	pushq_cfi $__USER32_CS  	/*CFI_REL_OFFSET cs,0*/ @@ -150,9 +150,8 @@ ENTRY(ia32_sysenter_target)   	.section __ex_table,"a"   	.quad 1b,ia32_badarg   	.previous	 -	GET_THREAD_INFO(%r10) -	orl    $TS_COMPAT,TI_status(%r10) -	testl  $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%r10) +	orl     $TS_COMPAT,TI_status+THREAD_INFO(%rsp,RIP-ARGOFFSET) +	testl   $_TIF_WORK_SYSCALL_ENTRY,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET)  	CFI_REMEMBER_STATE  	jnz  sysenter_tracesys  	cmpq	$(IA32_NR_syscalls-1),%rax @@ -162,13 +161,12 @@ sysenter_do_call:  sysenter_dispatch:  	call	*ia32_sys_call_table(,%rax,8)  	movq	%rax,RAX-ARGOFFSET(%rsp) -	GET_THREAD_INFO(%r10)  	DISABLE_INTERRUPTS(CLBR_NONE)  	TRACE_IRQS_OFF -	testl	$_TIF_ALLWORK_MASK,TI_flags(%r10) +	testl	$_TIF_ALLWORK_MASK,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET)  	jnz	sysexit_audit  sysexit_from_sys_call: -	andl    $~TS_COMPAT,TI_status(%r10) +	andl    $~TS_COMPAT,TI_status+THREAD_INFO(%rsp,RIP-ARGOFFSET)  	/* clear IF, that popfq doesn't enable interrupts early */  	andl  $~0x200,EFLAGS-R11(%rsp)   	movl	RIP-R11(%rsp),%edx		/* User %eip */ @@ -205,7 +203,7 @@ sysexit_from_sys_call:  	.endm  	.macro auditsys_exit exit -	testl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),TI_flags(%r10) +	testl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET)  	jnz ia32_ret_from_sys_call  	TRACE_IRQS_ON  	sti @@ -215,12 +213,11 @@ sysexit_from_sys_call:  	movzbl %al,%edi		/* zero-extend that into %edi */  	inc %edi /* first arg, 0->1(AUDITSC_SUCCESS), 1->2(AUDITSC_FAILURE) */  	call audit_syscall_exit -	GET_THREAD_INFO(%r10)  	movl RAX-ARGOFFSET(%rsp),%eax	/* reload syscall return value */  	movl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),%edi  	cli  	TRACE_IRQS_OFF -	testl %edi,TI_flags(%r10) +	testl %edi,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET)  	jz \exit  	CLEAR_RREGS -ARGOFFSET  	jmp int_with_check @@ -238,7 +235,7 @@ sysexit_audit:  sysenter_tracesys:  #ifdef CONFIG_AUDITSYSCALL -	testl	$(_TIF_WORK_SYSCALL_ENTRY & ~_TIF_SYSCALL_AUDIT),TI_flags(%r10) +	testl	$(_TIF_WORK_SYSCALL_ENTRY & ~_TIF_SYSCALL_AUDIT),TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET)  	jz	sysenter_auditsys  #endif  	SAVE_REST @@ -309,9 +306,8 @@ ENTRY(ia32_cstar_target)  	.section __ex_table,"a"  	.quad 1b,ia32_badarg  	.previous	 -	GET_THREAD_INFO(%r10) -	orl   $TS_COMPAT,TI_status(%r10) -	testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%r10) +	orl     $TS_COMPAT,TI_status+THREAD_INFO(%rsp,RIP-ARGOFFSET) +	testl   $_TIF_WORK_SYSCALL_ENTRY,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET)  	CFI_REMEMBER_STATE  	jnz   cstar_tracesys  	cmpq $IA32_NR_syscalls-1,%rax @@ -321,13 +317,12 @@ cstar_do_call:  cstar_dispatch:  	call *ia32_sys_call_table(,%rax,8)  	movq %rax,RAX-ARGOFFSET(%rsp) -	GET_THREAD_INFO(%r10)  	DISABLE_INTERRUPTS(CLBR_NONE)  	TRACE_IRQS_OFF -	testl $_TIF_ALLWORK_MASK,TI_flags(%r10) +	testl $_TIF_ALLWORK_MASK,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET)  	jnz sysretl_audit  sysretl_from_sys_call: -	andl $~TS_COMPAT,TI_status(%r10) +	andl $~TS_COMPAT,TI_status+THREAD_INFO(%rsp,RIP-ARGOFFSET)  	RESTORE_ARGS 0,-ARG_SKIP,0,0,0  	movl RIP-ARGOFFSET(%rsp),%ecx  	CFI_REGISTER rip,rcx @@ -355,7 +350,7 @@ sysretl_audit:  cstar_tracesys:  #ifdef CONFIG_AUDITSYSCALL -	testl $(_TIF_WORK_SYSCALL_ENTRY & ~_TIF_SYSCALL_AUDIT),TI_flags(%r10) +	testl $(_TIF_WORK_SYSCALL_ENTRY & ~_TIF_SYSCALL_AUDIT),TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET)  	jz cstar_auditsys  #endif  	xchgl %r9d,%ebp @@ -420,9 +415,8 @@ ENTRY(ia32_syscall)  	/* note the registers are not zero extended to the sf.  	   this could be a problem. */  	SAVE_ARGS 0,1,0 -	GET_THREAD_INFO(%r10) -	orl   $TS_COMPAT,TI_status(%r10) -	testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%r10) +	orl $TS_COMPAT,TI_status+THREAD_INFO(%rsp,RIP-ARGOFFSET) +	testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET)  	jnz ia32_tracesys  	cmpq $(IA32_NR_syscalls-1),%rax  	ja ia32_badsys @@ -459,8 +453,8 @@ quiet_ni_syscall:  	CFI_ENDPROC  	.macro PTREGSCALL label, func, arg -	.globl \label -\label: +	ALIGN +GLOBAL(\label)  	leaq \func(%rip),%rax  	leaq -ARGOFFSET+8(%rsp),\arg	/* 8 for return address */  	jmp  ia32_ptregs_common	 @@ -477,7 +471,8 @@ quiet_ni_syscall:  	PTREGSCALL stub32_vfork, sys_vfork, %rdi  	PTREGSCALL stub32_iopl, sys_iopl, %rsi -ENTRY(ia32_ptregs_common) +	ALIGN +ia32_ptregs_common:  	popq %r11  	CFI_ENDPROC  	CFI_STARTPROC32	simple  |