new helper: signal_delivered()

Does block_sigmask() + tracehook_signal_handler();  called when
sigframe has been successfully built.  All architectures converted
to it; block_sigmask() itself is gone now (merged into this one).

I'm still not too happy with the signature, but that's a separate
story (IMO we need a structure that would contain signal number +
siginfo + k_sigaction, so that get_signal_to_deliver() would fill one,
signal_delivered(), handle_signal() and probably setup...frame() -
take one).

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Al Viro 2012-04-28 02:04:15 -04:00
parent 17440f171e
commit efee984c27
34 changed files with 47 additions and 83 deletions

View file

@ -2368,17 +2368,20 @@ relock:
}
/**
* block_sigmask - add @ka's signal mask to current->blocked
* @ka: action for @signr
* @signr: signal that has been successfully delivered
* signal_delivered -
* @sig: number of signal being delivered
* @info: siginfo_t of signal being delivered
* @ka: sigaction setting that chose the handler
* @regs: user register state
* @stepping: nonzero if debugger single-step or block-step in use
*
* This function should be called when a signal has succesfully been
* delivered. It adds the mask of signals for @ka to current->blocked
* so that they are blocked during the execution of the signal
* handler. In addition, @signr will be blocked unless %SA_NODEFER is
* set in @ka->sa.sa_flags.
* delivered. It updates the blocked signals accordingly (@ka->sa.sa_mask
* is always blocked, and the signal itself is blocked unless %SA_NODEFER
* is set in @ka->sa.sa_flags. Tracing is notified.
*/
void block_sigmask(struct k_sigaction *ka, int signr)
void signal_delivered(int sig, siginfo_t *info, struct k_sigaction *ka,
struct pt_regs *regs, int stepping)
{
sigset_t blocked;
@ -2390,8 +2393,9 @@ void block_sigmask(struct k_sigaction *ka, int signr)
sigorsets(&blocked, &current->blocked, &ka->sa.sa_mask);
if (!(ka->sa.sa_flags & SA_NODEFER))
sigaddset(&blocked, signr);
sigaddset(&blocked, sig);
set_current_blocked(&blocked);
tracehook_signal_handler(sig, info, ka, regs, stepping);
}
/*