sparc64: fix ptrace interaction with force_successful_syscall_return()
we want syscall_trace_leave() called on exit from any syscall; skipping its call in case we'd done force_successful_syscall_return() is broken... Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
f88620b9c5
Коммит
55c2770e41
|
@ -212,24 +212,20 @@ linux_sparc_syscall:
|
||||||
3: stx %o0, [%sp + PTREGS_OFF + PT_V9_I0]
|
3: stx %o0, [%sp + PTREGS_OFF + PT_V9_I0]
|
||||||
ret_sys_call:
|
ret_sys_call:
|
||||||
ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %g3
|
ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %g3
|
||||||
ldx [%sp + PTREGS_OFF + PT_V9_TNPC], %l1 ! pc = npc
|
|
||||||
sra %o0, 0, %o0
|
sra %o0, 0, %o0
|
||||||
mov %ulo(TSTATE_XCARRY | TSTATE_ICARRY), %g2
|
mov %ulo(TSTATE_XCARRY | TSTATE_ICARRY), %g2
|
||||||
sllx %g2, 32, %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
|
cmp %o0, -ERESTART_RESTARTBLOCK
|
||||||
bgeu,pn %xcc, 1f
|
bgeu,pn %xcc, 1f
|
||||||
andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT), %l6
|
andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT), %g0
|
||||||
80:
|
ldx [%sp + PTREGS_OFF + PT_V9_TNPC], %l1 ! pc = npc
|
||||||
|
|
||||||
|
2:
|
||||||
|
stb %g0, [%g6 + TI_SYS_NOERROR]
|
||||||
/* System call success, clear Carry condition code. */
|
/* System call success, clear Carry condition code. */
|
||||||
andn %g3, %g2, %g3
|
andn %g3, %g2, %g3
|
||||||
|
3:
|
||||||
stx %g3, [%sp + PTREGS_OFF + PT_V9_TSTATE]
|
stx %g3, [%sp + PTREGS_OFF + PT_V9_TSTATE]
|
||||||
bne,pn %icc, linux_syscall_trace2
|
bne,pn %icc, linux_syscall_trace2
|
||||||
add %l1, 0x4, %l2 ! npc = npc+4
|
add %l1, 0x4, %l2 ! npc = npc+4
|
||||||
|
@ -238,20 +234,20 @@ ret_sys_call:
|
||||||
stx %l2, [%sp + PTREGS_OFF + PT_V9_TNPC]
|
stx %l2, [%sp + PTREGS_OFF + PT_V9_TNPC]
|
||||||
|
|
||||||
1:
|
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.
|
/* System call failure, set Carry condition code.
|
||||||
* Also, get abs(errno) to return to the process.
|
* 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
|
sub %g0, %o0, %o0
|
||||||
or %g3, %g2, %g3
|
|
||||||
stx %o0, [%sp + PTREGS_OFF + PT_V9_I0]
|
stx %o0, [%sp + PTREGS_OFF + PT_V9_I0]
|
||||||
stx %g3, [%sp + PTREGS_OFF + PT_V9_TSTATE]
|
ba,pt %xcc, 3b
|
||||||
bne,pn %icc, linux_syscall_trace2
|
or %g3, %g2, %g3
|
||||||
add %l1, 0x4, %l2 ! npc = npc+4
|
|
||||||
stx %l1, [%sp + PTREGS_OFF + PT_V9_TPC]
|
|
||||||
|
|
||||||
b,pt %xcc, rtrap
|
|
||||||
stx %l2, [%sp + PTREGS_OFF + PT_V9_TNPC]
|
|
||||||
linux_syscall_trace2:
|
linux_syscall_trace2:
|
||||||
call syscall_trace_leave
|
call syscall_trace_leave
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
|
|
Загрузка…
Ссылка в новой задаче