提交 d9d0738a 编写于 作者: A Al Viro

alpha: don't bother passing switch_stack separately from regs

It's needed only in setup_sigcontext() and it's always reg - <constant>;
no point passing it all way down through the call chain.  This is just
the signal.c side of that stuff; next will come the asm glue one...
Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
上级 6972d6f2
...@@ -298,8 +298,9 @@ get_sigframe(struct k_sigaction *ka, unsigned long sp, size_t frame_size) ...@@ -298,8 +298,9 @@ get_sigframe(struct k_sigaction *ka, unsigned long sp, size_t frame_size)
static long static long
setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
struct switch_stack *sw, unsigned long mask, unsigned long sp) unsigned long mask, unsigned long sp)
{ {
struct switch_stack *sw = (struct switch_stack *)regs - 1;
long i, err = 0; long i, err = 0;
err |= __put_user(on_sig_stack((unsigned long)sc), &sc->sc_onstack); err |= __put_user(on_sig_stack((unsigned long)sc), &sc->sc_onstack);
...@@ -354,7 +355,7 @@ setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, ...@@ -354,7 +355,7 @@ setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
static int static int
setup_frame(int sig, struct k_sigaction *ka, sigset_t *set, setup_frame(int sig, struct k_sigaction *ka, sigset_t *set,
struct pt_regs *regs, struct switch_stack * sw) struct pt_regs *regs)
{ {
unsigned long oldsp, r26, err = 0; unsigned long oldsp, r26, err = 0;
struct sigframe __user *frame; struct sigframe __user *frame;
...@@ -364,7 +365,7 @@ setup_frame(int sig, struct k_sigaction *ka, sigset_t *set, ...@@ -364,7 +365,7 @@ setup_frame(int sig, struct k_sigaction *ka, sigset_t *set,
if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
return -EFAULT; return -EFAULT;
err |= setup_sigcontext(&frame->sc, regs, sw, set->sig[0], oldsp); err |= setup_sigcontext(&frame->sc, regs, set->sig[0], oldsp);
if (err) if (err)
return -EFAULT; return -EFAULT;
...@@ -401,7 +402,7 @@ setup_frame(int sig, struct k_sigaction *ka, sigset_t *set, ...@@ -401,7 +402,7 @@ setup_frame(int sig, struct k_sigaction *ka, sigset_t *set,
static int static int
setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
sigset_t *set, struct pt_regs *regs, struct switch_stack * sw) sigset_t *set, struct pt_regs *regs)
{ {
unsigned long oldsp, r26, err = 0; unsigned long oldsp, r26, err = 0;
struct rt_sigframe __user *frame; struct rt_sigframe __user *frame;
...@@ -420,7 +421,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, ...@@ -420,7 +421,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp); err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
err |= __put_user(sas_ss_flags(oldsp), &frame->uc.uc_stack.ss_flags); err |= __put_user(sas_ss_flags(oldsp), &frame->uc.uc_stack.ss_flags);
err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size); err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, sw, err |= setup_sigcontext(&frame->uc.uc_mcontext, regs,
set->sig[0], oldsp); set->sig[0], oldsp);
err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
if (err) if (err)
...@@ -464,15 +465,15 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, ...@@ -464,15 +465,15 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
*/ */
static inline void static inline void
handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info, handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info,
struct pt_regs * regs, struct switch_stack *sw) struct pt_regs * regs)
{ {
sigset_t *oldset = sigmask_to_save(); sigset_t *oldset = sigmask_to_save();
int ret; int ret;
if (ka->sa.sa_flags & SA_SIGINFO) if (ka->sa.sa_flags & SA_SIGINFO)
ret = setup_rt_frame(sig, ka, info, oldset, regs, sw); ret = setup_rt_frame(sig, ka, info, oldset, regs);
else else
ret = setup_frame(sig, ka, oldset, regs, sw); ret = setup_frame(sig, ka, oldset, regs);
if (ret) { if (ret) {
force_sigsegv(sig, current); force_sigsegv(sig, current);
...@@ -519,8 +520,7 @@ syscall_restart(unsigned long r0, unsigned long r19, ...@@ -519,8 +520,7 @@ syscall_restart(unsigned long r0, unsigned long r19,
* all (if we get here from anything but a syscall return, it will be 0) * all (if we get here from anything but a syscall return, it will be 0)
*/ */
static void static void
do_signal(struct pt_regs * regs, struct switch_stack * sw, do_signal(struct pt_regs *regs, unsigned long r0, unsigned long r19)
unsigned long r0, unsigned long r19)
{ {
siginfo_t info; siginfo_t info;
int signr; int signr;
...@@ -537,7 +537,7 @@ do_signal(struct pt_regs * regs, struct switch_stack * sw, ...@@ -537,7 +537,7 @@ do_signal(struct pt_regs * regs, struct switch_stack * sw,
/* Whee! Actually deliver the signal. */ /* Whee! Actually deliver the signal. */
if (r0) if (r0)
syscall_restart(r0, r19, regs, &ka); syscall_restart(r0, r19, regs, &ka);
handle_signal(signr, &ka, &info, regs, sw); handle_signal(signr, &ka, &info, regs);
if (single_stepping) if (single_stepping)
ptrace_set_bpt(current); /* re-set bpt */ ptrace_set_bpt(current); /* re-set bpt */
return; return;
...@@ -568,7 +568,7 @@ do_signal(struct pt_regs * regs, struct switch_stack * sw, ...@@ -568,7 +568,7 @@ do_signal(struct pt_regs * regs, struct switch_stack * sw,
} }
void void
do_work_pending(struct pt_regs *regs, struct switch_stack *sw, do_work_pending(struct pt_regs *regs, struct switch_stack *unused,
unsigned long thread_flags, unsigned long thread_flags,
unsigned long r0, unsigned long r19) unsigned long r0, unsigned long r19)
{ {
...@@ -578,7 +578,7 @@ do_work_pending(struct pt_regs *regs, struct switch_stack *sw, ...@@ -578,7 +578,7 @@ do_work_pending(struct pt_regs *regs, struct switch_stack *sw,
} else { } else {
local_irq_enable(); local_irq_enable();
if (thread_flags & _TIF_SIGPENDING) { if (thread_flags & _TIF_SIGPENDING) {
do_signal(regs, sw, r0, r19); do_signal(regs, r0, r19);
r0 = 0; r0 = 0;
} else { } else {
clear_thread_flag(TIF_NOTIFY_RESUME); clear_thread_flag(TIF_NOTIFY_RESUME);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册