mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 20:51:44 +00:00
sparc: keep calling do_signal() as long as pending signals remain
Analog of what commit494486a1d2
had done to alpha (another architecture with similar bug). One note: in rtrap_32.S part clr %l6 has been a rudiment of left after commit28e6103665
(sparc: Fix debugger syscall restart interactions) has killed %l6 use in there. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
b18cae4224
commit
caebf9103b
@ -78,9 +78,9 @@ signal_p:
|
||||
call do_notify_resume
|
||||
add %sp, STACKFRAME_SZ, %o0 ! pt_regs ptr
|
||||
|
||||
/* Fall through. */
|
||||
ld [%sp + STACKFRAME_SZ + PT_PSR], %t_psr
|
||||
clr %l6
|
||||
b signal_p
|
||||
ld [%curptr + TI_FLAGS], %g2
|
||||
|
||||
ret_trap_continue:
|
||||
sethi %hi(PSR_SYSCALL), %g1
|
||||
andn %t_psr, %g1, %t_psr
|
||||
|
@ -34,37 +34,9 @@ __handle_preemption:
|
||||
__handle_user_windows:
|
||||
call fault_in_user_windows
|
||||
wrpr %g0, RTRAP_PSTATE, %pstate
|
||||
wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate
|
||||
/* Redo sched+sig checks */
|
||||
ldx [%g6 + TI_FLAGS], %l0
|
||||
andcc %l0, _TIF_NEED_RESCHED, %g0
|
||||
ba,pt %xcc, __handle_preemption_continue
|
||||
wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate
|
||||
|
||||
be,pt %xcc, 1f
|
||||
nop
|
||||
call schedule
|
||||
wrpr %g0, RTRAP_PSTATE, %pstate
|
||||
wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate
|
||||
ldx [%g6 + TI_FLAGS], %l0
|
||||
|
||||
1: andcc %l0, _TIF_DO_NOTIFY_RESUME_MASK, %g0
|
||||
be,pt %xcc, __handle_user_windows_continue
|
||||
nop
|
||||
mov %l5, %o1
|
||||
add %sp, PTREGS_OFF, %o0
|
||||
mov %l0, %o2
|
||||
|
||||
call do_notify_resume
|
||||
wrpr %g0, RTRAP_PSTATE, %pstate
|
||||
wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate
|
||||
/* Signal delivery can modify pt_regs tstate, so we must
|
||||
* reload it.
|
||||
*/
|
||||
ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %l1
|
||||
sethi %hi(0xf << 20), %l4
|
||||
and %l1, %l4, %l4
|
||||
ba,pt %xcc, __handle_user_windows_continue
|
||||
|
||||
andn %l1, %l4, %l1
|
||||
__handle_userfpu:
|
||||
rd %fprs, %l5
|
||||
andcc %l5, FPRS_FEF, %g0
|
||||
@ -87,7 +59,7 @@ __handle_signal:
|
||||
ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %l1
|
||||
sethi %hi(0xf << 20), %l4
|
||||
and %l1, %l4, %l4
|
||||
ba,pt %xcc, __handle_signal_continue
|
||||
ba,pt %xcc, __handle_preemption_continue
|
||||
andn %l1, %l4, %l1
|
||||
|
||||
/* When returning from a NMI (%pil==15) interrupt we want to
|
||||
@ -177,11 +149,9 @@ __handle_preemption_continue:
|
||||
bne,pn %xcc, __handle_preemption
|
||||
andcc %l0, _TIF_DO_NOTIFY_RESUME_MASK, %g0
|
||||
bne,pn %xcc, __handle_signal
|
||||
__handle_signal_continue:
|
||||
ldub [%g6 + TI_WSAVED], %o2
|
||||
brnz,pn %o2, __handle_user_windows
|
||||
nop
|
||||
__handle_user_windows_continue:
|
||||
sethi %hi(TSTATE_PEF), %o0
|
||||
andcc %l1, %o0, %g0
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user