mirror of https://gitee.com/openkylin/linux.git
parisc: don't bother looping in do_signal()
entry.S code had been looping until no pending signals are left since 2005 anyway; no need to bother with that in do_signal() itself. If the failure to set a sigframe up raises SIGSEGV, we'll just pick it up the next time around the loop(s) in entry.S anyway. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
00df111e7e
commit
e3b880c6ee
|
@ -439,7 +439,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
|
||||||
* OK, we're invoking a handler.
|
* OK, we're invoking a handler.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static long
|
static void
|
||||||
handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
|
handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
|
||||||
struct pt_regs *regs, int in_syscall)
|
struct pt_regs *regs, int in_syscall)
|
||||||
{
|
{
|
||||||
|
@ -449,7 +449,7 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
|
||||||
|
|
||||||
/* Set up the stack frame */
|
/* Set up the stack frame */
|
||||||
if (!setup_rt_frame(sig, ka, info, oldset, regs, in_syscall))
|
if (!setup_rt_frame(sig, ka, info, oldset, regs, in_syscall))
|
||||||
return 0;
|
return;
|
||||||
|
|
||||||
signal_delivered(sig, info, ka, regs,
|
signal_delivered(sig, info, ka, regs,
|
||||||
test_thread_flag(TIF_SINGLESTEP) ||
|
test_thread_flag(TIF_SINGLESTEP) ||
|
||||||
|
@ -457,8 +457,6 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
|
||||||
|
|
||||||
DBG(1,KERN_DEBUG "do_signal: Exit (success), regs->gr[28] = %ld\n",
|
DBG(1,KERN_DEBUG "do_signal: Exit (success), regs->gr[28] = %ld\n",
|
||||||
regs->gr[28]);
|
regs->gr[28]);
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
|
@ -570,30 +568,17 @@ do_signal(struct pt_regs *regs, long in_syscall)
|
||||||
DBG(1,"\ndo_signal: regs=0x%p, sr7 %#lx, in_syscall=%d\n",
|
DBG(1,"\ndo_signal: regs=0x%p, sr7 %#lx, in_syscall=%d\n",
|
||||||
regs, regs->sr[7], in_syscall);
|
regs, regs->sr[7], in_syscall);
|
||||||
|
|
||||||
/* Everyone else checks to see if they are in kernel mode at
|
signr = get_signal_to_deliver(&info, &ka, regs, NULL);
|
||||||
this point and exits if that's the case. I'm not sure why
|
DBG(3,"do_signal: signr = %d, regs->gr[28] = %ld\n", signr, regs->gr[28]);
|
||||||
we would be called in that case, but for some reason we
|
|
||||||
are. */
|
|
||||||
|
|
||||||
/* May need to force signal if handle_signal failed to deliver */
|
|
||||||
while (1) {
|
|
||||||
signr = get_signal_to_deliver(&info, &ka, regs, NULL);
|
|
||||||
DBG(3,"do_signal: signr = %d, regs->gr[28] = %ld\n", signr, regs->gr[28]);
|
|
||||||
|
|
||||||
if (signr <= 0)
|
if (signr > 0) {
|
||||||
break;
|
|
||||||
|
|
||||||
/* Restart a system call if necessary. */
|
/* Restart a system call if necessary. */
|
||||||
if (in_syscall)
|
if (in_syscall)
|
||||||
syscall_restart(regs, &ka);
|
syscall_restart(regs, &ka);
|
||||||
|
|
||||||
/* Whee! Actually deliver the signal. If the
|
handle_signal(signr, &info, &ka, regs, in_syscall);
|
||||||
delivery failed, we need to continue to iterate in
|
return;
|
||||||
this loop so we can deliver the SIGSEGV... */
|
|
||||||
if (handle_signal(signr, &info, &ka, regs, in_syscall))
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
/* end of while(1) looping forever if we can't force a signal */
|
|
||||||
|
|
||||||
/* Did we come from a system call? */
|
/* Did we come from a system call? */
|
||||||
if (in_syscall)
|
if (in_syscall)
|
||||||
|
|
Loading…
Reference in New Issue