diff options
Diffstat (limited to 'arch/sparc/kernel/syscalls.S')
| -rw-r--r-- | arch/sparc/kernel/syscalls.S | 102 | 
1 files changed, 51 insertions, 51 deletions
diff --git a/arch/sparc/kernel/syscalls.S b/arch/sparc/kernel/syscalls.S index 1d7e274f3f2..33a17e7b3cc 100644 --- a/arch/sparc/kernel/syscalls.S +++ b/arch/sparc/kernel/syscalls.S @@ -1,23 +1,19 @@  	/* SunOS's execv() call only specifies the argv argument, the  	 * environment settings are the same as the calling processes.  	 */ -sys_execve: -	sethi	%hi(sparc_execve), %g1 -	ba,pt	%xcc, execve_merge -	 or	%g1, %lo(sparc_execve), %g1 +sys64_execve: +	set	sys_execve, %g1 +	jmpl	%g1, %g0 +	 flushw  #ifdef CONFIG_COMPAT  sunos_execv: -	stx	%g0, [%sp + PTREGS_OFF + PT_V9_I2] +	mov	%g0, %o2  sys32_execve: -	sethi	%hi(sparc32_execve), %g1 -	or	%g1, %lo(sparc32_execve), %g1 -#endif - -execve_merge: -	flushw +	set	compat_sys_execve, %g1  	jmpl	%g1, %g0 -	 add	%sp, PTREGS_OFF, %o0 +	 flushw +#endif  	.align	32  sys_sparc_pipe: @@ -29,16 +25,10 @@ sys_nis_syscall:  sys_memory_ordering:  	ba,pt	%xcc, sparc_memory_ordering  	 add	%sp, PTREGS_OFF, %o1 -sys_sigaltstack: -	ba,pt	%xcc, do_sigaltstack -	 add	%i6, STACK_BIAS, %o2  #ifdef CONFIG_COMPAT  sys32_sigstack:  	ba,pt	%xcc, do_sys32_sigstack  	 mov	%i6, %o2 -sys32_sigaltstack: -	ba,pt	%xcc, do_sys32_sigaltstack -	 mov	%i6, %o2  #endif  	.align	32  #ifdef CONFIG_COMPAT @@ -62,7 +52,7 @@ sys32_rt_sigreturn:  #endif  	.align	32  1:	ldx	[%g6 + TI_FLAGS], %l5 -	andcc	%l5, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT), %g0 +	andcc	%l5, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT|_TIF_NOHZ), %g0  	be,pt	%icc, rtrap  	 nop  	call	syscall_trace_leave @@ -108,20 +98,35 @@ sys_clone:  	ba,pt	%xcc, sparc_do_fork  	 add	%sp, PTREGS_OFF, %o2 -	.globl	ret_from_syscall -ret_from_syscall: +	.globl	ret_from_fork +ret_from_fork:  	/* Clear current_thread_info()->new_child. */  	stb	%g0, [%g6 + TI_NEW_CHILD] -	ldx	[%g6 + TI_FLAGS], %l0  	call	schedule_tail  	 mov	%g7, %o0 +	ldx	[%sp + PTREGS_OFF + PT_V9_I0], %o0 +	brnz,pt	%o0, ret_sys_call +	 ldx	[%g6 + TI_FLAGS], %l0 +	ldx	[%sp + PTREGS_OFF + PT_V9_G1], %l1 +	call	%l1 +	 ldx	[%sp + PTREGS_OFF + PT_V9_G2], %o0  	ba,pt	%xcc, ret_sys_call -	 ldx	[%sp + PTREGS_OFF + PT_V9_I0], %o0 +	 mov	0, %o0 + +	.globl	sparc_exit_group +	.type	sparc_exit_group,#function +sparc_exit_group: +	sethi	%hi(sys_exit_group), %g7 +	ba,pt	%xcc, 1f +	 or	%g7, %lo(sys_exit_group), %g7 +	.size	sparc_exit_group,.-sparc_exit_group  	.globl	sparc_exit  	.type	sparc_exit,#function  sparc_exit: -	rdpr	%pstate, %g2 +	sethi	%hi(sys_exit), %g7 +	or	%g7, %lo(sys_exit), %g7 +1:	rdpr	%pstate, %g2  	wrpr	%g2, PSTATE_IE, %pstate  	rdpr	%otherwin, %g1  	rdpr	%cansave, %g3 @@ -129,7 +134,7 @@ sparc_exit:  	wrpr	%g3, 0x0, %cansave  	wrpr	%g0, 0x0, %otherwin  	wrpr	%g2, 0x0, %pstate -	ba,pt	%xcc, sys_exit +	jmpl	%g7, %g0  	 stb	%g0, [%g6 + TI_WSAVED]  	.size	sparc_exit,.-sparc_exit @@ -147,7 +152,7 @@ linux_syscall_trace32:  	srl	%i4, 0, %o4  	srl	%i1, 0, %o1  	srl	%i2, 0, %o2 -	ba,pt	%xcc, 2f +	ba,pt	%xcc, 5f  	 srl	%i3, 0, %o3  linux_syscall_trace: @@ -177,14 +182,15 @@ linux_sparc_syscall32:  	srl	%i1, 0, %o1				! IEU0	Group  	ldx	[%g6 + TI_FLAGS], %l0		! Load -	srl	%i5, 0, %o5				! IEU1 +	srl	%i3, 0, %o3				! IEU0  	srl	%i2, 0, %o2				! IEU0	Group -	andcc	%l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT), %g0 +	andcc	%l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT|_TIF_NOHZ), %g0  	bne,pn	%icc, linux_syscall_trace32		! CTI  	 mov	%i0, %l5				! IEU1 -	call	%l7					! CTI	Group brk forced -	 srl	%i3, 0, %o3				! IEU0 -	ba,a,pt	%xcc, 3f +5:	call	%l7					! CTI	Group brk forced +	 srl	%i5, 0, %o5				! IEU1 +	ba,pt	%xcc, 3f +	 sra	%o0, 0, %o0  	/* Linux native system calls enter here... */  	.align	32 @@ -202,7 +208,7 @@ linux_sparc_syscall:  	mov	%i3, %o3				! IEU1  	mov	%i4, %o4				! IEU0	Group -	andcc	%l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT), %g0 +	andcc	%l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT|_TIF_NOHZ), %g0  	bne,pn	%icc, linux_syscall_trace		! CTI	Group  	 mov	%i0, %l5				! IEU0  2:	call	%l7					! CTI	Group brk forced @@ -212,24 +218,18 @@ linux_sparc_syscall:  3:	stx	%o0, [%sp + PTREGS_OFF + PT_V9_I0]  ret_sys_call:  	ldx	[%sp + PTREGS_OFF + PT_V9_TSTATE], %g3 -	ldx	[%sp + PTREGS_OFF + PT_V9_TNPC], %l1 ! pc = npc -	sra	%o0, 0, %o0  	mov	%ulo(TSTATE_XCARRY | TSTATE_ICARRY), %g2  	sllx	%g2, 32, %g2 -	/* Check if force_successful_syscall_return() -	 * was invoked. -	 */ -	ldub	[%g6 + TI_SYS_NOERROR], %l2 -	brnz,a,pn %l2, 80f -	 stb	%g0, [%g6 + TI_SYS_NOERROR] -  	cmp	%o0, -ERESTART_RESTARTBLOCK  	bgeu,pn	%xcc, 1f -	 andcc	%l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT), %l6 -80: +	 andcc	%l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT|_TIF_NOHZ), %g0 +	ldx	[%sp + PTREGS_OFF + PT_V9_TNPC], %l1 ! pc = npc + +2:  	/* System call success, clear Carry condition code. */  	andn	%g3, %g2, %g3 +3:  	stx	%g3, [%sp + PTREGS_OFF + PT_V9_TSTATE]	  	bne,pn	%icc, linux_syscall_trace2  	 add	%l1, 0x4, %l2			! npc = npc+4 @@ -238,20 +238,20 @@ ret_sys_call:  	 stx	%l2, [%sp + PTREGS_OFF + PT_V9_TNPC]  1: +	/* Check if force_successful_syscall_return() +	 * was invoked. +	 */ +	ldub	[%g6 + TI_SYS_NOERROR], %l2 +	brnz,pn %l2, 2b +	 ldx	[%sp + PTREGS_OFF + PT_V9_TNPC], %l1 ! pc = npc  	/* System call failure, set Carry condition code.  	 * Also, get abs(errno) to return to the process.  	 */ -	andcc	%l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT), %l6	  	sub	%g0, %o0, %o0 -	or	%g3, %g2, %g3  	stx	%o0, [%sp + PTREGS_OFF + PT_V9_I0] -	stx	%g3, [%sp + PTREGS_OFF + PT_V9_TSTATE] -	bne,pn	%icc, linux_syscall_trace2 -	 add	%l1, 0x4, %l2			! npc = npc+4 -	stx	%l1, [%sp + PTREGS_OFF + PT_V9_TPC] +	ba,pt	%xcc, 3b +	 or	%g3, %g2, %g3 -	b,pt	%xcc, rtrap -	 stx	%l2, [%sp + PTREGS_OFF + PT_V9_TNPC]  linux_syscall_trace2:  	call	syscall_trace_leave  	 add	%sp, PTREGS_OFF, %o0  | 
