summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Hutchings <ben@decadent.org.uk>2019-04-26 13:27:45 +0100
committerBen Hutchings <ben@decadent.org.uk>2019-04-26 13:27:45 +0100
commitb8ebf4c08e509bde5623052e26c27f51b7b65d5a (patch)
treef9d91543c426394c309e6af06e06a4f1bec95d9e
parentcdbf76978f8ac984c08e1412d7139c135402fbb0 (diff)
downloadlinux-stable-queue-b8ebf4c08e509bde5623052e26c27f51b7b65d5a.tar.gz
Add/drop patches to fix build failures
-rw-r--r--queue-3.16/arc-use-get_signal-signal_setup_done.patch119
-rw-r--r--queue-3.16/arm64-use-get_signal-signal_setup_done.patch233
-rw-r--r--queue-3.16/avr32-use-get_signal-signal_setup_done.patch154
-rw-r--r--queue-3.16/blackfin-use-get_signal-signal_setup_done.patch115
-rw-r--r--queue-3.16/c6x-use-get_signal-signal_setup_done.patch139
-rw-r--r--queue-3.16/cris-use-get_signal-signal_setup_done.patch442
-rw-r--r--queue-3.16/dmaengine-bcm2835-add-additional-defines-for-dma-registers.patch97
-rw-r--r--queue-3.16/dmaengine-bcm2835-fix-abort-of-transactions.patch8
-rw-r--r--queue-3.16/dmaengine-bcm2835-fix-interrupt-race-on-rt.patch8
-rw-r--r--queue-3.16/frv-use-get_signal-signal_setup_done.patch267
-rw-r--r--queue-3.16/hexagon-use-get_signal-signal_setup_done.patch127
-rw-r--r--queue-3.16/ia64-use-get_signal-signal_setup_done.patch158
-rw-r--r--queue-3.16/m32r-use-get_signal-signal_setup_done.patch156
-rw-r--r--queue-3.16/m68k-use-get_signal-signal_setup_done.patch191
-rw-r--r--queue-3.16/microblaze-use-get_signal-signal_setup_done.patch141
-rw-r--r--queue-3.16/mips-use-get_signal-signal_setup_done.patch384
-rw-r--r--queue-3.16/mn10300-use-get_signal-signal_setup_done.patch239
-rw-r--r--queue-3.16/net-dp83640-expire-old-tx-skb.patch80
-rw-r--r--queue-3.16/parisc-use-get_signal-signal_setup_done.patch178
-rw-r--r--queue-3.16/powerpc-use-get_signal-signal_setup_done.patch338
-rw-r--r--queue-3.16/s390-use-get_signal-signal_setup_done.patch391
-rw-r--r--queue-3.16/score-use-get_signal-signal_setup_done.patch126
-rw-r--r--queue-3.16/series25
-rw-r--r--queue-3.16/sh-use-get_signal-signal_setup_done.patch453
-rw-r--r--queue-3.16/tile-use-get_signal-signal_setup_done.patch250
-rw-r--r--queue-3.16/um-use-get_signal-signal_setup_done.patch232
-rw-r--r--queue-3.16/unicore32-use-get_signal-signal_setup_done.patch147
-rw-r--r--queue-3.16/xtensa-use-get_signal-signal_setup_done.patch144
28 files changed, 5253 insertions, 89 deletions
diff --git a/queue-3.16/arc-use-get_signal-signal_setup_done.patch b/queue-3.16/arc-use-get_signal-signal_setup_done.patch
new file mode 100644
index 00000000..043ee626
--- /dev/null
+++ b/queue-3.16/arc-use-get_signal-signal_setup_done.patch
@@ -0,0 +1,119 @@
+From: Richard Weinberger <richard@nod.at>
+Date: Sun, 6 Oct 2013 22:42:38 +0200
+Subject: arc: Use get_signal() signal_setup_done()
+
+commit f6dd2a3f1f8d8df640cfa2d60f85c0b818af1593 upstream.
+
+Use the more generic functions get_signal() signal_setup_done()
+for signal delivery.
+
+Signed-off-by: Richard Weinberger <richard@nod.at>
+Acked-by: Vineet Gupta <vgupta@synopsys.com>
+[bwh: Backported to 3.16 as dependency of commit 35634ffa1751
+ "signal: Always notice exiting tasks"
+ - Adjust to apply after "ARC: signal handling robustify"]
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ arch/arc/kernel/signal.c | 39 +++++++++++++++------------------------
+ 1 file changed, 15 insertions(+), 24 deletions(-)
+
+--- a/arch/arc/kernel/signal.c
++++ b/arch/arc/kernel/signal.c
+@@ -189,14 +189,13 @@ static inline int map_sig(int sig)
+ }
+
+ static int
+-setup_rt_frame(int signo, struct k_sigaction *ka, siginfo_t *info,
+- sigset_t *set, struct pt_regs *regs)
++setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs)
+ {
+ struct rt_sigframe __user *sf;
+ unsigned int magic = 0;
+ int err = 0;
+
+- sf = get_sigframe(ka, regs, sizeof(struct rt_sigframe));
++ sf = get_sigframe(&ksig->ka, regs, sizeof(struct rt_sigframe));
+ if (!sf)
+ return 1;
+
+@@ -215,8 +214,8 @@ setup_rt_frame(int signo, struct k_sigac
+ * #2: struct siginfo
+ * #3: struct ucontext (completely populated)
+ */
+- if (unlikely(ka->sa.sa_flags & SA_SIGINFO)) {
+- err |= copy_siginfo_to_user(&sf->info, info);
++ if (unlikely(ksig->ka.sa.sa_flags & SA_SIGINFO)) {
++ err |= copy_siginfo_to_user(&sf->info, &ksig->info);
+ err |= __put_user(0, &sf->uc.uc_flags);
+ err |= __put_user(NULL, &sf->uc.uc_link);
+ err |= __save_altstack(&sf->uc.uc_stack, regs->sp);
+@@ -237,19 +236,19 @@ setup_rt_frame(int signo, struct k_sigac
+ return err;
+
+ /* #1 arg to the user Signal handler */
+- regs->r0 = map_sig(signo);
++ regs->r0 = map_sig(ksig->sig);
+
+ /* setup PC of user space signal handler */
+- regs->ret = (unsigned long)ka->sa.sa_handler;
++ regs->ret = (unsigned long)ksig->ka.sa.sa_handler;
+
+ /*
+ * handler returns using sigreturn stub provided already by userpsace
+ * If not, nuke the process right away
+ */
+- if(!(ka->sa.sa_flags & SA_RESTORER))
++ if(!(ksig->ka.sa.sa_flags & SA_RESTORER))
+ return 1;
+
+- regs->blink = (unsigned long)ka->sa.sa_restorer;
++ regs->blink = (unsigned long)ksig->ka.sa.sa_restorer;
+
+ /* User Stack for signal handler will be above the frame just carved */
+ regs->sp = (unsigned long)sf;
+@@ -311,38 +310,30 @@ static void arc_restart_syscall(struct k
+ * OK, we're invoking a handler
+ */
+ static void
+-handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
+- struct pt_regs *regs)
++handle_signal(struct ksignal *ksig, struct pt_regs *regs)
+ {
+ sigset_t *oldset = sigmask_to_save();
+ int failed;
+
+ /* Set up the stack frame */
+- failed = setup_rt_frame(sig, ka, info, oldset, regs);
++ failed = setup_rt_frame(ksig, oldset, regs);
+
+- if (failed)
+- force_sigsegv(sig, current);
+- else
+- signal_delivered(sig, info, ka, regs, 0);
++ signal_setup_done(failed, ksig, 0);
+ }
+
+ void do_signal(struct pt_regs *regs)
+ {
+- struct k_sigaction ka;
+- siginfo_t info;
+- int signr;
++ struct ksignal ksig;
+ int restart_scall;
+
+- signr = get_signal_to_deliver(&info, &ka, regs, NULL);
+-
+ restart_scall = in_syscall(regs) && syscall_restartable(regs);
+
+- if (signr > 0) {
++ if (get_signal(&ksig)) {
+ if (restart_scall) {
+- arc_restart_syscall(&ka, regs);
++ arc_restart_syscall(&ksig.ka, regs);
+ syscall_wont_restart(regs); /* No more restarts */
+ }
+- handle_signal(signr, &ka, &info, regs);
++ handle_signal(&ksig, regs);
+ return;
+ }
+
diff --git a/queue-3.16/arm64-use-get_signal-signal_setup_done.patch b/queue-3.16/arm64-use-get_signal-signal_setup_done.patch
new file mode 100644
index 00000000..6d4cd55e
--- /dev/null
+++ b/queue-3.16/arm64-use-get_signal-signal_setup_done.patch
@@ -0,0 +1,233 @@
+From: Richard Weinberger <richard@nod.at>
+Date: Sun, 6 Oct 2013 22:52:44 +0200
+Subject: arm64: Use get_signal() signal_setup_done()
+
+commit 00554fa4f80279db92f82c4f52c8ae72711f173e upstream.
+
+Use the more generic functions get_signal() signal_setup_done()
+for signal delivery.
+
+Signed-off-by: Richard Weinberger <richard@nod.at>
+[bwh: Backported to 3.16 as dependency of commit 35634ffa1751
+ "signal: Always notice exiting tasks"]
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ arch/arm64/include/asm/signal32.h | 11 ++++---
+ arch/arm64/kernel/signal.c | 48 +++++++++++++------------------
+ arch/arm64/kernel/signal32.c | 14 ++++-----
+ 3 files changed, 32 insertions(+), 41 deletions(-)
+
+--- a/arch/arm64/include/asm/signal32.h
++++ b/arch/arm64/include/asm/signal32.h
+@@ -24,22 +24,21 @@
+
+ extern const compat_ulong_t aarch32_sigret_code[6];
+
+-int compat_setup_frame(int usig, struct k_sigaction *ka, sigset_t *set,
++int compat_setup_frame(int usig, struct ksignal *ksig, sigset_t *set,
+ struct pt_regs *regs);
+-int compat_setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,
+- sigset_t *set, struct pt_regs *regs);
++int compat_setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set,
++ struct pt_regs *regs);
+
+ void compat_setup_restart_syscall(struct pt_regs *regs);
+ #else
+
+-static inline int compat_setup_frame(int usid, struct k_sigaction *ka,
++static inline int compat_setup_frame(int usid, struct ksignal *ksig,
+ sigset_t *set, struct pt_regs *regs)
+ {
+ return -ENOSYS;
+ }
+
+-static inline int compat_setup_rt_frame(int usig, struct k_sigaction *ka,
+- siginfo_t *info, sigset_t *set,
++static inline int compat_setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set,
+ struct pt_regs *regs)
+ {
+ return -ENOSYS;
+--- a/arch/arm64/kernel/signal.c
++++ b/arch/arm64/kernel/signal.c
+@@ -253,13 +253,13 @@ static void setup_return(struct pt_regs
+ regs->regs[30] = (unsigned long)sigtramp;
+ }
+
+-static int setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,
+- sigset_t *set, struct pt_regs *regs)
++static int setup_rt_frame(int usig, struct ksignal *ksig, sigset_t *set,
++ struct pt_regs *regs)
+ {
+ struct rt_sigframe __user *frame;
+ int err = 0;
+
+- frame = get_sigframe(ka, regs);
++ frame = get_sigframe(&ksig->ka, regs);
+ if (!frame)
+ return 1;
+
+@@ -269,9 +269,9 @@ static int setup_rt_frame(int usig, stru
+ err |= __save_altstack(&frame->uc.uc_stack, regs->sp);
+ err |= setup_sigframe(frame, regs, set);
+ if (err == 0) {
+- setup_return(regs, ka, frame, usig);
+- if (ka->sa.sa_flags & SA_SIGINFO) {
+- err |= copy_siginfo_to_user(&frame->info, info);
++ setup_return(regs, &ksig->ka, frame, usig);
++ if (ksig->ka.sa.sa_flags & SA_SIGINFO) {
++ err |= copy_siginfo_to_user(&frame->info, &ksig->info);
+ regs->regs[1] = (unsigned long)&frame->info;
+ regs->regs[2] = (unsigned long)&frame->uc;
+ }
+@@ -291,13 +291,12 @@ static void setup_restart_syscall(struct
+ /*
+ * OK, we're invoking a handler
+ */
+-static void handle_signal(unsigned long sig, struct k_sigaction *ka,
+- siginfo_t *info, struct pt_regs *regs)
++static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)
+ {
+ struct thread_info *thread = current_thread_info();
+ struct task_struct *tsk = current;
+ sigset_t *oldset = sigmask_to_save();
+- int usig = sig;
++ int usig = ksig->sig;
+ int ret;
+
+ /*
+@@ -310,13 +309,12 @@ static void handle_signal(unsigned long
+ * Set up the stack frame
+ */
+ if (is_compat_task()) {
+- if (ka->sa.sa_flags & SA_SIGINFO)
+- ret = compat_setup_rt_frame(usig, ka, info, oldset,
+- regs);
++ if (ksig->ka.sa.sa_flags & SA_SIGINFO)
++ ret = compat_setup_rt_frame(usig, ksig, oldset, regs);
+ else
+- ret = compat_setup_frame(usig, ka, oldset, regs);
++ ret = compat_setup_frame(usig, ksig, oldset, regs);
+ } else {
+- ret = setup_rt_frame(usig, ka, info, oldset, regs);
++ ret = setup_rt_frame(usig, ksig, oldset, regs);
+ }
+
+ /*
+@@ -324,18 +322,14 @@ static void handle_signal(unsigned long
+ */
+ ret |= !valid_user_regs(&regs->user_regs, current);
+
+- if (ret != 0) {
+- force_sigsegv(sig, tsk);
+- return;
+- }
+-
+ /*
+ * Fast forward the stepping logic so we step into the signal
+ * handler.
+ */
+- user_fastforward_single_step(tsk);
++ if (!ret)
++ user_fastforward_single_step(tsk);
+
+- signal_delivered(sig, info, ka, regs, 0);
++ signal_setup_done(ret, ksig, 0);
+ }
+
+ /*
+@@ -350,10 +344,9 @@ static void handle_signal(unsigned long
+ static void do_signal(struct pt_regs *regs)
+ {
+ unsigned long continue_addr = 0, restart_addr = 0;
+- struct k_sigaction ka;
+- siginfo_t info;
+- int signr, retval = 0;
++ int retval = 0;
+ int syscall = (int)regs->syscallno;
++ struct ksignal ksig;
+
+ /*
+ * If we were from a system call, check for system call restarting...
+@@ -387,8 +380,7 @@ static void do_signal(struct pt_regs *re
+ * Get the signal to deliver. When running under ptrace, at this point
+ * the debugger may change all of our registers.
+ */
+- signr = get_signal_to_deliver(&info, &ka, regs, NULL);
+- if (signr > 0) {
++ if (get_signal(&ksig)) {
+ /*
+ * Depending on the signal settings, we may need to revert the
+ * decision to restart the system call, but skip this if a
+@@ -398,12 +390,12 @@ static void do_signal(struct pt_regs *re
+ (retval == -ERESTARTNOHAND ||
+ retval == -ERESTART_RESTARTBLOCK ||
+ (retval == -ERESTARTSYS &&
+- !(ka.sa.sa_flags & SA_RESTART)))) {
++ !(ksig.ka.sa.sa_flags & SA_RESTART)))) {
+ regs->regs[0] = -EINTR;
+ regs->pc = continue_addr;
+ }
+
+- handle_signal(signr, &ka, &info, regs);
++ handle_signal(&ksig, regs);
+ return;
+ }
+
+--- a/arch/arm64/kernel/signal32.c
++++ b/arch/arm64/kernel/signal32.c
+@@ -543,18 +543,18 @@ static int compat_setup_sigframe(struct
+ /*
+ * 32-bit signal handling routines called from signal.c
+ */
+-int compat_setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,
++int compat_setup_rt_frame(int usig, struct ksignal *ksig,
+ sigset_t *set, struct pt_regs *regs)
+ {
+ struct compat_rt_sigframe __user *frame;
+ int err = 0;
+
+- frame = compat_get_sigframe(ka, regs, sizeof(*frame));
++ frame = compat_get_sigframe(&ksig->ka, regs, sizeof(*frame));
+
+ if (!frame)
+ return 1;
+
+- err |= copy_siginfo_to_user32(&frame->info, info);
++ err |= copy_siginfo_to_user32(&frame->info, &ksig->info);
+
+ __put_user_error(0, &frame->sig.uc.uc_flags, err);
+ __put_user_error(0, &frame->sig.uc.uc_link, err);
+@@ -564,7 +564,7 @@ int compat_setup_rt_frame(int usig, stru
+ err |= compat_setup_sigframe(&frame->sig, regs, set);
+
+ if (err == 0) {
+- compat_setup_return(regs, ka, frame->sig.retcode, frame, usig);
++ compat_setup_return(regs, &ksig->ka, frame->sig.retcode, frame, usig);
+ regs->regs[1] = (compat_ulong_t)(unsigned long)&frame->info;
+ regs->regs[2] = (compat_ulong_t)(unsigned long)&frame->sig.uc;
+ }
+@@ -572,13 +572,13 @@ int compat_setup_rt_frame(int usig, stru
+ return err;
+ }
+
+-int compat_setup_frame(int usig, struct k_sigaction *ka, sigset_t *set,
++int compat_setup_frame(int usig, struct ksignal *ksig, sigset_t *set,
+ struct pt_regs *regs)
+ {
+ struct compat_sigframe __user *frame;
+ int err = 0;
+
+- frame = compat_get_sigframe(ka, regs, sizeof(*frame));
++ frame = compat_get_sigframe(&ksig->ka, regs, sizeof(*frame));
+
+ if (!frame)
+ return 1;
+@@ -587,7 +587,7 @@ int compat_setup_frame(int usig, struct
+
+ err |= compat_setup_sigframe(frame, regs, set);
+ if (err == 0)
+- compat_setup_return(regs, ka, frame->retcode, frame, usig);
++ compat_setup_return(regs, &ksig->ka, frame->retcode, frame, usig);
+
+ return err;
+ }
diff --git a/queue-3.16/avr32-use-get_signal-signal_setup_done.patch b/queue-3.16/avr32-use-get_signal-signal_setup_done.patch
new file mode 100644
index 00000000..d17c2111
--- /dev/null
+++ b/queue-3.16/avr32-use-get_signal-signal_setup_done.patch
@@ -0,0 +1,154 @@
+From: Richard Weinberger <richard@nod.at>
+Date: Sun, 6 Oct 2013 23:00:56 +0200
+Subject: avr32: Use get_signal() signal_setup_done()
+
+commit d809709a8845954a95c2ac86c13bd0dfd549c1ae upstream.
+
+Use the more generic functions get_signal() signal_setup_done()
+for signal delivery.
+
+Signed-off-by: Richard Weinberger <richard@nod.at>
+Acked-by: Hans-Christian Egtvedt <egtvedt@samfundet.no>
+[bwh: Backported to 3.16 as dependency of commit 35634ffa1751
+ "signal: Always notice exiting tasks"]
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ arch/avr32/kernel/signal.c | 43 ++++++++++++++++----------------------
+ 1 file changed, 18 insertions(+), 25 deletions(-)
+
+--- a/arch/avr32/kernel/signal.c
++++ b/arch/avr32/kernel/signal.c
+@@ -138,13 +138,12 @@ get_sigframe(struct k_sigaction *ka, str
+ }
+
+ static int
+-setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+- sigset_t *set, struct pt_regs *regs)
++setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs)
+ {
+ struct rt_sigframe __user *frame;
+ int err = 0;
+
+- frame = get_sigframe(ka, regs, sizeof(*frame));
++ frame = get_sigframe(&ksig->ka, regs, sizeof(*frame));
+ err = -EFAULT;
+ if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
+ goto out;
+@@ -164,7 +163,7 @@ setup_rt_frame(int sig, struct k_sigacti
+ err = __put_user(0x3008d733 | (__NR_rt_sigreturn << 20),
+ &frame->retcode);
+
+- err |= copy_siginfo_to_user(&frame->info, info);
++ err |= copy_siginfo_to_user(&frame->info, &ksig->info);
+
+ /* Set up the ucontext */
+ err |= __put_user(0, &frame->uc.uc_flags);
+@@ -176,12 +175,12 @@ setup_rt_frame(int sig, struct k_sigacti
+ if (err)
+ goto out;
+
+- regs->r12 = sig;
++ regs->r12 = ksig->sig;
+ regs->r11 = (unsigned long) &frame->info;
+ regs->r10 = (unsigned long) &frame->uc;
+ regs->sp = (unsigned long) frame;
+- if (ka->sa.sa_flags & SA_RESTORER)
+- regs->lr = (unsigned long)ka->sa.sa_restorer;
++ if (ksig->ka.sa.sa_flags & SA_RESTORER)
++ regs->lr = (unsigned long)ksig->ka.sa.sa_restorer;
+ else {
+ printk(KERN_NOTICE "[%s:%d] did not set SA_RESTORER\n",
+ current->comm, current->pid);
+@@ -189,10 +188,10 @@ setup_rt_frame(int sig, struct k_sigacti
+ }
+
+ pr_debug("SIG deliver [%s:%d]: sig=%d sp=0x%lx pc=0x%lx->0x%p lr=0x%lx\n",
+- current->comm, current->pid, sig, regs->sp,
+- regs->pc, ka->sa.sa_handler, regs->lr);
++ current->comm, current->pid, ksig->sig, regs->sp,
++ regs->pc, ksig->ka.sa.sa_handler, regs->lr);
+
+- regs->pc = (unsigned long) ka->sa.sa_handler;
++ regs->pc = (unsigned long)ksig->ka.sa.sa_handler;
+
+ out:
+ return err;
+@@ -208,15 +207,14 @@ static inline void setup_syscall_restart
+ }
+
+ static inline void
+-handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
+- struct pt_regs *regs, int syscall)
++handle_signal(struct ksignal *ksig, struct pt_regs *regs, int syscall)
+ {
+ int ret;
+
+ /*
+ * Set up the stack frame
+ */
+- ret = setup_rt_frame(sig, ka, info, sigmask_to_save(), regs);
++ ret = setup_rt_frame(ksig, sigmask_to_save(), regs);
+
+ /*
+ * Check that the resulting registers are sane
+@@ -226,10 +224,7 @@ handle_signal(unsigned long sig, struct
+ /*
+ * Block the signal if we were successful.
+ */
+- if (ret != 0)
+- force_sigsegv(sig, current);
+- else
+- signal_delivered(sig, info, ka, regs, 0);
++ signal_setup_done(ret, ksig, 0);
+ }
+
+ /*
+@@ -239,9 +234,7 @@ handle_signal(unsigned long sig, struct
+ */
+ static void do_signal(struct pt_regs *regs, int syscall)
+ {
+- siginfo_t info;
+- int signr;
+- struct k_sigaction ka;
++ struct ksignal ksig;
+
+ /*
+ * We want the common case to go fast, which is why we may in
+@@ -251,18 +244,18 @@ static void do_signal(struct pt_regs *re
+ if (!user_mode(regs))
+ return;
+
+- signr = get_signal_to_deliver(&info, &ka, regs, NULL);
++ get_signal(&ksig);
+ if (syscall) {
+ switch (regs->r12) {
+ case -ERESTART_RESTARTBLOCK:
+ case -ERESTARTNOHAND:
+- if (signr > 0) {
++ if (ksig.sig > 0) {
+ regs->r12 = -EINTR;
+ break;
+ }
+ /* fall through */
+ case -ERESTARTSYS:
+- if (signr > 0 && !(ka.sa.sa_flags & SA_RESTART)) {
++ if (ksig.sig > 0 && !(ksig.ka.sa.sa_flags & SA_RESTART)) {
+ regs->r12 = -EINTR;
+ break;
+ }
+@@ -272,13 +265,13 @@ static void do_signal(struct pt_regs *re
+ }
+ }
+
+- if (signr == 0) {
++ if (!ksig.sig) {
+ /* No signal to deliver -- put the saved sigmask back */
+ restore_saved_sigmask();
+ return;
+ }
+
+- handle_signal(signr, &ka, &info, regs, syscall);
++ handle_signal(&ksig, regs, syscall);
+ }
+
+ asmlinkage void do_notify_resume(struct pt_regs *regs, struct thread_info *ti)
diff --git a/queue-3.16/blackfin-use-get_signal-signal_setup_done.patch b/queue-3.16/blackfin-use-get_signal-signal_setup_done.patch
new file mode 100644
index 00000000..ea84c9da
--- /dev/null
+++ b/queue-3.16/blackfin-use-get_signal-signal_setup_done.patch
@@ -0,0 +1,115 @@
+From: Richard Weinberger <richard@nod.at>
+Date: Sun, 6 Oct 2013 23:06:08 +0200
+Subject: blackfin: Use get_signal() signal_setup_done()
+
+commit 1270cff147a39f7da5b25225dca6ca3132ca6130 upstream.
+
+Use the more generic functions get_signal() signal_setup_done()
+for signal delivery.
+
+Signed-off-by: Richard Weinberger <richard@nod.at>
+Acked-by: Steven Miao <realmz6@gmail.com>
+[bwh: Backported to 3.16 as dependency of commit 35634ffa1751
+ "signal: Always notice exiting tasks"]
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ arch/blackfin/kernel/signal.c | 39 +++++++++++++++--------------------
+ 1 file changed, 17 insertions(+), 22 deletions(-)
+
+--- a/arch/blackfin/kernel/signal.c
++++ b/arch/blackfin/kernel/signal.c
+@@ -152,23 +152,22 @@ static inline void *get_sigframe(struct
+ }
+
+ static int
+-setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t * info,
+- sigset_t * set, struct pt_regs *regs)
++setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs)
+ {
+ struct rt_sigframe *frame;
+ int err = 0;
+
+- frame = get_sigframe(ka, regs, sizeof(*frame));
++ frame = get_sigframe(&ksig->ka, regs, sizeof(*frame));
+
+ err |= __put_user((current_thread_info()->exec_domain
+ && current_thread_info()->exec_domain->signal_invmap
+- && sig < 32
++ && ksig->sig < 32
+ ? current_thread_info()->exec_domain->
+- signal_invmap[sig] : sig), &frame->sig);
++ signal_invmap[ksig->sig] : ksig->sig), &frame->sig);
+
+ err |= __put_user(&frame->info, &frame->pinfo);
+ err |= __put_user(&frame->uc, &frame->puc);
+- err |= copy_siginfo_to_user(&frame->info, info);
++ err |= copy_siginfo_to_user(&frame->info, &ksig->info);
+
+ /* Create the ucontext. */
+ err |= __put_user(0, &frame->uc.uc_flags);
+@@ -183,7 +182,7 @@ setup_rt_frame(int sig, struct k_sigacti
+ /* Set up registers for signal handler */
+ if (current->personality & FDPIC_FUNCPTRS) {
+ struct fdpic_func_descriptor __user *funcptr =
+- (struct fdpic_func_descriptor *) ka->sa.sa_handler;
++ (struct fdpic_func_descriptor *) ksig->ka.sa.sa_handler;
+ u32 pc, p3;
+ err |= __get_user(pc, &funcptr->text);
+ err |= __get_user(p3, &funcptr->GOT);
+@@ -192,7 +191,7 @@ setup_rt_frame(int sig, struct k_sigacti
+ regs->pc = pc;
+ regs->p3 = p3;
+ } else
+- regs->pc = (unsigned long)ka->sa.sa_handler;
++ regs->pc = (unsigned long)ksig->ka.sa.sa_handler;
+ wrusp((unsigned long)frame);
+ regs->rets = SIGRETURN_STUB;
+
+@@ -237,20 +236,19 @@ handle_restart(struct pt_regs *regs, str
+ * OK, we're invoking a handler
+ */
+ static void
+-handle_signal(int sig, siginfo_t *info, struct k_sigaction *ka,
+- struct pt_regs *regs)
++handle_signal(struct ksignal *ksig, struct pt_regs *regs)
+ {
++ int ret;
++
+ /* are we from a system call? to see pt_regs->orig_p0 */
+ if (regs->orig_p0 >= 0)
+ /* If so, check system call restarting.. */
+- handle_restart(regs, ka, 1);
++ handle_restart(regs, &ksig->ka, 1);
+
+ /* set up the stack frame */
+- if (setup_rt_frame(sig, ka, info, sigmask_to_save(), regs) < 0)
+- force_sigsegv(sig, current);
+- else
+- signal_delivered(sig, info, ka, regs,
+- test_thread_flag(TIF_SINGLESTEP));
++ ret = setup_rt_frame(ksig, sigmask_to_save(), regs);
++
++ signal_setup_done(ret, ksig, test_thread_flag(TIF_SINGLESTEP));
+ }
+
+ /*
+@@ -264,16 +262,13 @@ handle_signal(int sig, siginfo_t *info,
+ */
+ asmlinkage void do_signal(struct pt_regs *regs)
+ {
+- siginfo_t info;
+- int signr;
+- struct k_sigaction ka;
++ struct ksignal ksig;
+
+ current->thread.esp0 = (unsigned long)regs;
+
+- signr = get_signal_to_deliver(&info, &ka, regs, NULL);
+- if (signr > 0) {
++ if (get_signal(&ksig)) {
+ /* Whee! Actually deliver the signal. */
+- handle_signal(signr, &info, &ka, regs);
++ handle_signal(&ksig, regs);
+ return;
+ }
+
diff --git a/queue-3.16/c6x-use-get_signal-signal_setup_done.patch b/queue-3.16/c6x-use-get_signal-signal_setup_done.patch
new file mode 100644
index 00000000..f9954a9a
--- /dev/null
+++ b/queue-3.16/c6x-use-get_signal-signal_setup_done.patch
@@ -0,0 +1,139 @@
+From: Richard Weinberger <richard@nod.at>
+Date: Sun, 6 Oct 2013 23:09:48 +0200
+Subject: c6x: Use get_signal() signal_setup_done()
+
+commit e19c025bc9a184ed9c5daf06ffb89abc81d1696a upstream.
+
+Use the more generic functions get_signal() signal_setup_done()
+for signal delivery.
+
+Tested-by: Mark Salter <msalter@redhat.com>
+Acked-by: Mark Salter <msalter@redhat.com>
+Signed-off-by: Richard Weinberger <richard@nod.at>
+[bwh: Backported to 3.16 as dependency of commit 35634ffa1751
+ "signal: Always notice exiting tasks"]
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ arch/c6x/kernel/signal.c | 43 +++++++++++++++++-----------------------
+ 1 file changed, 18 insertions(+), 25 deletions(-)
+
+--- a/arch/c6x/kernel/signal.c
++++ b/arch/c6x/kernel/signal.c
+@@ -146,21 +146,21 @@ static inline void __user *get_sigframe(
+ return (void __user *)((sp - framesize) & ~7);
+ }
+
+-static int setup_rt_frame(int signr, struct k_sigaction *ka, siginfo_t *info,
+- sigset_t *set, struct pt_regs *regs)
++static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
++ struct pt_regs *regs)
+ {
+ struct rt_sigframe __user *frame;
+ unsigned long __user *retcode;
+ int err = 0;
+
+- frame = get_sigframe(ka, regs, sizeof(*frame));
++ frame = get_sigframe(&ksig->ka, regs, sizeof(*frame));
+
+ if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
+- goto segv_and_exit;
++ return -EFAULT;
+
+ err |= __put_user(&frame->info, &frame->pinfo);
+ err |= __put_user(&frame->uc, &frame->puc);
+- err |= copy_siginfo_to_user(&frame->info, info);
++ err |= copy_siginfo_to_user(&frame->info, &ksig->info);
+
+ /* Clear all the bits of the ucontext we don't use. */
+ err |= __clear_user(&frame->uc, offsetof(struct ucontext, uc_mcontext));
+@@ -188,7 +188,7 @@ static int setup_rt_frame(int signr, str
+ #undef COPY
+
+ if (err)
+- goto segv_and_exit;
++ return -EFAULT;
+
+ flush_icache_range((unsigned long) &frame->retcode,
+ (unsigned long) &frame->retcode + RETCODE_SIZE);
+@@ -198,10 +198,10 @@ static int setup_rt_frame(int signr, str
+ /* Change user context to branch to signal handler */
+ regs->sp = (unsigned long) frame - 8;
+ regs->b3 = (unsigned long) retcode;
+- regs->pc = (unsigned long) ka->sa.sa_handler;
++ regs->pc = (unsigned long) ksig->ka.sa.sa_handler;
+
+ /* Give the signal number to the handler */
+- regs->a4 = signr;
++ regs->a4 = ksig->sig;
+
+ /*
+ * For realtime signals we must also set the second and third
+@@ -212,10 +212,6 @@ static int setup_rt_frame(int signr, str
+ regs->a6 = (unsigned long)&frame->uc;
+
+ return 0;
+-
+-segv_and_exit:
+- force_sigsegv(signr, current);
+- return -EFAULT;
+ }
+
+ static inline void
+@@ -245,10 +241,11 @@ do_restart:
+ /*
+ * handle the actual delivery of a signal to userspace
+ */
+-static void handle_signal(int sig,
+- siginfo_t *info, struct k_sigaction *ka,
+- struct pt_regs *regs, int syscall)
++static void handle_signal(struct ksignal *ksig, struct pt_regs *regs,
++ int syscall)
+ {
++ int ret;
++
+ /* Are we from a system call? */
+ if (syscall) {
+ /* If so, check system call restarting.. */
+@@ -259,7 +256,7 @@ static void handle_signal(int sig,
+ break;
+
+ case -ERESTARTSYS:
+- if (!(ka->sa.sa_flags & SA_RESTART)) {
++ if (!(ksig->ka.sa.sa_flags & SA_RESTART)) {
+ regs->a4 = -EINTR;
+ break;
+ }
+@@ -272,9 +269,8 @@ static void handle_signal(int sig,
+ }
+
+ /* Set up the stack frame */
+- if (setup_rt_frame(sig, ka, info, sigmask_to_save(), regs) < 0)
+- return;
+- signal_delivered(sig, info, ka, regs, 0);
++ ret = setup_rt_frame(ksig, sigmask_to_save(), regs);
++ signal_setup_done(ret, ksig, 0);
+ }
+
+ /*
+@@ -282,18 +278,15 @@ static void handle_signal(int sig,
+ */
+ static void do_signal(struct pt_regs *regs, int syscall)
+ {
+- struct k_sigaction ka;
+- siginfo_t info;
+- int signr;
++ struct ksignal ksig;
+
+ /* we want the common case to go fast, which is why we may in certain
+ * cases get here from kernel mode */
+ if (!user_mode(regs))
+ return;
+
+- signr = get_signal_to_deliver(&info, &ka, regs, NULL);
+- if (signr > 0) {
+- handle_signal(signr, &info, &ka, regs, syscall);
++ if (get_signal(&ksig)) {
++ handle_signal(&ksig, regs, syscall);
+ return;
+ }
+
diff --git a/queue-3.16/cris-use-get_signal-signal_setup_done.patch b/queue-3.16/cris-use-get_signal-signal_setup_done.patch
new file mode 100644
index 00000000..04d21806
--- /dev/null
+++ b/queue-3.16/cris-use-get_signal-signal_setup_done.patch
@@ -0,0 +1,442 @@
+From: Richard Weinberger <richard@nod.at>
+Date: Mon, 7 Oct 2013 12:56:24 +0200
+Subject: cris: Use get_signal() signal_setup_done()
+
+commit fa0197722eb7559a6a9733881bbb8d9e76364f33 upstream.
+
+Use the more generic functions get_signal() signal_setup_done()
+for signal delivery.
+
+Signed-off-by: Richard Weinberger <richard@nod.at>
+[bwh: Backported to 3.16 as dependency of commit 35634ffa1751
+ "signal: Always notice exiting tasks"]
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ arch/cris/arch-v10/kernel/signal.c | 79 +++++++++++++-----------------
+ arch/cris/arch-v32/kernel/signal.c | 77 ++++++++++++-----------------
+ 2 files changed, 63 insertions(+), 93 deletions(-)
+
+--- a/arch/cris/arch-v10/kernel/signal.c
++++ b/arch/cris/arch-v10/kernel/signal.c
+@@ -228,33 +228,33 @@ get_sigframe(struct k_sigaction *ka, str
+ * user-mode trampoline.
+ */
+
+-static int setup_frame(int sig, struct k_sigaction *ka,
+- sigset_t *set, struct pt_regs *regs)
++static int setup_frame(struct ksignal *ksig, sigset_t *set,
++ struct pt_regs *regs)
+ {
+ struct sigframe __user *frame;
+ unsigned long return_ip;
+ int err = 0;
+
+- frame = get_sigframe(ka, regs, sizeof(*frame));
++ frame = get_sigframe(&ksig->ka, regs, sizeof(*frame));
+
+ if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ err |= setup_sigcontext(&frame->sc, regs, set->sig[0]);
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ if (_NSIG_WORDS > 1) {
+ err |= __copy_to_user(frame->extramask, &set->sig[1],
+ sizeof(frame->extramask));
+ }
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /* Set up to return from userspace. If provided, use a stub
+ already in userspace. */
+- if (ka->sa.sa_flags & SA_RESTORER) {
+- return_ip = (unsigned long)ka->sa.sa_restorer;
++ if (ksig->ka.sa.sa_flags & SA_RESTORER) {
++ return_ip = (unsigned long)ksig->ka.sa.sa_restorer;
+ } else {
+ /* trampoline - the desired return ip is the retcode itself */
+ return_ip = (unsigned long)&frame->retcode;
+@@ -265,42 +265,38 @@ static int setup_frame(int sig, struct k
+ }
+
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /* Set up registers for signal handler */
+
+- regs->irp = (unsigned long) ka->sa.sa_handler; /* what we enter NOW */
++ regs->irp = (unsigned long) ksig->ka.sa.sa_handler; /* what we enter NOW */
+ regs->srp = return_ip; /* what we enter LATER */
+- regs->r10 = sig; /* first argument is signo */
++ regs->r10 = ksig->sig; /* first argument is signo */
+
+ /* actually move the usp to reflect the stacked frame */
+
+ wrusp((unsigned long)frame);
+
+ return 0;
+-
+-give_sigsegv:
+- force_sigsegv(sig, current);
+- return -EFAULT;
+ }
+
+-static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+- sigset_t *set, struct pt_regs *regs)
++static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
++ struct pt_regs *regs)
+ {
+ struct rt_sigframe __user *frame;
+ unsigned long return_ip;
+ int err = 0;
+
+- frame = get_sigframe(ka, regs, sizeof(*frame));
++ frame = get_sigframe(&ksig->ka, regs, sizeof(*frame));
+
+ if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ err |= __put_user(&frame->info, &frame->pinfo);
+ err |= __put_user(&frame->uc, &frame->puc);
+- err |= copy_siginfo_to_user(&frame->info, info);
++ err |= copy_siginfo_to_user(&frame->info, &ksig->info);
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /* Clear all the bits of the ucontext we don't use. */
+ err |= __clear_user(&frame->uc, offsetof(struct ucontext, uc_mcontext));
+@@ -312,12 +308,12 @@ static int setup_rt_frame(int sig, struc
+ err |= __save_altstack(&frame->uc.uc_stack, rdusp());
+
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /* Set up to return from userspace. If provided, use a stub
+ already in userspace. */
+- if (ka->sa.sa_flags & SA_RESTORER) {
+- return_ip = (unsigned long)ka->sa.sa_restorer;
++ if (ksig->ka.sa.sa_flags & SA_RESTORER) {
++ return_ip = (unsigned long)ksig->ka.sa.sa_restorer;
+ } else {
+ /* trampoline - the desired return ip is the retcode itself */
+ return_ip = (unsigned long)&frame->retcode;
+@@ -329,18 +325,18 @@ static int setup_rt_frame(int sig, struc
+ }
+
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /* TODO what is the current->exec_domain stuff and invmap ? */
+
+ /* Set up registers for signal handler */
+
+ /* What we enter NOW */
+- regs->irp = (unsigned long) ka->sa.sa_handler;
++ regs->irp = (unsigned long) ksig->ka.sa.sa_handler;
+ /* What we enter LATER */
+ regs->srp = return_ip;
+ /* First argument is signo */
+- regs->r10 = sig;
++ regs->r10 = ksig->sig;
+ /* Second argument is (siginfo_t *) */
+ regs->r11 = (unsigned long)&frame->info;
+ /* Third argument is unused */
+@@ -350,19 +346,14 @@ static int setup_rt_frame(int sig, struc
+ wrusp((unsigned long)frame);
+
+ return 0;
+-
+-give_sigsegv:
+- force_sigsegv(sig, current);
+- return -EFAULT;
+ }
+
+ /*
+ * OK, we're invoking a handler
+ */
+
+-static inline void handle_signal(int canrestart, unsigned long sig,
+- siginfo_t *info, struct k_sigaction *ka,
+- struct pt_regs *regs)
++static inline void handle_signal(int canrestart, struct ksignal *ksig,
++ struct pt_regs *regs)
+ {
+ sigset_t *oldset = sigmask_to_save();
+ int ret;
+@@ -383,7 +374,7 @@ static inline void handle_signal(int can
+ /* ERESTARTSYS means to restart the syscall if
+ * there is no handler or the handler was
+ * registered with SA_RESTART */
+- if (!(ka->sa.sa_flags & SA_RESTART)) {
++ if (!(ksig->ka.sa.sa_flags & SA_RESTART)) {
+ regs->r10 = -EINTR;
+ break;
+ }
+@@ -396,13 +387,12 @@ static inline void handle_signal(int can
+ }
+
+ /* Set up the stack frame */
+- if (ka->sa.sa_flags & SA_SIGINFO)
+- ret = setup_rt_frame(sig, ka, info, oldset, regs);
++ if (ksig->ka.sa.sa_flags & SA_SIGINFO)
++ ret = setup_rt_frame(ksig, oldset, regs);
+ else
+- ret = setup_frame(sig, ka, oldset, regs);
++ ret = setup_frame(ksig, oldset, regs);
+
+- if (ret == 0)
+- signal_delivered(sig, info, ka, regs, 0);
++ signal_setup_done(ret, ksig, 0);
+ }
+
+ /*
+@@ -419,9 +409,7 @@ static inline void handle_signal(int can
+
+ void do_signal(int canrestart, struct pt_regs *regs)
+ {
+- siginfo_t info;
+- int signr;
+- struct k_sigaction ka;
++ struct ksignal ksig;
+
+ /*
+ * We want the common case to go fast, which
+@@ -432,10 +420,9 @@ void do_signal(int canrestart, struct pt
+ if (!user_mode(regs))
+ return;
+
+- signr = get_signal_to_deliver(&info, &ka, regs, NULL);
+- if (signr > 0) {
++ if (get_signal(&ksig)) {
+ /* Whee! Actually deliver the signal. */
+- handle_signal(canrestart, signr, &info, &ka, regs);
++ handle_signal(canrestart, &ksig, regs);
+ return;
+ }
+
+--- a/arch/cris/arch-v32/kernel/signal.c
++++ b/arch/cris/arch-v32/kernel/signal.c
+@@ -215,23 +215,22 @@ get_sigframe(struct k_sigaction *ka, str
+ * trampoline.
+ */
+ static int
+-setup_frame(int sig, struct k_sigaction *ka, sigset_t *set,
+- struct pt_regs * regs)
++setup_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs)
+ {
+ int err;
+ unsigned long return_ip;
+ struct signal_frame __user *frame;
+
+ err = 0;
+- frame = get_sigframe(ka, regs, sizeof(*frame));
++ frame = get_sigframe(&ksig->ka, regs, sizeof(*frame));
+
+ if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ err |= setup_sigcontext(&frame->sc, regs, set->sig[0]);
+
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ if (_NSIG_WORDS > 1) {
+ err |= __copy_to_user(frame->extramask, &set->sig[1],
+@@ -239,14 +238,14 @@ setup_frame(int sig, struct k_sigaction
+ }
+
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /*
+ * Set up to return from user-space. If provided, use a stub
+ * already located in user-space.
+ */
+- if (ka->sa.sa_flags & SA_RESTORER) {
+- return_ip = (unsigned long)ka->sa.sa_restorer;
++ if (ksig->ka.sa.sa_flags & SA_RESTORER) {
++ return_ip = (unsigned long)ksig->ka.sa.sa_restorer;
+ } else {
+ /* Trampoline - the desired return ip is in the signal return page. */
+ return_ip = cris_signal_return_page;
+@@ -264,7 +263,7 @@ setup_frame(int sig, struct k_sigaction
+ }
+
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /*
+ * Set up registers for signal handler.
+@@ -273,42 +272,37 @@ setup_frame(int sig, struct k_sigaction
+ * Where the code enter later.
+ * First argument, signo.
+ */
+- regs->erp = (unsigned long) ka->sa.sa_handler;
++ regs->erp = (unsigned long) ksig->ka.sa.sa_handler;
+ regs->srp = return_ip;
+- regs->r10 = sig;
++ regs->r10 = ksig->sig;
+
+ /* Actually move the USP to reflect the stacked frame. */
+ wrusp((unsigned long)frame);
+
+ return 0;
+-
+-give_sigsegv:
+- force_sigsegv(sig, current);
+- return -EFAULT;
+ }
+
+ static int
+-setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+- sigset_t *set, struct pt_regs * regs)
++setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs)
+ {
+ int err;
+ unsigned long return_ip;
+ struct rt_signal_frame __user *frame;
+
+ err = 0;
+- frame = get_sigframe(ka, regs, sizeof(*frame));
++ frame = get_sigframe(&ksig->ka, regs, sizeof(*frame));
+
+ if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /* TODO: what is the current->exec_domain stuff and invmap ? */
+
+ err |= __put_user(&frame->info, &frame->pinfo);
+ err |= __put_user(&frame->uc, &frame->puc);
+- err |= copy_siginfo_to_user(&frame->info, info);
++ err |= copy_siginfo_to_user(&frame->info, &ksig->info);
+
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /* Clear all the bits of the ucontext we don't use. */
+ err |= __clear_user(&frame->uc, offsetof(struct ucontext, uc_mcontext));
+@@ -317,14 +311,14 @@ setup_rt_frame(int sig, struct k_sigacti
+ err |= __save_altstack(&frame->uc.uc_stack, rdusp());
+
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /*
+ * Set up to return from user-space. If provided, use a stub
+ * already located in user-space.
+ */
+- if (ka->sa.sa_flags & SA_RESTORER) {
+- return_ip = (unsigned long) ka->sa.sa_restorer;
++ if (ksig->ka.sa.sa_flags & SA_RESTORER) {
++ return_ip = (unsigned long) ksig->ka.sa.sa_restorer;
+ } else {
+ /* Trampoline - the desired return ip is in the signal return page. */
+ return_ip = cris_signal_return_page + 6;
+@@ -345,7 +339,7 @@ setup_rt_frame(int sig, struct k_sigacti
+ }
+
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /*
+ * Set up registers for signal handler.
+@@ -356,9 +350,9 @@ setup_rt_frame(int sig, struct k_sigacti
+ * Second argument is (siginfo_t *).
+ * Third argument is unused.
+ */
+- regs->erp = (unsigned long) ka->sa.sa_handler;
++ regs->erp = (unsigned long) ksig->ka.sa.sa_handler;
+ regs->srp = return_ip;
+- regs->r10 = sig;
++ regs->r10 = ksig->sig;
+ regs->r11 = (unsigned long) &frame->info;
+ regs->r12 = 0;
+
+@@ -366,17 +360,11 @@ setup_rt_frame(int sig, struct k_sigacti
+ wrusp((unsigned long)frame);
+
+ return 0;
+-
+-give_sigsegv:
+- force_sigsegv(sig, current);
+- return -EFAULT;
+ }
+
+ /* Invoke a signal handler to, well, handle the signal. */
+ static inline void
+-handle_signal(int canrestart, unsigned long sig,
+- siginfo_t *info, struct k_sigaction *ka,
+- struct pt_regs * regs)
++handle_signal(int canrestart, struct ksignal *ksig, struct pt_regs *regs)
+ {
+ sigset_t *oldset = sigmask_to_save();
+ int ret;
+@@ -404,7 +392,7 @@ handle_signal(int canrestart, unsigned l
+ * there is no handler, or the handler
+ * was registered with SA_RESTART.
+ */
+- if (!(ka->sa.sa_flags & SA_RESTART)) {
++ if (!(ksig->ka.sa.sa_flags & SA_RESTART)) {
+ regs->r10 = -EINTR;
+ break;
+ }
+@@ -423,13 +411,12 @@ handle_signal(int canrestart, unsigned l
+ }
+
+ /* Set up the stack frame. */
+- if (ka->sa.sa_flags & SA_SIGINFO)
+- ret = setup_rt_frame(sig, ka, info, oldset, regs);
++ if (ksig->ka.sa.sa_flags & SA_SIGINFO)
++ ret = setup_rt_frame(ksig, oldset, regs);
+ else
+- ret = setup_frame(sig, ka, oldset, regs);
++ ret = setup_frame(ksig, oldset, regs);
+
+- if (ret == 0)
+- signal_delivered(sig, info, ka, regs, 0);
++ signal_setup_done(ret, ksig, 0);
+ }
+
+ /*
+@@ -446,9 +433,7 @@ handle_signal(int canrestart, unsigned l
+ void
+ do_signal(int canrestart, struct pt_regs *regs)
+ {
+- int signr;
+- siginfo_t info;
+- struct k_sigaction ka;
++ struct ksignal ksig;
+
+ /*
+ * The common case should go fast, which is why this point is
+@@ -458,11 +443,9 @@ do_signal(int canrestart, struct pt_regs
+ if (!user_mode(regs))
+ return;
+
+- signr = get_signal_to_deliver(&info, &ka, regs, NULL);
+-
+- if (signr > 0) {
++ if (get_signal(&ksig)) {
+ /* Whee! Actually deliver the signal. */
+- handle_signal(canrestart, signr, &info, &ka, regs);
++ handle_signal(canrestart, &ksig, regs);
+ return;
+ }
+
diff --git a/queue-3.16/dmaengine-bcm2835-add-additional-defines-for-dma-registers.patch b/queue-3.16/dmaengine-bcm2835-add-additional-defines-for-dma-registers.patch
new file mode 100644
index 00000000..4d9d980e
--- /dev/null
+++ b/queue-3.16/dmaengine-bcm2835-add-additional-defines-for-dma-registers.patch
@@ -0,0 +1,97 @@
+From: Martin Sperl <kernel@martin.sperl.org>
+Date: Wed, 16 Mar 2016 12:24:57 -0700
+Subject: dmaengine: bcm2835: add additional defines for DMA-registers
+
+commit e42685d7a7d5afa6278561ffd85c475eae246be3 upstream.
+
+Add additional defines describing the DMA registers
+as well as adding some more documentation to those registers.
+
+Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
+Reviewed-by: Eric Anholt <eric@anholt.net>
+Signed-off-by: Eric Anholt <eric@anholt.net>
+Signed-off-by: Vinod Koul <vinod.koul@intel.com>
+[bwh: Backported to 3.16 as dependency of commit 9e528c799d17
+ "dmaengine: bcm2835: Fix abort of transactions"]
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ drivers/dma/bcm2835-dma.c | 57 +++++++++++++++++++++++++++++++++------
+ 1 file changed, 49 insertions(+), 8 deletions(-)
+
+--- a/drivers/dma/bcm2835-dma.c
++++ b/drivers/dma/bcm2835-dma.c
+@@ -91,26 +91,67 @@ struct bcm2835_desc {
+
+ #define BCM2835_DMA_CS 0x00
+ #define BCM2835_DMA_ADDR 0x04
++#define BCM2835_DMA_TI 0x08
+ #define BCM2835_DMA_SOURCE_AD 0x0c
+ #define BCM2835_DMA_DEST_AD 0x10
+-#define BCM2835_DMA_NEXTCB 0x1C
++#define BCM2835_DMA_LEN 0x14
++#define BCM2835_DMA_STRIDE 0x18
++#define BCM2835_DMA_NEXTCB 0x1c
++#define BCM2835_DMA_DEBUG 0x20
+
+ /* DMA CS Control and Status bits */
+-#define BCM2835_DMA_ACTIVE BIT(0)
+-#define BCM2835_DMA_INT BIT(2)
++#define BCM2835_DMA_ACTIVE BIT(0) /* activate the DMA */
++#define BCM2835_DMA_END BIT(1) /* current CB has ended */
++#define BCM2835_DMA_INT BIT(2) /* interrupt status */
++#define BCM2835_DMA_DREQ BIT(3) /* DREQ state */
+ #define BCM2835_DMA_ISPAUSED BIT(4) /* Pause requested or not active */
+ #define BCM2835_DMA_ISHELD BIT(5) /* Is held by DREQ flow control */
+-#define BCM2835_DMA_ERR BIT(8)
++#define BCM2835_DMA_WAITING_FOR_WRITES BIT(6) /* waiting for last
++ * AXI-write to ack
++ */
++#define BCM2835_DMA_ERR BIT(8)
++#define BCM2835_DMA_PRIORITY(x) ((x & 15) << 16) /* AXI priority */
++#define BCM2835_DMA_PANIC_PRIORITY(x) ((x & 15) << 20) /* panic priority */
++/* current value of TI.BCM2835_DMA_WAIT_RESP */
++#define BCM2835_DMA_WAIT_FOR_WRITES BIT(28)
++#define BCM2835_DMA_DIS_DEBUG BIT(29) /* disable debug pause signal */
+ #define BCM2835_DMA_ABORT BIT(30) /* Stop current CB, go to next, WO */
+ #define BCM2835_DMA_RESET BIT(31) /* WO, self clearing */
+
++/* Transfer information bits - also bcm2835_cb.info field */
+ #define BCM2835_DMA_INT_EN BIT(0)
++#define BCM2835_DMA_TDMODE BIT(1) /* 2D-Mode */
++#define BCM2835_DMA_WAIT_RESP BIT(3) /* wait for AXI-write to be acked */
+ #define BCM2835_DMA_D_INC BIT(4)
+-#define BCM2835_DMA_D_DREQ BIT(6)
++#define BCM2835_DMA_D_WIDTH BIT(5) /* 128bit writes if set */
++#define BCM2835_DMA_D_DREQ BIT(6) /* enable DREQ for destination */
++#define BCM2835_DMA_D_IGNORE BIT(7) /* ignore destination writes */
+ #define BCM2835_DMA_S_INC BIT(8)
+-#define BCM2835_DMA_S_DREQ BIT(10)
++#define BCM2835_DMA_S_WIDTH BIT(9) /* 128bit writes if set */
++#define BCM2835_DMA_S_DREQ BIT(10) /* enable SREQ for source */
++#define BCM2835_DMA_S_IGNORE BIT(11) /* ignore source reads - read 0 */
++#define BCM2835_DMA_BURST_LENGTH(x) ((x & 15) << 12)
++#define BCM2835_DMA_PER_MAP(x) ((x & 31) << 16) /* REQ source */
++#define BCM2835_DMA_WAIT(x) ((x & 31) << 21) /* add DMA-wait cycles */
++#define BCM2835_DMA_NO_WIDE_BURSTS BIT(26) /* no 2 beat write bursts */
+
+-#define BCM2835_DMA_PER_MAP(x) ((x) << 16)
++/* debug register bits */
++#define BCM2835_DMA_DEBUG_LAST_NOT_SET_ERR BIT(0)
++#define BCM2835_DMA_DEBUG_FIFO_ERR BIT(1)
++#define BCM2835_DMA_DEBUG_READ_ERR BIT(2)
++#define BCM2835_DMA_DEBUG_OUTSTANDING_WRITES_SHIFT 4
++#define BCM2835_DMA_DEBUG_OUTSTANDING_WRITES_BITS 4
++#define BCM2835_DMA_DEBUG_ID_SHIFT 16
++#define BCM2835_DMA_DEBUG_ID_BITS 9
++#define BCM2835_DMA_DEBUG_STATE_SHIFT 16
++#define BCM2835_DMA_DEBUG_STATE_BITS 9
++#define BCM2835_DMA_DEBUG_VERSION_SHIFT 25
++#define BCM2835_DMA_DEBUG_VERSION_BITS 3
++#define BCM2835_DMA_DEBUG_LITE BIT(28)
++
++/* shared registers for all dma channels */
++#define BCM2835_DMA_INT_STATUS 0xfe0
++#define BCM2835_DMA_ENABLE 0xff0
+
+ #define BCM2835_DMA_DATA_TYPE_S8 1
+ #define BCM2835_DMA_DATA_TYPE_S16 2
diff --git a/queue-3.16/dmaengine-bcm2835-fix-abort-of-transactions.patch b/queue-3.16/dmaengine-bcm2835-fix-abort-of-transactions.patch
index a900cf54..c86490d1 100644
--- a/queue-3.16/dmaengine-bcm2835-fix-abort-of-transactions.patch
+++ b/queue-3.16/dmaengine-bcm2835-fix-abort-of-transactions.patch
@@ -79,7 +79,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
--- a/drivers/dma/bcm2835-dma.c
+++ b/drivers/dma/bcm2835-dma.c
-@@ -150,13 +150,11 @@ static void bcm2835_dma_desc_free(struct
+@@ -191,13 +191,11 @@ static void bcm2835_dma_desc_free(struct
kfree(desc);
}
@@ -95,7 +95,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
/*
* A zero control block address means the channel is idle.
* (The ACTIVE flag in the CS register is not a reliable indicator.)
-@@ -168,25 +166,16 @@ static int bcm2835_dma_abort(void __iome
+@@ -209,25 +207,16 @@ static int bcm2835_dma_abort(void __iome
writel(0, chan_base + BCM2835_DMA_CS);
/* Wait for any current AXI transfer to complete */
@@ -127,7 +127,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
return 0;
}
-@@ -465,7 +454,6 @@ static int bcm2835_dma_terminate_all(str
+@@ -506,7 +495,6 @@ static int bcm2835_dma_terminate_all(str
{
struct bcm2835_dmadev *d = to_bcm2835_dma_dev(c->vc.chan.device);
unsigned long flags;
@@ -135,7 +135,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
LIST_HEAD(head);
spin_lock_irqsave(&c->vc.lock, flags);
-@@ -478,18 +466,7 @@ static int bcm2835_dma_terminate_all(str
+@@ -519,18 +507,7 @@ static int bcm2835_dma_terminate_all(str
/* stop DMA activity */
if (c->desc) {
c->desc = NULL;
diff --git a/queue-3.16/dmaengine-bcm2835-fix-interrupt-race-on-rt.patch b/queue-3.16/dmaengine-bcm2835-fix-interrupt-race-on-rt.patch
index 879997b4..e9791249 100644
--- a/queue-3.16/dmaengine-bcm2835-fix-interrupt-race-on-rt.patch
+++ b/queue-3.16/dmaengine-bcm2835-fix-interrupt-race-on-rt.patch
@@ -81,7 +81,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
--- a/drivers/dma/bcm2835-dma.c
+++ b/drivers/dma/bcm2835-dma.c
-@@ -156,7 +156,12 @@ static int bcm2835_dma_abort(void __iome
+@@ -197,7 +197,12 @@ static int bcm2835_dma_abort(void __iome
long int timeout = 10000;
cs = readl(chan_base + BCM2835_DMA_CS);
@@ -95,7 +95,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
return 0;
/* Write 0 to the active bit - Pause the DMA */
-@@ -211,8 +216,15 @@ static irqreturn_t bcm2835_dma_callback(
+@@ -252,8 +257,15 @@ static irqreturn_t bcm2835_dma_callback(
spin_lock_irqsave(&c->vc.lock, flags);
@@ -113,7 +113,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
d = c->desc;
-@@ -221,9 +233,6 @@ static irqreturn_t bcm2835_dma_callback(
+@@ -262,9 +274,6 @@ static irqreturn_t bcm2835_dma_callback(
vchan_cyclic_callback(&d->vd);
}
@@ -123,7 +123,7 @@ Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
spin_unlock_irqrestore(&c->vc.lock, flags);
return IRQ_HANDLED;
-@@ -466,19 +475,14 @@ static int bcm2835_dma_terminate_all(str
+@@ -507,19 +516,14 @@ static int bcm2835_dma_terminate_all(str
list_del_init(&c->node);
spin_unlock(&d->lock);
diff --git a/queue-3.16/frv-use-get_signal-signal_setup_done.patch b/queue-3.16/frv-use-get_signal-signal_setup_done.patch
new file mode 100644
index 00000000..ab8d9fe5
--- /dev/null
+++ b/queue-3.16/frv-use-get_signal-signal_setup_done.patch
@@ -0,0 +1,267 @@
+From: Richard Weinberger <richard@nod.at>
+Date: Mon, 7 Oct 2013 13:46:11 +0200
+Subject: frv: Use get_signal() signal_setup_done()
+
+commit 720f36b983224ac52b6acdd8b646ce30f6b38763 upstream.
+
+Use the more generic functions get_signal() signal_setup_done()
+for signal delivery.
+
+Signed-off-by: Richard Weinberger <richard@nod.at>
+[bwh: Backported to 3.16 as dependency of commit 35634ffa1751
+ "signal: Always notice exiting tasks"]
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ arch/frv/kernel/signal.c | 99 ++++++++++++++++------------------------
+ 1 file changed, 40 insertions(+), 59 deletions(-)
+
+--- a/arch/frv/kernel/signal.c
++++ b/arch/frv/kernel/signal.c
+@@ -180,17 +180,17 @@ static inline void __user *get_sigframe(
+ /*
+ *
+ */
+-static int setup_frame(int sig, struct k_sigaction *ka, sigset_t *set)
++static int setup_frame(struct ksignal *ksig, sigset_t *set)
+ {
+ struct sigframe __user *frame;
+- int rsig;
++ int rsig, sig = ksig->sig;
+
+ set_fs(USER_DS);
+
+- frame = get_sigframe(ka, sizeof(*frame));
++ frame = get_sigframe(&ksig->ka, sizeof(*frame));
+
+ if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ rsig = sig;
+ if (sig < 32 &&
+@@ -199,22 +199,22 @@ static int setup_frame(int sig, struct k
+ rsig = __current_thread_info->exec_domain->signal_invmap[sig];
+
+ if (__put_user(rsig, &frame->sig) < 0)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ if (setup_sigcontext(&frame->sc, set->sig[0]))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ if (_NSIG_WORDS > 1) {
+ if (__copy_to_user(frame->extramask, &set->sig[1],
+ sizeof(frame->extramask)))
+- goto give_sigsegv;
++ return -EFAULT;
+ }
+
+ /* Set up to return from userspace. If provided, use a stub
+ * already in userspace. */
+- if (ka->sa.sa_flags & SA_RESTORER) {
+- if (__put_user(ka->sa.sa_restorer, &frame->pretcode) < 0)
+- goto give_sigsegv;
++ if (ksig->ka.sa.sa_flags & SA_RESTORER) {
++ if (__put_user(ksig->ka.sa.sa_restorer, &frame->pretcode) < 0)
++ return -EFAULT;
+ }
+ else {
+ /* Set up the following code on the stack:
+@@ -224,7 +224,7 @@ static int setup_frame(int sig, struct k
+ if (__put_user((__sigrestore_t)frame->retcode, &frame->pretcode) ||
+ __put_user(0x8efc0000|__NR_sigreturn, &frame->retcode[0]) ||
+ __put_user(0xc0700000, &frame->retcode[1]))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ flush_icache_range((unsigned long) frame->retcode,
+ (unsigned long) (frame->retcode + 2));
+@@ -233,14 +233,14 @@ static int setup_frame(int sig, struct k
+ /* Set up registers for the signal handler */
+ if (current->personality & FDPIC_FUNCPTRS) {
+ struct fdpic_func_descriptor __user *funcptr =
+- (struct fdpic_func_descriptor __user *) ka->sa.sa_handler;
++ (struct fdpic_func_descriptor __user *) ksig->ka.sa.sa_handler;
+ struct fdpic_func_descriptor desc;
+ if (copy_from_user(&desc, funcptr, sizeof(desc)))
+- goto give_sigsegv;
++ return -EFAULT;
+ __frame->pc = desc.text;
+ __frame->gr15 = desc.GOT;
+ } else {
+- __frame->pc = (unsigned long) ka->sa.sa_handler;
++ __frame->pc = (unsigned long) ksig->ka.sa.sa_handler;
+ __frame->gr15 = 0;
+ }
+
+@@ -255,29 +255,23 @@ static int setup_frame(int sig, struct k
+ #endif
+
+ return 0;
+-
+-give_sigsegv:
+- force_sigsegv(sig, current);
+- return -EFAULT;
+-
+ } /* end setup_frame() */
+
+ /*****************************************************************************/
+ /*
+ *
+ */
+-static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+- sigset_t *set)
++static int setup_rt_frame(struct ksignal *ksig, sigset_t *set)
+ {
+ struct rt_sigframe __user *frame;
+- int rsig;
++ int rsig, sig = ksig->sig;
+
+ set_fs(USER_DS);
+
+- frame = get_sigframe(ka, sizeof(*frame));
++ frame = get_sigframe(&ksig->ka, sizeof(*frame));
+
+ if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ rsig = sig;
+ if (sig < 32 &&
+@@ -288,28 +282,28 @@ static int setup_rt_frame(int sig, struc
+ if (__put_user(rsig, &frame->sig) ||
+ __put_user(&frame->info, &frame->pinfo) ||
+ __put_user(&frame->uc, &frame->puc))
+- goto give_sigsegv;
++ return -EFAULT;
+
+- if (copy_siginfo_to_user(&frame->info, info))
+- goto give_sigsegv;
++ if (copy_siginfo_to_user(&frame->info, &ksig->info))
++ return -EFAULT;
+
+ /* Create the ucontext. */
+ if (__put_user(0, &frame->uc.uc_flags) ||
+ __put_user(NULL, &frame->uc.uc_link) ||
+ __save_altstack(&frame->uc.uc_stack, __frame->sp))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ if (setup_sigcontext(&frame->uc.uc_mcontext, set->sig[0]))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ if (__copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /* Set up to return from userspace. If provided, use a stub
+ * already in userspace. */
+- if (ka->sa.sa_flags & SA_RESTORER) {
+- if (__put_user(ka->sa.sa_restorer, &frame->pretcode))
+- goto give_sigsegv;
++ if (ksig->ka.sa.sa_flags & SA_RESTORER) {
++ if (__put_user(ksig->ka.sa.sa_restorer, &frame->pretcode))
++ return -EFAULT;
+ }
+ else {
+ /* Set up the following code on the stack:
+@@ -319,7 +313,7 @@ static int setup_rt_frame(int sig, struc
+ if (__put_user((__sigrestore_t)frame->retcode, &frame->pretcode) ||
+ __put_user(0x8efc0000|__NR_rt_sigreturn, &frame->retcode[0]) ||
+ __put_user(0xc0700000, &frame->retcode[1]))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ flush_icache_range((unsigned long) frame->retcode,
+ (unsigned long) (frame->retcode + 2));
+@@ -328,14 +322,14 @@ static int setup_rt_frame(int sig, struc
+ /* Set up registers for signal handler */
+ if (current->personality & FDPIC_FUNCPTRS) {
+ struct fdpic_func_descriptor __user *funcptr =
+- (struct fdpic_func_descriptor __user *) ka->sa.sa_handler;
++ (struct fdpic_func_descriptor __user *) ksig->ka.sa.sa_handler;
+ struct fdpic_func_descriptor desc;
+ if (copy_from_user(&desc, funcptr, sizeof(desc)))
+- goto give_sigsegv;
++ return -EFAULT;
+ __frame->pc = desc.text;
+ __frame->gr15 = desc.GOT;
+ } else {
+- __frame->pc = (unsigned long) ka->sa.sa_handler;
++ __frame->pc = (unsigned long) ksig->ka.sa.sa_handler;
+ __frame->gr15 = 0;
+ }
+
+@@ -349,21 +343,15 @@ static int setup_rt_frame(int sig, struc
+ sig, current->comm, current->pid, frame, __frame->pc,
+ frame->pretcode);
+ #endif
+-
+ return 0;
+
+-give_sigsegv:
+- force_sigsegv(sig, current);
+- return -EFAULT;
+-
+ } /* end setup_rt_frame() */
+
+ /*****************************************************************************/
+ /*
+ * OK, we're invoking a handler
+ */
+-static void handle_signal(unsigned long sig, siginfo_t *info,
+- struct k_sigaction *ka)
++static void handle_signal(struct ksignal *ksig)
+ {
+ sigset_t *oldset = sigmask_to_save();
+ int ret;
+@@ -378,7 +366,7 @@ static void handle_signal(unsigned long
+ break;
+
+ case -ERESTARTSYS:
+- if (!(ka->sa.sa_flags & SA_RESTART)) {
++ if (!(ksig->ka.sa.sa_flags & SA_RESTART)) {
+ __frame->gr8 = -EINTR;
+ break;
+ }
+@@ -392,16 +380,12 @@ static void handle_signal(unsigned long
+ }
+
+ /* Set up the stack frame */
+- if (ka->sa.sa_flags & SA_SIGINFO)
+- ret = setup_rt_frame(sig, ka, info, oldset);
++ if (ksig->ka.sa.sa_flags & SA_SIGINFO)
++ ret = setup_rt_frame(ksig, oldset);
+ else
+- ret = setup_frame(sig, ka, oldset);
++ ret = setup_frame(ksig, oldset);
+
+- if (ret)
+- return;
+-
+- signal_delivered(sig, info, ka, __frame,
+- test_thread_flag(TIF_SINGLESTEP));
++ signal_setup_done(ret, ksig, test_thread_flag(TIF_SINGLESTEP));
+ } /* end handle_signal() */
+
+ /*****************************************************************************/
+@@ -412,13 +396,10 @@ static void handle_signal(unsigned long
+ */
+ static void do_signal(void)
+ {
+- struct k_sigaction ka;
+- siginfo_t info;
+- int signr;
+-
+- signr = get_signal_to_deliver(&info, &ka, __frame, NULL);
+- if (signr > 0) {
+- handle_signal(signr, &info, &ka);
++ struct ksignal ksig;
++
++ if (get_signal(&ksig)) {
++ handle_signal(&ksig);
+ return;
+ }
+
diff --git a/queue-3.16/hexagon-use-get_signal-signal_setup_done.patch b/queue-3.16/hexagon-use-get_signal-signal_setup_done.patch
new file mode 100644
index 00000000..f7178bbc
--- /dev/null
+++ b/queue-3.16/hexagon-use-get_signal-signal_setup_done.patch
@@ -0,0 +1,127 @@
+From: Richard Weinberger <richard@nod.at>
+Date: Mon, 7 Oct 2013 13:50:08 +0200
+Subject: hexagon: Use get_signal() signal_setup_done()
+
+commit ac443624490f7033aefd06713e7761aee5977de3 upstream.
+
+Use the more generic functions get_signal() signal_setup_done()
+for signal delivery.
+
+Acked-by: Richard Kuo <rkuo@codeaurora.org>
+Signed-off-by: Richard Weinberger <richard@nod.at>
+[bwh: Backported to 3.16 as dependency of commit 35634ffa1751
+ "signal: Always notice exiting tasks"]
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ arch/hexagon/kernel/signal.c | 45 +++++++++++++++---------------------
+ 1 file changed, 18 insertions(+), 27 deletions(-)
+
+--- a/arch/hexagon/kernel/signal.c
++++ b/arch/hexagon/kernel/signal.c
+@@ -112,20 +112,20 @@ static int restore_sigcontext(struct pt_
+ /*
+ * Setup signal stack frame with siginfo structure
+ */
+-static int setup_rt_frame(int signr, struct k_sigaction *ka, siginfo_t *info,
+- sigset_t *set, struct pt_regs *regs)
++static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
++ struct pt_regs *regs)
+ {
+ int err = 0;
+ struct rt_sigframe __user *frame;
+ struct hexagon_vdso *vdso = current->mm->context.vdso;
+
+- frame = get_sigframe(ka, regs, sizeof(struct rt_sigframe));
++ frame = get_sigframe(&ksig->ka, regs, sizeof(struct rt_sigframe));
+
+ if (!access_ok(VERIFY_WRITE, frame, sizeof(struct rt_sigframe)))
+- goto sigsegv;
++ return -EFAULT;
+
+- if (copy_siginfo_to_user(&frame->info, info))
+- goto sigsegv;
++ if (copy_siginfo_to_user(&frame->info, &ksig->info))
++ return -EFAULT;
+
+ /* The on-stack signal trampoline is no longer executed;
+ * however, the libgcc signal frame unwinding code checks for
+@@ -137,29 +137,26 @@ static int setup_rt_frame(int signr, str
+ err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
+ err |= __save_altstack(&frame->uc.uc_stack, user_stack_pointer(regs));
+ if (err)
+- goto sigsegv;
++ return -EFAULT;
+
+ /* Load r0/r1 pair with signumber/siginfo pointer... */
+ regs->r0100 = ((unsigned long long)((unsigned long)&frame->info) << 32)
+- | (unsigned long long)signr;
++ | (unsigned long long)ksig->sig;
+ regs->r02 = (unsigned long) &frame->uc;
+ regs->r31 = (unsigned long) vdso->rt_signal_trampoline;
+ pt_psp(regs) = (unsigned long) frame;
+- pt_set_elr(regs, (unsigned long)ka->sa.sa_handler);
++ pt_set_elr(regs, (unsigned long)ksig->ka.sa.sa_handler);
+
+ return 0;
+-
+-sigsegv:
+- force_sigsegv(signr, current);
+- return -EFAULT;
+ }
+
+ /*
+ * Setup invocation of signal handler
+ */
+-static void handle_signal(int sig, siginfo_t *info, struct k_sigaction *ka,
+- struct pt_regs *regs)
++static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)
+ {
++ int ret;
++
+ /*
+ * If we're handling a signal that aborted a system call,
+ * set up the error return value before adding the signal
+@@ -173,7 +170,7 @@ static void handle_signal(int sig, sigin
+ regs->r00 = -EINTR;
+ break;
+ case -ERESTARTSYS:
+- if (!(ka->sa.sa_flags & SA_RESTART)) {
++ if (!(ksig->ka.sa.sa_flags & SA_RESTART)) {
+ regs->r00 = -EINTR;
+ break;
+ }
+@@ -193,11 +190,9 @@ static void handle_signal(int sig, sigin
+ * only set up the rt_frame flavor.
+ */
+ /* If there was an error on setup, no signal was delivered. */
+- if (setup_rt_frame(sig, ka, info, sigmask_to_save(), regs) < 0)
+- return;
++ ret = setup_rt_frame(ksig, sigmask_to_save(), regs);
+
+- signal_delivered(sig, info, ka, regs,
+- test_thread_flag(TIF_SINGLESTEP));
++ signal_setup_done(ret, ksig, test_thread_flag(TIF_SINGLESTEP));
+ }
+
+ /*
+@@ -205,17 +200,13 @@ static void handle_signal(int sig, sigin
+ */
+ void do_signal(struct pt_regs *regs)
+ {
+- struct k_sigaction sigact;
+- siginfo_t info;
+- int signo;
++ struct ksignal ksig;
+
+ if (!user_mode(regs))
+ return;
+
+- signo = get_signal_to_deliver(&info, &sigact, regs, NULL);
+-
+- if (signo > 0) {
+- handle_signal(signo, &info, &sigact, regs);
++ if (get_signal(&ksig)) {
++ handle_signal(&ksig, regs);
+ return;
+ }
+
diff --git a/queue-3.16/ia64-use-get_signal-signal_setup_done.patch b/queue-3.16/ia64-use-get_signal-signal_setup_done.patch
new file mode 100644
index 00000000..976b5277
--- /dev/null
+++ b/queue-3.16/ia64-use-get_signal-signal_setup_done.patch
@@ -0,0 +1,158 @@
+From: Richard Weinberger <richard@nod.at>
+Date: Mon, 7 Oct 2013 23:07:51 +0200
+Subject: ia64: Use get_signal() signal_setup_done()
+
+commit 98c20309b97fc30001adf643cf876125f334fd8a upstream.
+
+Use the more generic functions get_signal() signal_setup_done()
+for signal delivery.
+This inverts also the return codes of force_sigsegv_info()
+and setup_frame() to follow the kernel convention.
+
+Signed-off-by: Richard Weinberger <richard@nod.at>
+[bwh: Backported to 3.16 as dependency of commit 35634ffa1751
+ "signal: Always notice exiting tasks"]
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ arch/ia64/kernel/signal.c | 46 ++++++++++++++++++---------------------
+ 1 file changed, 21 insertions(+), 25 deletions(-)
+
+--- a/arch/ia64/kernel/signal.c
++++ b/arch/ia64/kernel/signal.c
+@@ -309,12 +309,11 @@ force_sigsegv_info (int sig, void __user
+ si.si_uid = from_kuid_munged(current_user_ns(), current_uid());
+ si.si_addr = addr;
+ force_sig_info(SIGSEGV, &si, current);
+- return 0;
++ return 1;
+ }
+
+ static long
+-setup_frame (int sig, struct k_sigaction *ka, siginfo_t *info, sigset_t *set,
+- struct sigscratch *scr)
++setup_frame(struct ksignal *ksig, sigset_t *set, struct sigscratch *scr)
+ {
+ extern char __kernel_sigtramp[];
+ unsigned long tramp_addr, new_rbs = 0, new_sp;
+@@ -323,7 +322,7 @@ setup_frame (int sig, struct k_sigaction
+
+ new_sp = scr->pt.r12;
+ tramp_addr = (unsigned long) __kernel_sigtramp;
+- if (ka->sa.sa_flags & SA_ONSTACK) {
++ if (ksig->ka.sa.sa_flags & SA_ONSTACK) {
+ int onstack = sas_ss_flags(new_sp);
+
+ if (onstack == 0) {
+@@ -347,29 +346,29 @@ setup_frame (int sig, struct k_sigaction
+ */
+ check_sp = (new_sp - sizeof(*frame)) & -STACK_ALIGN;
+ if (!likely(on_sig_stack(check_sp)))
+- return force_sigsegv_info(sig, (void __user *)
++ return force_sigsegv_info(ksig->sig, (void __user *)
+ check_sp);
+ }
+ }
+ frame = (void __user *) ((new_sp - sizeof(*frame)) & -STACK_ALIGN);
+
+ if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
+- return force_sigsegv_info(sig, frame);
++ return force_sigsegv_info(ksig->sig, frame);
+
+- err = __put_user(sig, &frame->arg0);
++ err = __put_user(ksig->sig, &frame->arg0);
+ err |= __put_user(&frame->info, &frame->arg1);
+ err |= __put_user(&frame->sc, &frame->arg2);
+ err |= __put_user(new_rbs, &frame->sc.sc_rbs_base);
+ err |= __put_user(0, &frame->sc.sc_loadrs); /* initialize to zero */
+- err |= __put_user(ka->sa.sa_handler, &frame->handler);
++ err |= __put_user(ksig->ka.sa.sa_handler, &frame->handler);
+
+- err |= copy_siginfo_to_user(&frame->info, info);
++ err |= copy_siginfo_to_user(&frame->info, &ksig->info);
+
+ err |= __save_altstack(&frame->sc.sc_stack, scr->pt.r12);
+ err |= setup_sigcontext(&frame->sc, set, scr);
+
+ if (unlikely(err))
+- return force_sigsegv_info(sig, frame);
++ return force_sigsegv_info(ksig->sig, frame);
+
+ scr->pt.r12 = (unsigned long) frame - 16; /* new stack pointer */
+ scr->pt.ar_fpsr = FPSR_DEFAULT; /* reset fpsr for signal handler */
+@@ -394,22 +393,20 @@ setup_frame (int sig, struct k_sigaction
+
+ #if DEBUG_SIG
+ printk("SIG deliver (%s:%d): sig=%d sp=%lx ip=%lx handler=%p\n",
+- current->comm, current->pid, sig, scr->pt.r12, frame->sc.sc_ip, frame->handler);
++ current->comm, current->pid, ksig->sig, scr->pt.r12, frame->sc.sc_ip, frame->handler);
+ #endif
+- return 1;
++ return 0;
+ }
+
+ static long
+-handle_signal (unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
+- struct sigscratch *scr)
++handle_signal (struct ksignal *ksig, struct sigscratch *scr)
+ {
+- if (!setup_frame(sig, ka, info, sigmask_to_save(), scr))
+- return 0;
++ int ret = setup_frame(ksig, sigmask_to_save(), scr);
+
+- signal_delivered(sig, info, ka, &scr->pt,
+- test_thread_flag(TIF_SINGLESTEP));
++ if (!ret)
++ signal_setup_done(ret, ksig, test_thread_flag(TIF_SINGLESTEP));
+
+- return 1;
++ return ret;
+ }
+
+ /*
+@@ -419,17 +416,16 @@ handle_signal (unsigned long sig, struct
+ void
+ ia64_do_signal (struct sigscratch *scr, long in_syscall)
+ {
+- struct k_sigaction ka;
+- siginfo_t info;
+ long restart = in_syscall;
+ long errno = scr->pt.r8;
++ struct ksignal ksig;
+
+ /*
+ * This only loops in the rare cases of handle_signal() failing, in which case we
+ * need to push through a forced SIGSEGV.
+ */
+ while (1) {
+- int signr = get_signal_to_deliver(&info, &ka, &scr->pt, NULL);
++ get_signal(&ksig);
+
+ /*
+ * get_signal_to_deliver() may have run a debugger (via notify_parent())
+@@ -446,7 +442,7 @@ ia64_do_signal (struct sigscratch *scr,
+ */
+ restart = 0;
+
+- if (signr <= 0)
++ if (ksig.sig <= 0)
+ break;
+
+ if (unlikely(restart)) {
+@@ -458,7 +454,7 @@ ia64_do_signal (struct sigscratch *scr,
+ break;
+
+ case ERESTARTSYS:
+- if ((ka.sa.sa_flags & SA_RESTART) == 0) {
++ if ((ksig.ka.sa.sa_flags & SA_RESTART) == 0) {
+ scr->pt.r8 = EINTR;
+ /* note: scr->pt.r10 is already -1 */
+ break;
+@@ -473,7 +469,7 @@ ia64_do_signal (struct sigscratch *scr,
+ * Whee! Actually deliver the signal. If the delivery failed, we need to
+ * continue to iterate in this loop so we can deliver the SIGSEGV...
+ */
+- if (handle_signal(signr, &ka, &info, scr))
++ if (handle_signal(&ksig, scr))
+ return;
+ }
+
diff --git a/queue-3.16/m32r-use-get_signal-signal_setup_done.patch b/queue-3.16/m32r-use-get_signal-signal_setup_done.patch
new file mode 100644
index 00000000..287286e7
--- /dev/null
+++ b/queue-3.16/m32r-use-get_signal-signal_setup_done.patch
@@ -0,0 +1,156 @@
+From: Richard Weinberger <richard@nod.at>
+Date: Mon, 7 Oct 2013 13:54:22 +0200
+Subject: m32r: Use get_signal() signal_setup_done()
+
+commit 0f5bef660a7c3b030eb60ceb29e3b2d89f894f56 upstream.
+
+Use the more generic functions get_signal() signal_setup_done()
+for signal delivery.
+
+Signed-off-by: Richard Weinberger <richard@nod.at>
+[bwh: Backported to 3.16 as dependency of commit 35634ffa1751
+ "signal: Always notice exiting tasks"]
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ arch/m32r/kernel/signal.c | 47 +++++++++++++++++----------------------
+ 1 file changed, 20 insertions(+), 27 deletions(-)
+
+--- a/arch/m32r/kernel/signal.c
++++ b/arch/m32r/kernel/signal.c
+@@ -173,17 +173,17 @@ get_sigframe(struct k_sigaction *ka, uns
+ return (void __user *)((sp - frame_size) & -8ul);
+ }
+
+-static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+- sigset_t *set, struct pt_regs *regs)
++static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
++ struct pt_regs *regs)
+ {
+ struct rt_sigframe __user *frame;
+ int err = 0;
+- int signal;
++ int signal, sig = ksig->sig;
+
+- frame = get_sigframe(ka, regs->spu, sizeof(*frame));
++ frame = get_sigframe(&ksig->ka, regs->spu, sizeof(*frame));
+
+ if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ signal = current_thread_info()->exec_domain
+ && current_thread_info()->exec_domain->signal_invmap
+@@ -193,13 +193,13 @@ static int setup_rt_frame(int sig, struc
+
+ err |= __put_user(signal, &frame->sig);
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ err |= __put_user(&frame->info, &frame->pinfo);
+ err |= __put_user(&frame->uc, &frame->puc);
+- err |= copy_siginfo_to_user(&frame->info, info);
++ err |= copy_siginfo_to_user(&frame->info, &ksig->info);
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /* Create the ucontext. */
+ err |= __put_user(0, &frame->uc.uc_flags);
+@@ -208,17 +208,17 @@ static int setup_rt_frame(int sig, struc
+ err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, set->sig[0]);
+ err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /* Set up to return from userspace. */
+- regs->lr = (unsigned long)ka->sa.sa_restorer;
++ regs->lr = (unsigned long)ksig->ka.sa.sa_restorer;
+
+ /* Set up registers for signal handler */
+ regs->spu = (unsigned long)frame;
+ regs->r0 = signal; /* Arg for signal handler */
+ regs->r1 = (unsigned long)&frame->info;
+ regs->r2 = (unsigned long)&frame->uc;
+- regs->bpc = (unsigned long)ka->sa.sa_handler;
++ regs->bpc = (unsigned long)ksig->ka.sa.sa_handler;
+
+ set_fs(USER_DS);
+
+@@ -228,10 +228,6 @@ static int setup_rt_frame(int sig, struc
+ #endif
+
+ return 0;
+-
+-give_sigsegv:
+- force_sigsegv(sig, current);
+- return -EFAULT;
+ }
+
+ static int prev_insn(struct pt_regs *regs)
+@@ -252,9 +248,10 @@ static int prev_insn(struct pt_regs *reg
+ */
+
+ static void
+-handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
+- struct pt_regs *regs)
++handle_signal(struct ksignal *ksig, struct pt_regs *regs)
+ {
++ int ret;
++
+ /* Are we from a system call? */
+ if (regs->syscall_nr >= 0) {
+ /* If so, check system call restarting.. */
+@@ -265,7 +262,7 @@ handle_signal(unsigned long sig, struct
+ break;
+
+ case -ERESTARTSYS:
+- if (!(ka->sa.sa_flags & SA_RESTART)) {
++ if (!(ksig->ka.sa.sa_flags & SA_RESTART)) {
+ regs->r0 = -EINTR;
+ break;
+ }
+@@ -278,10 +275,9 @@ handle_signal(unsigned long sig, struct
+ }
+
+ /* Set up the stack frame */
+- if (setup_rt_frame(sig, ka, info, sigmask_to_save(), regs))
+- return;
++ ret = setup_rt_frame(ksig, sigmask_to_save(), regs);
+
+- signal_delivered(sig, info, ka, regs, 0);
++ signal_setup_done(ret, ksig, 0);
+ }
+
+ /*
+@@ -291,9 +287,7 @@ handle_signal(unsigned long sig, struct
+ */
+ static void do_signal(struct pt_regs *regs)
+ {
+- siginfo_t info;
+- int signr;
+- struct k_sigaction ka;
++ struct ksignal ksig;
+
+ /*
+ * We want the common case to go fast, which
+@@ -304,8 +298,7 @@ static void do_signal(struct pt_regs *re
+ if (!user_mode(regs))
+ return;
+
+- signr = get_signal_to_deliver(&info, &ka, regs, NULL);
+- if (signr > 0) {
++ if (get_signal(&ksig)) {
+ /* Re-enable any watchpoints before delivering the
+ * signal to user space. The processor register will
+ * have been cleared if the watchpoint triggered
+@@ -313,7 +306,7 @@ static void do_signal(struct pt_regs *re
+ */
+
+ /* Whee! Actually deliver the signal. */
+- handle_signal(signr, &ka, &info, regs);
++ handle_signal(&ksig, regs);
+
+ return;
+ }
diff --git a/queue-3.16/m68k-use-get_signal-signal_setup_done.patch b/queue-3.16/m68k-use-get_signal-signal_setup_done.patch
new file mode 100644
index 00000000..5ba8ff96
--- /dev/null
+++ b/queue-3.16/m68k-use-get_signal-signal_setup_done.patch
@@ -0,0 +1,191 @@
+From: Richard Weinberger <richard@nod.at>
+Date: Mon, 7 Oct 2013 22:55:48 +0200
+Subject: m68k: Use get_signal() signal_setup_done()
+
+commit 0d97500d393012690f3579056629bea0369e6554 upstream.
+
+Use the more generic functions get_signal() signal_setup_done()
+for signal delivery.
+
+Signed-off-by: Richard Weinberger <richard@nod.at>
+[bwh: Backported to 3.16 as dependency of commit 35634ffa1751
+ "signal: Always notice exiting tasks"]
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ arch/m68k/kernel/signal.c | 63 +++++++++++++++------------------------
+ 1 file changed, 24 insertions(+), 39 deletions(-)
+
+--- a/arch/m68k/kernel/signal.c
++++ b/arch/m68k/kernel/signal.c
+@@ -850,23 +850,23 @@ get_sigframe(struct k_sigaction *ka, str
+ return (void __user *)((usp - frame_size) & -8UL);
+ }
+
+-static int setup_frame (int sig, struct k_sigaction *ka,
+- sigset_t *set, struct pt_regs *regs)
++static int setup_frame(struct ksignal *ksig, sigset_t *set,
++ struct pt_regs *regs)
+ {
+ struct sigframe __user *frame;
+ int fsize = frame_extra_sizes(regs->format);
+ struct sigcontext context;
+- int err = 0;
++ int err = 0, sig = ksig->sig;
+
+ if (fsize < 0) {
+ #ifdef DEBUG
+ printk ("setup_frame: Unknown frame format %#x\n",
+ regs->format);
+ #endif
+- goto give_sigsegv;
++ return -EFAULT;
+ }
+
+- frame = get_sigframe(ka, regs, sizeof(*frame) + fsize);
++ frame = get_sigframe(&ksig->ka, regs, sizeof(*frame) + fsize);
+
+ if (fsize)
+ err |= copy_to_user (frame + 1, regs + 1, fsize);
+@@ -899,7 +899,7 @@ static int setup_frame (int sig, struct
+ #endif
+
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ push_cache ((unsigned long) &frame->retcode);
+
+@@ -908,7 +908,7 @@ static int setup_frame (int sig, struct
+ * to destroy is successfully copied to sigframe.
+ */
+ wrusp ((unsigned long) frame);
+- regs->pc = (unsigned long) ka->sa.sa_handler;
++ regs->pc = (unsigned long) ksig->ka.sa.sa_handler;
+ adjustformat(regs);
+
+ /*
+@@ -934,28 +934,24 @@ static int setup_frame (int sig, struct
+ tregs->sr = regs->sr;
+ }
+ return 0;
+-
+-give_sigsegv:
+- force_sigsegv(sig, current);
+- return err;
+ }
+
+-static int setup_rt_frame (int sig, struct k_sigaction *ka, siginfo_t *info,
+- sigset_t *set, struct pt_regs *regs)
++static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
++ struct pt_regs *regs)
+ {
+ struct rt_sigframe __user *frame;
+ int fsize = frame_extra_sizes(regs->format);
+- int err = 0;
++ int err = 0, sig = ksig->sig;
+
+ if (fsize < 0) {
+ #ifdef DEBUG
+ printk ("setup_frame: Unknown frame format %#x\n",
+ regs->format);
+ #endif
+- goto give_sigsegv;
++ return -EFAULT;
+ }
+
+- frame = get_sigframe(ka, regs, sizeof(*frame));
++ frame = get_sigframe(&ksig->ka, regs, sizeof(*frame));
+
+ if (fsize)
+ err |= copy_to_user (&frame->uc.uc_extra, regs + 1, fsize);
+@@ -968,7 +964,7 @@ static int setup_rt_frame (int sig, stru
+ &frame->sig);
+ err |= __put_user(&frame->info, &frame->pinfo);
+ err |= __put_user(&frame->uc, &frame->puc);
+- err |= copy_siginfo_to_user(&frame->info, info);
++ err |= copy_siginfo_to_user(&frame->info, &ksig->info);
+
+ /* Create the ucontext. */
+ err |= __put_user(0, &frame->uc.uc_flags);
+@@ -996,7 +992,7 @@ static int setup_rt_frame (int sig, stru
+ #endif /* CONFIG_MMU */
+
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ push_cache ((unsigned long) &frame->retcode);
+
+@@ -1005,7 +1001,7 @@ static int setup_rt_frame (int sig, stru
+ * to destroy is successfully copied to sigframe.
+ */
+ wrusp ((unsigned long) frame);
+- regs->pc = (unsigned long) ka->sa.sa_handler;
++ regs->pc = (unsigned long) ksig->ka.sa.sa_handler;
+ adjustformat(regs);
+
+ /*
+@@ -1031,10 +1027,6 @@ static int setup_rt_frame (int sig, stru
+ tregs->sr = regs->sr;
+ }
+ return 0;
+-
+-give_sigsegv:
+- force_sigsegv(sig, current);
+- return err;
+ }
+
+ static inline void
+@@ -1074,26 +1066,22 @@ handle_restart(struct pt_regs *regs, str
+ * OK, we're invoking a handler
+ */
+ static void
+-handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info,
+- struct pt_regs *regs)
++handle_signal(struct ksignal *ksig, struct pt_regs *regs)
+ {
+ sigset_t *oldset = sigmask_to_save();
+ int err;
+ /* are we from a system call? */
+ if (regs->orig_d0 >= 0)
+ /* If so, check system call restarting.. */
+- handle_restart(regs, ka, 1);
++ handle_restart(regs, &ksig->ka, 1);
+
+ /* set up the stack frame */
+- if (ka->sa.sa_flags & SA_SIGINFO)
+- err = setup_rt_frame(sig, ka, info, oldset, regs);
++ if (ksig->ka.sa.sa_flags & SA_SIGINFO)
++ err = setup_rt_frame(ksig, oldset, regs);
+ else
+- err = setup_frame(sig, ka, oldset, regs);
+-
+- if (err)
+- return;
++ err = setup_frame(ksig, oldset, regs);
+
+- signal_delivered(sig, info, ka, regs, 0);
++ signal_setup_done(err, ksig, 0);
+
+ if (test_thread_flag(TIF_DELAYED_TRACE)) {
+ regs->sr &= ~0x8000;
+@@ -1108,16 +1096,13 @@ handle_signal(int sig, struct k_sigactio
+ */
+ static void do_signal(struct pt_regs *regs)
+ {
+- siginfo_t info;
+- struct k_sigaction ka;
+- int signr;
++ struct ksignal ksig;
+
+ current->thread.esp0 = (unsigned long) regs;
+
+- signr = get_signal_to_deliver(&info, &ka, regs, NULL);
+- if (signr > 0) {
++ if (get_signal(&ksig)) {
+ /* Whee! Actually deliver the signal. */
+- handle_signal(signr, &ka, &info, regs);
++ handle_signal(&ksig, regs);
+ return;
+ }
+
diff --git a/queue-3.16/microblaze-use-get_signal-signal_setup_done.patch b/queue-3.16/microblaze-use-get_signal-signal_setup_done.patch
new file mode 100644
index 00000000..9c4bda95
--- /dev/null
+++ b/queue-3.16/microblaze-use-get_signal-signal_setup_done.patch
@@ -0,0 +1,141 @@
+From: Richard Weinberger <richard@nod.at>
+Date: Mon, 7 Oct 2013 14:14:38 +0200
+Subject: microblaze: Use get_signal() signal_setup_done()
+
+commit 9c53c7ec14a5738ae3117d7d71b7abf630526c9f upstream.
+
+Use the more generic functions get_signal() signal_setup_done()
+for signal delivery.
+
+Signed-off-by: Richard Weinberger <richard@nod.at>
+[bwh: Backported to 3.16 as dependency of commit 35634ffa1751
+ "signal: Always notice exiting tasks"]
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ arch/microblaze/kernel/signal.c | 48 ++++++++++++---------------------
+ 1 file changed, 17 insertions(+), 31 deletions(-)
+
+--- a/arch/microblaze/kernel/signal.c
++++ b/arch/microblaze/kernel/signal.c
+@@ -156,11 +156,11 @@ get_sigframe(struct k_sigaction *ka, str
+ return (void __user *)((sp - frame_size) & -8UL);
+ }
+
+-static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+- sigset_t *set, struct pt_regs *regs)
++static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
++ struct pt_regs *regs)
+ {
+ struct rt_sigframe __user *frame;
+- int err = 0;
++ int err = 0, sig = ksig->sig;
+ int signal;
+ unsigned long address = 0;
+ #ifdef CONFIG_MMU
+@@ -168,10 +168,10 @@ static int setup_rt_frame(int sig, struc
+ pte_t *ptep;
+ #endif
+
+- frame = get_sigframe(ka, regs, sizeof(*frame));
++ frame = get_sigframe(&ksig->ka, regs, sizeof(*frame));
+
+ if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ signal = current_thread_info()->exec_domain
+ && current_thread_info()->exec_domain->signal_invmap
+@@ -179,8 +179,8 @@ static int setup_rt_frame(int sig, struc
+ ? current_thread_info()->exec_domain->signal_invmap[sig]
+ : sig;
+
+- if (info)
+- err |= copy_siginfo_to_user(&frame->info, info);
++ if (ksig->ka.sa.sa_flags & SA_SIGINFO)
++ err |= copy_siginfo_to_user(&frame->info, &ksig->info);
+
+ /* Create the ucontext. */
+ err |= __put_user(0, &frame->uc.uc_flags);
+@@ -227,7 +227,7 @@ static int setup_rt_frame(int sig, struc
+ flush_dcache_range(address, address + 8);
+ #endif
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /* Set up registers for signal handler */
+ regs->r1 = (unsigned long) frame;
+@@ -237,7 +237,7 @@ static int setup_rt_frame(int sig, struc
+ regs->r6 = (unsigned long) &frame->info; /* arg 1: siginfo */
+ regs->r7 = (unsigned long) &frame->uc; /* arg2: ucontext */
+ /* Offset to handle microblaze rtid r14, 0 */
+- regs->pc = (unsigned long)ka->sa.sa_handler;
++ regs->pc = (unsigned long)ksig->ka.sa.sa_handler;
+
+ set_fs(USER_DS);
+
+@@ -247,10 +247,6 @@ static int setup_rt_frame(int sig, struc
+ #endif
+
+ return 0;
+-
+-give_sigsegv:
+- force_sigsegv(sig, current);
+- return -EFAULT;
+ }
+
+ /* Handle restarting system calls */
+@@ -283,23 +279,15 @@ do_restart:
+ */
+
+ static void
+-handle_signal(unsigned long sig, struct k_sigaction *ka,
+- siginfo_t *info, struct pt_regs *regs)
++handle_signal(struct ksignal *ksig, struct pt_regs *regs)
+ {
+ sigset_t *oldset = sigmask_to_save();
+ int ret;
+
+ /* Set up the stack frame */
+- if (ka->sa.sa_flags & SA_SIGINFO)
+- ret = setup_rt_frame(sig, ka, info, oldset, regs);
+- else
+- ret = setup_rt_frame(sig, ka, NULL, oldset, regs);
+-
+- if (ret)
+- return;
++ ret = setup_rt_frame(ksig, oldset, regs);
+
+- signal_delivered(sig, info, ka, regs,
+- test_thread_flag(TIF_SINGLESTEP));
++ signal_setup_done(ret, ksig, test_thread_flag(TIF_SINGLESTEP));
+ }
+
+ /*
+@@ -313,21 +301,19 @@ handle_signal(unsigned long sig, struct
+ */
+ static void do_signal(struct pt_regs *regs, int in_syscall)
+ {
+- siginfo_t info;
+- int signr;
+- struct k_sigaction ka;
++ struct ksignal ksig;
++
+ #ifdef DEBUG_SIG
+ pr_info("do signal: %p %d\n", regs, in_syscall);
+ pr_info("do signal2: %lx %lx %ld [%lx]\n", regs->pc, regs->r1,
+ regs->r12, current_thread_info()->flags);
+ #endif
+
+- signr = get_signal_to_deliver(&info, &ka, regs, NULL);
+- if (signr > 0) {
++ if (get_signal(&ksig)) {
+ /* Whee! Actually deliver the signal. */
+ if (in_syscall)
+- handle_restart(regs, &ka, 1);
+- handle_signal(signr, &ka, &info, regs);
++ handle_restart(regs, &ksig.ka, 1);
++ handle_signal(&ksig, regs);
+ return;
+ }
+
diff --git a/queue-3.16/mips-use-get_signal-signal_setup_done.patch b/queue-3.16/mips-use-get_signal-signal_setup_done.patch
new file mode 100644
index 00000000..7a931052
--- /dev/null
+++ b/queue-3.16/mips-use-get_signal-signal_setup_done.patch
@@ -0,0 +1,384 @@
+From: Richard Weinberger <richard@nod.at>
+Date: Sun, 6 Oct 2013 22:25:42 +0200
+Subject: mips: Use get_signal() signal_setup_done()
+
+commit 81d103bf80678669c56658185e758fc3f9845d71 upstream.
+
+Use the more generic functions get_signal() signal_setup_done()
+for signal delivery.
+
+Signed-off-by: Richard Weinberger <richard@nod.at>
+[bwh: Backported to 3.16 as dependency of commit 35634ffa1751
+ "signal: Always notice exiting tasks"]
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ arch/mips/include/asm/abi.h | 10 ++---
+ arch/mips/kernel/signal-common.h | 2 +-
+ arch/mips/kernel/signal.c | 66 ++++++++++++--------------------
+ arch/mips/kernel/signal32.c | 39 ++++++++-----------
+ arch/mips/kernel/signal_n32.c | 20 ++++------
+ 5 files changed, 53 insertions(+), 84 deletions(-)
+
+--- a/arch/mips/include/asm/abi.h
++++ b/arch/mips/include/asm/abi.h
+@@ -13,13 +13,11 @@
+ #include <asm/siginfo.h>
+
+ struct mips_abi {
+- int (* const setup_frame)(void *sig_return, struct k_sigaction *ka,
+- struct pt_regs *regs, int signr,
+- sigset_t *set);
++ int (* const setup_frame)(void *sig_return, struct ksignal *ksig,
++ struct pt_regs *regs, sigset_t *set);
+ const unsigned long signal_return_offset;
+- int (* const setup_rt_frame)(void *sig_return, struct k_sigaction *ka,
+- struct pt_regs *regs, int signr,
+- sigset_t *set, siginfo_t *info);
++ int (* const setup_rt_frame)(void *sig_return, struct ksignal *ksig,
++ struct pt_regs *regs, sigset_t *set);
+ const unsigned long rt_signal_return_offset;
+ const unsigned long restart;
+ };
+--- a/arch/mips/kernel/signal-common.h
++++ b/arch/mips/kernel/signal-common.h
+@@ -22,7 +22,7 @@
+ /*
+ * Determine which stack to use..
+ */
+-extern void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
++extern void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs,
+ size_t frame_size);
+ /* Check and clear pending FPU exceptions in saved CSR */
+ extern int fpcsr_pending(unsigned int __user *fpcsr);
+--- a/arch/mips/kernel/signal.c
++++ b/arch/mips/kernel/signal.c
+@@ -428,20 +428,20 @@ badframe:
+ }
+
+ #ifdef CONFIG_TRAD_SIGNALS
+-static int setup_frame(void *sig_return, struct k_sigaction *ka,
+- struct pt_regs *regs, int signr, sigset_t *set)
++static int setup_frame(void *sig_return, struct ksignal *ksig,
++ struct pt_regs *regs, sigset_t *set)
+ {
+ struct sigframe __user *frame;
+ int err = 0;
+
+- frame = get_sigframe(ka, regs, sizeof(*frame));
++ frame = get_sigframe(&ksig->ka, regs, sizeof(*frame));
+ if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ err |= setup_sigcontext(regs, &frame->sf_sc);
+ err |= __copy_to_user(&frame->sf_mask, set, sizeof(*set));
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /*
+ * Arguments to signal handler:
+@@ -453,37 +453,32 @@ static int setup_frame(void *sig_return,
+ * $25 and c0_epc point to the signal handler, $29 points to the
+ * struct sigframe.
+ */
+- regs->regs[ 4] = signr;
++ regs->regs[ 4] = ksig->sig;
+ regs->regs[ 5] = 0;
+ regs->regs[ 6] = (unsigned long) &frame->sf_sc;
+ regs->regs[29] = (unsigned long) frame;
+ regs->regs[31] = (unsigned long) sig_return;
+- regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
++ regs->cp0_epc = regs->regs[25] = (unsigned long) ksig->ka.sa.sa_handler;
+
+ DEBUGP("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%lx\n",
+ current->comm, current->pid,
+ frame, regs->cp0_epc, regs->regs[31]);
+ return 0;
+-
+-give_sigsegv:
+- force_sigsegv(signr, current);
+- return -EFAULT;
+ }
+ #endif
+
+-static int setup_rt_frame(void *sig_return, struct k_sigaction *ka,
+- struct pt_regs *regs, int signr, sigset_t *set,
+- siginfo_t *info)
++static int setup_rt_frame(void *sig_return, struct ksignal *ksig,
++ struct pt_regs *regs, sigset_t *set)
+ {
+ struct rt_sigframe __user *frame;
+ int err = 0;
+
+- frame = get_sigframe(ka, regs, sizeof(*frame));
++ frame = get_sigframe(&ksig->ka, regs, sizeof(*frame));
+ if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /* Create siginfo. */
+- err |= copy_siginfo_to_user(&frame->rs_info, info);
++ err |= copy_siginfo_to_user(&frame->rs_info, &ksig->info);
+
+ /* Create the ucontext. */
+ err |= __put_user(0, &frame->rs_uc.uc_flags);
+@@ -493,7 +488,7 @@ static int setup_rt_frame(void *sig_retu
+ err |= __copy_to_user(&frame->rs_uc.uc_sigmask, set, sizeof(*set));
+
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /*
+ * Arguments to signal handler:
+@@ -505,22 +500,18 @@ static int setup_rt_frame(void *sig_retu
+ * $25 and c0_epc point to the signal handler, $29 points to
+ * the struct rt_sigframe.
+ */
+- regs->regs[ 4] = signr;
++ regs->regs[ 4] = ksig->sig;
+ regs->regs[ 5] = (unsigned long) &frame->rs_info;
+ regs->regs[ 6] = (unsigned long) &frame->rs_uc;
+ regs->regs[29] = (unsigned long) frame;
+ regs->regs[31] = (unsigned long) sig_return;
+- regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
++ regs->cp0_epc = regs->regs[25] = (unsigned long) ksig->ka.sa.sa_handler;
+
+ DEBUGP("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%lx\n",
+ current->comm, current->pid,
+ frame, regs->cp0_epc, regs->regs[31]);
+
+ return 0;
+-
+-give_sigsegv:
+- force_sigsegv(signr, current);
+- return -EFAULT;
+ }
+
+ struct mips_abi mips_abi = {
+@@ -534,8 +525,7 @@ struct mips_abi mips_abi = {
+ .restart = __NR_restart_syscall
+ };
+
+-static void handle_signal(unsigned long sig, siginfo_t *info,
+- struct k_sigaction *ka, struct pt_regs *regs)
++static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)
+ {
+ sigset_t *oldset = sigmask_to_save();
+ int ret;
+@@ -557,7 +547,7 @@ static void handle_signal(unsigned long
+ regs->regs[2] = EINTR;
+ break;
+ case ERESTARTSYS:
+- if (!(ka->sa.sa_flags & SA_RESTART)) {
++ if (!(ksig->ka.sa.sa_flags & SA_RESTART)) {
+ regs->regs[2] = EINTR;
+ break;
+ }
+@@ -571,29 +561,23 @@ static void handle_signal(unsigned long
+ regs->regs[0] = 0; /* Don't deal with this again. */
+ }
+
+- if (sig_uses_siginfo(ka))
++ if (sig_uses_siginfo(&ksig->ka))
+ ret = abi->setup_rt_frame(vdso + abi->rt_signal_return_offset,
+- ka, regs, sig, oldset, info);
++ ksig, regs, oldset);
+ else
+- ret = abi->setup_frame(vdso + abi->signal_return_offset,
+- ka, regs, sig, oldset);
+-
+- if (ret)
+- return;
++ ret = abi->setup_frame(vdso + abi->signal_return_offset, ksig,
++ regs, oldset);
+
+- signal_delivered(sig, info, ka, regs, 0);
++ signal_setup_done(ret, ksig, 0);
+ }
+
+ static void do_signal(struct pt_regs *regs)
+ {
+- struct k_sigaction ka;
+- siginfo_t info;
+- int signr;
++ struct ksignal ksig;
+
+- signr = get_signal_to_deliver(&info, &ka, regs, NULL);
+- if (signr > 0) {
++ if (get_signal(&ksig)) {
+ /* Whee! Actually deliver the signal. */
+- handle_signal(signr, &info, &ka, regs);
++ handle_signal(&ksig, regs);
+ return;
+ }
+
+--- a/arch/mips/kernel/signal32.c
++++ b/arch/mips/kernel/signal32.c
+@@ -488,21 +488,21 @@ badframe:
+ force_sig(SIGSEGV, current);
+ }
+
+-static int setup_frame_32(void *sig_return, struct k_sigaction *ka,
+- struct pt_regs *regs, int signr, sigset_t *set)
++static int setup_frame_32(void *sig_return, struct ksignal *ksig,
++ struct pt_regs *regs, sigset_t *set)
+ {
+ struct sigframe32 __user *frame;
+ int err = 0;
+
+- frame = get_sigframe(ka, regs, sizeof(*frame));
++ frame = get_sigframe(&ksig->ka, regs, sizeof(*frame));
+ if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ err |= setup_sigcontext32(regs, &frame->sf_sc);
+ err |= __copy_conv_sigset_to_user(&frame->sf_mask, set);
+
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /*
+ * Arguments to signal handler:
+@@ -514,37 +514,32 @@ static int setup_frame_32(void *sig_retu
+ * $25 and c0_epc point to the signal handler, $29 points to the
+ * struct sigframe.
+ */
+- regs->regs[ 4] = signr;
++ regs->regs[ 4] = ksig->sig;
+ regs->regs[ 5] = 0;
+ regs->regs[ 6] = (unsigned long) &frame->sf_sc;
+ regs->regs[29] = (unsigned long) frame;
+ regs->regs[31] = (unsigned long) sig_return;
+- regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
++ regs->cp0_epc = regs->regs[25] = (unsigned long) ksig->ka.sa.sa_handler;
+
+ DEBUGP("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%lx\n",
+ current->comm, current->pid,
+ frame, regs->cp0_epc, regs->regs[31]);
+
+ return 0;
+-
+-give_sigsegv:
+- force_sigsegv(signr, current);
+- return -EFAULT;
+ }
+
+-static int setup_rt_frame_32(void *sig_return, struct k_sigaction *ka,
+- struct pt_regs *regs, int signr, sigset_t *set,
+- siginfo_t *info)
++static int setup_rt_frame_32(void *sig_return, struct ksignal *ksig,
++ struct pt_regs *regs, sigset_t *set)
+ {
+ struct rt_sigframe32 __user *frame;
+ int err = 0;
+
+- frame = get_sigframe(ka, regs, sizeof(*frame));
++ frame = get_sigframe(&ksig->ka, regs, sizeof(*frame));
+ if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /* Convert (siginfo_t -> compat_siginfo_t) and copy to user. */
+- err |= copy_siginfo_to_user32(&frame->rs_info, info);
++ err |= copy_siginfo_to_user32(&frame->rs_info, &ksig->info);
+
+ /* Create the ucontext. */
+ err |= __put_user(0, &frame->rs_uc.uc_flags);
+@@ -554,7 +549,7 @@ static int setup_rt_frame_32(void *sig_r
+ err |= __copy_conv_sigset_to_user(&frame->rs_uc.uc_sigmask, set);
+
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /*
+ * Arguments to signal handler:
+@@ -566,22 +561,18 @@ static int setup_rt_frame_32(void *sig_r
+ * $25 and c0_epc point to the signal handler, $29 points to
+ * the struct rt_sigframe32.
+ */
+- regs->regs[ 4] = signr;
++ regs->regs[ 4] = ksig->sig;
+ regs->regs[ 5] = (unsigned long) &frame->rs_info;
+ regs->regs[ 6] = (unsigned long) &frame->rs_uc;
+ regs->regs[29] = (unsigned long) frame;
+ regs->regs[31] = (unsigned long) sig_return;
+- regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
++ regs->cp0_epc = regs->regs[25] = (unsigned long) ksig->ka.sa.sa_handler;
+
+ DEBUGP("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%lx\n",
+ current->comm, current->pid,
+ frame, regs->cp0_epc, regs->regs[31]);
+
+ return 0;
+-
+-give_sigsegv:
+- force_sigsegv(signr, current);
+- return -EFAULT;
+ }
+
+ /*
+--- a/arch/mips/kernel/signal_n32.c
++++ b/arch/mips/kernel/signal_n32.c
+@@ -102,18 +102,18 @@ badframe:
+ force_sig(SIGSEGV, current);
+ }
+
+-static int setup_rt_frame_n32(void *sig_return, struct k_sigaction *ka,
+- struct pt_regs *regs, int signr, sigset_t *set, siginfo_t *info)
++static int setup_rt_frame_n32(void *sig_return, struct ksignal *ksig,
++ struct pt_regs *regs, sigset_t *set)
+ {
+ struct rt_sigframe_n32 __user *frame;
+ int err = 0;
+
+- frame = get_sigframe(ka, regs, sizeof(*frame));
++ frame = get_sigframe(&ksig->ka, regs, sizeof(*frame));
+ if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /* Create siginfo. */
+- err |= copy_siginfo_to_user32(&frame->rs_info, info);
++ err |= copy_siginfo_to_user32(&frame->rs_info, &ksig->info);
+
+ /* Create the ucontext. */
+ err |= __put_user(0, &frame->rs_uc.uc_flags);
+@@ -123,7 +123,7 @@ static int setup_rt_frame_n32(void *sig_
+ err |= __copy_conv_sigset_to_user(&frame->rs_uc.uc_sigmask, set);
+
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /*
+ * Arguments to signal handler:
+@@ -135,22 +135,18 @@ static int setup_rt_frame_n32(void *sig_
+ * $25 and c0_epc point to the signal handler, $29 points to
+ * the struct rt_sigframe.
+ */
+- regs->regs[ 4] = signr;
++ regs->regs[ 4] = ksig->sig;
+ regs->regs[ 5] = (unsigned long) &frame->rs_info;
+ regs->regs[ 6] = (unsigned long) &frame->rs_uc;
+ regs->regs[29] = (unsigned long) frame;
+ regs->regs[31] = (unsigned long) sig_return;
+- regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
++ regs->cp0_epc = regs->regs[25] = (unsigned long) ksig->ka.sa.sa_handler;
+
+ DEBUGP("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%lx\n",
+ current->comm, current->pid,
+ frame, regs->cp0_epc, regs->regs[31]);
+
+ return 0;
+-
+-give_sigsegv:
+- force_sigsegv(signr, current);
+- return -EFAULT;
+ }
+
+ struct mips_abi mips_abi_n32 = {
diff --git a/queue-3.16/mn10300-use-get_signal-signal_setup_done.patch b/queue-3.16/mn10300-use-get_signal-signal_setup_done.patch
new file mode 100644
index 00000000..718e1e55
--- /dev/null
+++ b/queue-3.16/mn10300-use-get_signal-signal_setup_done.patch
@@ -0,0 +1,239 @@
+From: Richard Weinberger <richard@nod.at>
+Date: Mon, 7 Oct 2013 14:22:50 +0200
+Subject: mn10300: Use get_signal() signal_setup_done()
+
+commit 8b166553a9aaf39774bc22f5e93c965584303929 upstream.
+
+Use the more generic functions get_signal() signal_setup_done()
+for signal delivery.
+
+Signed-off-by: Richard Weinberger <richard@nod.at>
+[bwh: Backported to 3.16 as dependency of commit 35634ffa1751
+ "signal: Always notice exiting tasks"]
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ arch/mn10300/kernel/signal.c | 89 +++++++++++++++---------------------
+ 1 file changed, 36 insertions(+), 53 deletions(-)
+
+--- a/arch/mn10300/kernel/signal.c
++++ b/arch/mn10300/kernel/signal.c
+@@ -207,16 +207,16 @@ static inline void __user *get_sigframe(
+ /*
+ * set up a normal signal frame
+ */
+-static int setup_frame(int sig, struct k_sigaction *ka, sigset_t *set,
++static int setup_frame(struct ksignal *ksig, sigset_t *set,
+ struct pt_regs *regs)
+ {
+ struct sigframe __user *frame;
+- int rsig;
++ int rsig, sig = ksig->sig;
+
+- frame = get_sigframe(ka, regs, sizeof(*frame));
++ frame = get_sigframe(&ksig->ka, regs, sizeof(*frame));
+
+ if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ rsig = sig;
+ if (sig < 32 &&
+@@ -226,40 +226,40 @@ static int setup_frame(int sig, struct k
+
+ if (__put_user(rsig, &frame->sig) < 0 ||
+ __put_user(&frame->sc, &frame->psc) < 0)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ if (setup_sigcontext(&frame->sc, &frame->fpuctx, regs, set->sig[0]))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ if (_NSIG_WORDS > 1) {
+ if (__copy_to_user(frame->extramask, &set->sig[1],
+ sizeof(frame->extramask)))
+- goto give_sigsegv;
++ return -EFAULT;
+ }
+
+ /* set up to return from userspace. If provided, use a stub already in
+ * userspace */
+- if (ka->sa.sa_flags & SA_RESTORER) {
+- if (__put_user(ka->sa.sa_restorer, &frame->pretcode))
+- goto give_sigsegv;
++ if (ksig->ka.sa.sa_flags & SA_RESTORER) {
++ if (__put_user(ksig->ka.sa.sa_restorer, &frame->pretcode))
++ return -EFAULT;
+ } else {
+ if (__put_user((void (*)(void))frame->retcode,
+ &frame->pretcode))
+- goto give_sigsegv;
++ return -EFAULT;
+ /* this is mov $,d0; syscall 0 */
+ if (__put_user(0x2c, (char *)(frame->retcode + 0)) ||
+ __put_user(__NR_sigreturn, (char *)(frame->retcode + 1)) ||
+ __put_user(0x00, (char *)(frame->retcode + 2)) ||
+ __put_user(0xf0, (char *)(frame->retcode + 3)) ||
+ __put_user(0xe0, (char *)(frame->retcode + 4)))
+- goto give_sigsegv;
++ return -EFAULT;
+ flush_icache_range((unsigned long) frame->retcode,
+ (unsigned long) frame->retcode + 5);
+ }
+
+ /* set up registers for signal handler */
+ regs->sp = (unsigned long) frame;
+- regs->pc = (unsigned long) ka->sa.sa_handler;
++ regs->pc = (unsigned long) ksig->ka.sa.sa_handler;
+ regs->d0 = sig;
+ regs->d1 = (unsigned long) &frame->sc;
+
+@@ -270,25 +270,21 @@ static int setup_frame(int sig, struct k
+ #endif
+
+ return 0;
+-
+-give_sigsegv:
+- force_sigsegv(sig, current);
+- return -EFAULT;
+ }
+
+ /*
+ * set up a realtime signal frame
+ */
+-static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+- sigset_t *set, struct pt_regs *regs)
++static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
++ struct pt_regs *regs)
+ {
+ struct rt_sigframe __user *frame;
+- int rsig;
++ int rsig, sig = ksig->sig;
+
+- frame = get_sigframe(ka, regs, sizeof(*frame));
++ frame = get_sigframe(&ksig->ka, regs, sizeof(*frame));
+
+ if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ rsig = sig;
+ if (sig < 32 &&
+@@ -299,8 +295,8 @@ static int setup_rt_frame(int sig, struc
+ if (__put_user(rsig, &frame->sig) ||
+ __put_user(&frame->info, &frame->pinfo) ||
+ __put_user(&frame->uc, &frame->puc) ||
+- copy_siginfo_to_user(&frame->info, info))
+- goto give_sigsegv;
++ copy_siginfo_to_user(&frame->info, &ksig->info))
++ return -EFAULT;
+
+ /* create the ucontext. */
+ if (__put_user(0, &frame->uc.uc_flags) ||
+@@ -309,13 +305,14 @@ static int setup_rt_frame(int sig, struc
+ setup_sigcontext(&frame->uc.uc_mcontext,
+ &frame->fpuctx, regs, set->sig[0]) ||
+ __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /* set up to return from userspace. If provided, use a stub already in
+ * userspace */
+- if (ka->sa.sa_flags & SA_RESTORER) {
+- if (__put_user(ka->sa.sa_restorer, &frame->pretcode))
+- goto give_sigsegv;
++ if (ksig->ka.sa.sa_flags & SA_RESTORER) {
++ if (__put_user(ksig->ka.sa.sa_restorer, &frame->pretcode))
++ return -EFAULT;
++
+ } else {
+ if (__put_user((void(*)(void))frame->retcode,
+ &frame->pretcode) ||
+@@ -326,7 +323,7 @@ static int setup_rt_frame(int sig, struc
+ __put_user(0x00, (char *)(frame->retcode + 2)) ||
+ __put_user(0xf0, (char *)(frame->retcode + 3)) ||
+ __put_user(0xe0, (char *)(frame->retcode + 4)))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ flush_icache_range((u_long) frame->retcode,
+ (u_long) frame->retcode + 5);
+@@ -334,7 +331,7 @@ static int setup_rt_frame(int sig, struc
+
+ /* Set up registers for signal handler */
+ regs->sp = (unsigned long) frame;
+- regs->pc = (unsigned long) ka->sa.sa_handler;
++ regs->pc = (unsigned long) ksig->ka.sa.sa_handler;
+ regs->d0 = sig;
+ regs->d1 = (long) &frame->info;
+
+@@ -345,10 +342,6 @@ static int setup_rt_frame(int sig, struc
+ #endif
+
+ return 0;
+-
+-give_sigsegv:
+- force_sigsegv(sig, current);
+- return -EFAULT;
+ }
+
+ static inline void stepback(struct pt_regs *regs)
+@@ -360,9 +353,7 @@ static inline void stepback(struct pt_re
+ /*
+ * handle the actual delivery of a signal to userspace
+ */
+-static int handle_signal(int sig,
+- siginfo_t *info, struct k_sigaction *ka,
+- struct pt_regs *regs)
++static int handle_signal(struct ksignal *ksig, struct pt_regs *regs)
+ {
+ sigset_t *oldset = sigmask_to_save();
+ int ret;
+@@ -377,7 +368,7 @@ static int handle_signal(int sig,
+ break;
+
+ case -ERESTARTSYS:
+- if (!(ka->sa.sa_flags & SA_RESTART)) {
++ if (!(ksig->ka.sa.sa_flags & SA_RESTART)) {
+ regs->d0 = -EINTR;
+ break;
+ }
+@@ -390,15 +381,12 @@ static int handle_signal(int sig,
+ }
+
+ /* Set up the stack frame */
+- if (ka->sa.sa_flags & SA_SIGINFO)
+- ret = setup_rt_frame(sig, ka, info, oldset, regs);
++ if (ksig->ka.sa.sa_flags & SA_SIGINFO)
++ ret = setup_rt_frame(ksig, oldset, regs);
+ else
+- ret = setup_frame(sig, ka, oldset, regs);
+- if (ret)
+- return ret;
++ ret = setup_frame(ksig, oldset, regs);
+
+- signal_delivered(sig, info, ka, regs,
+- test_thread_flag(TIF_SINGLESTEP));
++ signal_setup_done(ret, ksig, test_thread_flag(TIF_SINGLESTEP));
+ return 0;
+ }
+
+@@ -407,15 +395,10 @@ static int handle_signal(int sig,
+ */
+ static void do_signal(struct pt_regs *regs)
+ {
+- struct k_sigaction ka;
+- siginfo_t info;
+- int signr;
+-
+- signr = get_signal_to_deliver(&info, &ka, regs, NULL);
+- if (signr > 0) {
+- if (handle_signal(signr, &info, &ka, regs) == 0) {
+- }
++ struct ksignal ksig;
+
++ if (get_signal(&ksig)) {
++ handle_signal(&ksig, regs);
+ return;
+ }
+
diff --git a/queue-3.16/net-dp83640-expire-old-tx-skb.patch b/queue-3.16/net-dp83640-expire-old-tx-skb.patch
deleted file mode 100644
index 6eb359d9..00000000
--- a/queue-3.16/net-dp83640-expire-old-tx-skb.patch
+++ /dev/null
@@ -1,80 +0,0 @@
-From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
-Date: Mon, 4 Feb 2019 11:20:29 +0100
-Subject: net: dp83640: expire old TX-skb
-
-commit 53bc8d2af08654659abfadfd3e98eb9922ff787c upstream.
-
-During sendmsg() a cloned skb is saved via dp83640_txtstamp() in
-->tx_queue. After the NIC sends this packet, the PHY will reply with a
-timestamp for that TX packet. If the cable is pulled at the right time I
-don't see that packet. It might gets flushed as part of queue shutdown
-on NIC's side.
-Once the link is up again then after the next sendmsg() we enqueue
-another skb in dp83640_txtstamp() and have two on the list. Then the PHY
-will send a reply and decode_txts() attaches it to the first skb on the
-list.
-No crash occurs since refcounting works but we are one packet behind.
-linuxptp/ptp4l usually closes the socket and opens a new one (in such a
-timeout case) so those "stale" replies never get there. However it does
-not resume normal operation anymore.
-
-Purge old skbs in decode_txts().
-
-Fixes: cb646e2b02b2 ("ptp: Added a clock driver for the National Semiconductor PHYTER.")
-Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
-Reviewed-by: Kurt Kanzenbach <kurt@linutronix.de>
-Acked-by: Richard Cochran <richardcochran@gmail.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
----
- drivers/net/phy/dp83640.c | 13 ++++++++++---
- 1 file changed, 10 insertions(+), 3 deletions(-)
-
---- a/drivers/net/phy/dp83640.c
-+++ b/drivers/net/phy/dp83640.c
-@@ -785,14 +785,14 @@ static void decode_txts(struct dp83640_p
- struct phy_txts *phy_txts)
- {
- struct skb_shared_hwtstamps shhwtstamps;
-+ struct dp83640_skb_info *skb_info;
- struct sk_buff *skb;
-- u64 ns;
- u8 overflow;
-+ u64 ns;
-
- /* We must already have the skb that triggered this. */
--
-+again:
- skb = skb_dequeue(&dp83640->tx_queue);
--
- if (!skb) {
- pr_debug("have timestamp but tx_queue empty\n");
- return;
-@@ -807,6 +807,11 @@ static void decode_txts(struct dp83640_p
- }
- return;
- }
-+ skb_info = (struct dp83640_skb_info *)skb->cb;
-+ if (time_after(jiffies, skb_info->tmo)) {
-+ kfree_skb(skb);
-+ goto again;
-+ }
-
- ns = phy2txts(phy_txts);
- memset(&shhwtstamps, 0, sizeof(shhwtstamps));
-@@ -1374,6 +1379,7 @@ static bool dp83640_rxtstamp(struct phy_
- static void dp83640_txtstamp(struct phy_device *phydev,
- struct sk_buff *skb, int type)
- {
-+ struct dp83640_skb_info *skb_info = (struct dp83640_skb_info *)skb->cb;
- struct dp83640_private *dp83640 = phydev->priv;
-
- switch (dp83640->hwts_tx_en) {
-@@ -1386,6 +1392,7 @@ static void dp83640_txtstamp(struct phy_
- /* fall through */
- case HWTSTAMP_TX_ON:
- skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
-+ skb_info->tmo = jiffies + SKB_TIMESTAMP_TIMEOUT;
- skb_queue_tail(&dp83640->tx_queue, skb);
- schedule_work(&dp83640->ts_work);
- break;
diff --git a/queue-3.16/parisc-use-get_signal-signal_setup_done.patch b/queue-3.16/parisc-use-get_signal-signal_setup_done.patch
new file mode 100644
index 00000000..61a647c1
--- /dev/null
+++ b/queue-3.16/parisc-use-get_signal-signal_setup_done.patch
@@ -0,0 +1,178 @@
+From: Richard Weinberger <richard@nod.at>
+Date: Mon, 7 Oct 2013 14:34:10 +0200
+Subject: parisc: Use get_signal() signal_setup_done()
+
+commit e4dc894b61776733629b24507031dd46f5ba5efc upstream.
+
+Use the more generic functions get_signal() signal_setup_done()
+for signal delivery.
+
+Signed-off-by: Richard Weinberger <richard@nod.at>
+Acked-by: Helge Deller <deller@gmx.de>
+[bwh: Backported to 3.16 as dependency of commit 35634ffa1751
+ "signal: Always notice exiting tasks"]
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ arch/parisc/kernel/signal.c | 58 +++++++++++++++----------------------
+ 1 file changed, 24 insertions(+), 34 deletions(-)
+
+--- a/arch/parisc/kernel/signal.c
++++ b/arch/parisc/kernel/signal.c
+@@ -227,8 +227,8 @@ setup_sigcontext(struct sigcontext __use
+ }
+
+ static long
+-setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+- sigset_t *set, struct pt_regs *regs, int in_syscall)
++setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs,
++ int in_syscall)
+ {
+ struct rt_sigframe __user *frame;
+ unsigned long rp, usp;
+@@ -241,10 +241,10 @@ setup_rt_frame(int sig, struct k_sigacti
+
+ usp = (regs->gr[30] & ~(0x01UL));
+ /*FIXME: frame_size parameter is unused, remove it. */
+- frame = get_sigframe(ka, usp, sizeof(*frame));
++ frame = get_sigframe(&ksig->ka, usp, sizeof(*frame));
+
+ DBG(1,"SETUP_RT_FRAME: START\n");
+- DBG(1,"setup_rt_frame: frame %p info %p\n", frame, info);
++ DBG(1,"setup_rt_frame: frame %p info %p\n", frame, ksig->info);
+
+
+ #ifdef CONFIG_64BIT
+@@ -253,7 +253,7 @@ setup_rt_frame(int sig, struct k_sigacti
+
+ if (is_compat_task()) {
+ DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &compat_frame->info);
+- err |= copy_siginfo_to_user32(&compat_frame->info, info);
++ err |= copy_siginfo_to_user32(&compat_frame->info, &ksig->info);
+ err |= __compat_save_altstack( &compat_frame->uc.uc_stack, regs->gr[30]);
+ DBG(1,"setup_rt_frame: frame->uc = 0x%p\n", &compat_frame->uc);
+ DBG(1,"setup_rt_frame: frame->uc.uc_mcontext = 0x%p\n", &compat_frame->uc.uc_mcontext);
+@@ -265,7 +265,7 @@ setup_rt_frame(int sig, struct k_sigacti
+ #endif
+ {
+ DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &frame->info);
+- err |= copy_siginfo_to_user(&frame->info, info);
++ err |= copy_siginfo_to_user(&frame->info, &ksig->info);
+ err |= __save_altstack(&frame->uc.uc_stack, regs->gr[30]);
+ DBG(1,"setup_rt_frame: frame->uc = 0x%p\n", &frame->uc);
+ DBG(1,"setup_rt_frame: frame->uc.uc_mcontext = 0x%p\n", &frame->uc.uc_mcontext);
+@@ -275,7 +275,7 @@ setup_rt_frame(int sig, struct k_sigacti
+ }
+
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /* Set up to return from userspace. If provided, use a stub
+ already in userspace. The first words of tramp are used to
+@@ -312,9 +312,9 @@ setup_rt_frame(int sig, struct k_sigacti
+ rp = (unsigned long) &frame->tramp[SIGRESTARTBLOCK_TRAMP];
+
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+- haddr = A(ka->sa.sa_handler);
++ haddr = A(ksig->ka.sa.sa_handler);
+ /* The sa_handler may be a pointer to a function descriptor */
+ #ifdef CONFIG_64BIT
+ if (is_compat_task()) {
+@@ -326,7 +326,7 @@ setup_rt_frame(int sig, struct k_sigacti
+ err = __copy_from_user(&fdesc, ufdesc, sizeof(fdesc));
+
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ haddr = fdesc.addr;
+ regs->gr[19] = fdesc.gp;
+@@ -339,7 +339,7 @@ setup_rt_frame(int sig, struct k_sigacti
+ err = __copy_from_user(&fdesc, ufdesc, sizeof(fdesc));
+
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ haddr = fdesc.addr;
+ regs->gr[19] = fdesc.gp;
+@@ -386,7 +386,7 @@ setup_rt_frame(int sig, struct k_sigacti
+ }
+
+ regs->gr[2] = rp; /* userland return pointer */
+- regs->gr[26] = sig; /* signal number */
++ regs->gr[26] = ksig->sig; /* signal number */
+
+ #ifdef CONFIG_64BIT
+ if (is_compat_task()) {
+@@ -410,11 +410,6 @@ setup_rt_frame(int sig, struct k_sigacti
+ current->comm, current->pid, frame, regs->gr[30],
+ regs->iaoq[0], regs->iaoq[1], rp);
+
+- return 1;
+-
+-give_sigsegv:
+- DBG(1,"setup_rt_frame: sending SIGSEGV\n");
+- force_sigsegv(sig, current);
+ return 0;
+ }
+
+@@ -423,20 +418,19 @@ give_sigsegv:
+ */
+
+ static void
+-handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
+- struct pt_regs *regs, int in_syscall)
++handle_signal(struct ksignal *ksig, struct pt_regs *regs, int in_syscall)
+ {
++ int ret;
+ sigset_t *oldset = sigmask_to_save();
++
+ DBG(1,"handle_signal: sig=%ld, ka=%p, info=%p, oldset=%p, regs=%p\n",
+- sig, ka, info, oldset, regs);
++ ksig->sig, ksig->ka, ksig->info, oldset, regs);
+
+ /* Set up the stack frame */
+- if (!setup_rt_frame(sig, ka, info, oldset, regs, in_syscall))
+- return;
++ ret = setup_rt_frame(ksig, oldset, regs, in_syscall);
+
+- signal_delivered(sig, info, ka, regs,
+- test_thread_flag(TIF_SINGLESTEP) ||
+- test_thread_flag(TIF_BLOCKSTEP));
++ signal_setup_done(ret, ksig, test_thread_flag(TIF_SINGLESTEP) ||
++ test_thread_flag(TIF_BLOCKSTEP));
+
+ DBG(1,KERN_DEBUG "do_signal: Exit (success), regs->gr[28] = %ld\n",
+ regs->gr[28]);
+@@ -584,22 +578,18 @@ insert_restart_trampoline(struct pt_regs
+ asmlinkage void
+ do_signal(struct pt_regs *regs, long in_syscall)
+ {
+- siginfo_t info;
+- struct k_sigaction ka;
+- int signr;
++ struct ksignal ksig;
+
+ DBG(1,"\ndo_signal: regs=0x%p, sr7 %#lx, in_syscall=%d\n",
+ regs, regs->sr[7], in_syscall);
+
+- 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 (get_signal(&ksig)) {
++ DBG(3,"do_signal: signr = %d, regs->gr[28] = %ld\n", signr, regs->gr[28]);
+ /* Restart a system call if necessary. */
+ if (in_syscall)
+- syscall_restart(regs, &ka);
++ syscall_restart(regs, &ksig.ka);
+
+- handle_signal(signr, &info, &ka, regs, in_syscall);
++ handle_signal(&ksig, regs, in_syscall);
+ return;
+ }
+
diff --git a/queue-3.16/powerpc-use-get_signal-signal_setup_done.patch b/queue-3.16/powerpc-use-get_signal-signal_setup_done.patch
new file mode 100644
index 00000000..5513fe58
--- /dev/null
+++ b/queue-3.16/powerpc-use-get_signal-signal_setup_done.patch
@@ -0,0 +1,338 @@
+From: Richard Weinberger <richard@nod.at>
+Date: Sun, 2 Mar 2014 14:46:11 +0100
+Subject: powerpc: Use get_signal() signal_setup_done()
+
+commit 129b69df9c9074750245fca8aa92df5cc1a86ef4 upstream.
+
+Use the more generic functions get_signal() signal_setup_done()
+for signal delivery.
+This inverts also the return codes of setup_*frame() to follow the
+kernel convention.
+
+Signed-off-by: Richard Weinberger <richard@nod.at>
+[bwh: Backported to 3.16 as dependency of commit 35634ffa1751
+ "signal: Always notice exiting tasks"]
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ arch/powerpc/kernel/signal.c | 31 ++++++++++------------------
+ arch/powerpc/kernel/signal.h | 14 +++++--------
+ arch/powerpc/kernel/signal_32.c | 36 +++++++++++++++------------------
+ arch/powerpc/kernel/signal_64.c | 28 ++++++++++++-------------
+ 4 files changed, 45 insertions(+), 64 deletions(-)
+
+--- a/arch/powerpc/kernel/signal.c
++++ b/arch/powerpc/kernel/signal.c
+@@ -105,25 +105,23 @@ static void check_syscall_restart(struct
+ }
+ }
+
+-static int do_signal(struct pt_regs *regs)
++static void do_signal(struct pt_regs *regs)
+ {
+ sigset_t *oldset = sigmask_to_save();
+- siginfo_t info;
+- int signr;
+- struct k_sigaction ka;
++ struct ksignal ksig;
+ int ret;
+ int is32 = is_32bit_task();
+
+- signr = get_signal_to_deliver(&info, &ka, regs, NULL);
++ get_signal(&ksig);
+
+ /* Is there any syscall restart business here ? */
+- check_syscall_restart(regs, &ka, signr > 0);
++ check_syscall_restart(regs, &ksig.ka, ksig.sig > 0);
+
+- if (signr <= 0) {
++ if (ksig.sig <= 0) {
+ /* No signal to deliver -- put the saved sigmask back */
+ restore_saved_sigmask();
+ regs->trap = 0;
+- return 0; /* no signals delivered */
++ return; /* no signals delivered */
+ }
+
+ #ifndef CONFIG_PPC_ADV_DEBUG_REGS
+@@ -140,23 +138,16 @@ static int do_signal(struct pt_regs *reg
+ thread_change_pc(current, regs);
+
+ if (is32) {
+- if (ka.sa.sa_flags & SA_SIGINFO)
+- ret = handle_rt_signal32(signr, &ka, &info, oldset,
+- regs);
++ if (ksig.ka.sa.sa_flags & SA_SIGINFO)
++ ret = handle_rt_signal32(&ksig, oldset, regs);
+ else
+- ret = handle_signal32(signr, &ka, &info, oldset,
+- regs);
++ ret = handle_signal32(&ksig, oldset, regs);
+ } else {
+- ret = handle_rt_signal64(signr, &ka, &info, oldset, regs);
++ ret = handle_rt_signal64(&ksig, oldset, regs);
+ }
+
+ regs->trap = 0;
+- if (ret) {
+- signal_delivered(signr, &info, &ka, regs,
+- test_thread_flag(TIF_SINGLESTEP));
+- }
+-
+- return ret;
++ signal_setup_done(ret, &ksig, test_thread_flag(TIF_SINGLESTEP));
+ }
+
+ void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags)
+--- a/arch/powerpc/kernel/signal.h
++++ b/arch/powerpc/kernel/signal.h
+@@ -12,15 +12,13 @@
+
+ extern void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags);
+
+-extern void __user * get_sigframe(struct k_sigaction *ka, unsigned long sp,
++extern void __user *get_sigframe(struct ksignal *ksig, unsigned long sp,
+ size_t frame_size, int is_32);
+
+-extern int handle_signal32(unsigned long sig, struct k_sigaction *ka,
+- siginfo_t *info, sigset_t *oldset,
++extern int handle_signal32(struct ksignal *ksig, sigset_t *oldset,
+ struct pt_regs *regs);
+
+-extern int handle_rt_signal32(unsigned long sig, struct k_sigaction *ka,
+- siginfo_t *info, sigset_t *oldset,
++extern int handle_rt_signal32(struct ksignal *ksig, sigset_t *oldset,
+ struct pt_regs *regs);
+
+ extern unsigned long copy_fpr_to_user(void __user *to,
+@@ -44,14 +42,12 @@ extern unsigned long copy_transact_vsx_f
+
+ #ifdef CONFIG_PPC64
+
+-extern int handle_rt_signal64(int signr, struct k_sigaction *ka,
+- siginfo_t *info, sigset_t *set,
++extern int handle_rt_signal64(struct ksignal *ksig, sigset_t *set,
+ struct pt_regs *regs);
+
+ #else /* CONFIG_PPC64 */
+
+-static inline int handle_rt_signal64(int signr, struct k_sigaction *ka,
+- siginfo_t *info, sigset_t *set,
++static inline int handle_rt_signal64(struct ksignal *ksig, sigset_t *set,
+ struct pt_regs *regs)
+ {
+ return -EFAULT;
+--- a/arch/powerpc/kernel/signal_32.c
++++ b/arch/powerpc/kernel/signal_32.c
+@@ -1001,9 +1001,8 @@ int copy_siginfo_from_user32(siginfo_t *
+ * Set up a signal frame for a "real-time" signal handler
+ * (one which gets siginfo).
+ */
+-int handle_rt_signal32(unsigned long sig, struct k_sigaction *ka,
+- siginfo_t *info, sigset_t *oldset,
+- struct pt_regs *regs)
++int handle_rt_signal32(struct ksignal *ksig, sigset_t *oldset,
++ struct pt_regs *regs)
+ {
+ struct rt_sigframe __user *rt_sf;
+ struct mcontext __user *frame;
+@@ -1015,13 +1014,13 @@ int handle_rt_signal32(unsigned long sig
+
+ /* Set up Signal Frame */
+ /* Put a Real Time Context onto stack */
+- rt_sf = get_sigframe(ka, get_tm_stackpointer(regs), sizeof(*rt_sf), 1);
++ rt_sf = get_sigframe(&ksig->ka, get_tm_stackpointer(regs), sizeof(*rt_sf), 1);
+ addr = rt_sf;
+ if (unlikely(rt_sf == NULL))
+ goto badframe;
+
+ /* Put the siginfo & fill in most of the ucontext */
+- if (copy_siginfo_to_user(&rt_sf->info, info)
++ if (copy_siginfo_to_user(&rt_sf->info, &ksig->info)
+ || __put_user(0, &rt_sf->uc.uc_flags)
+ || __save_altstack(&rt_sf->uc.uc_stack, regs->gpr[1])
+ || __put_user(to_user_ptr(&rt_sf->uc.uc_mcontext),
+@@ -1071,15 +1070,15 @@ int handle_rt_signal32(unsigned long sig
+
+ /* Fill registers for signal handler */
+ regs->gpr[1] = newsp;
+- regs->gpr[3] = sig;
++ regs->gpr[3] = ksig->sig;
+ regs->gpr[4] = (unsigned long) &rt_sf->info;
+ regs->gpr[5] = (unsigned long) &rt_sf->uc;
+ regs->gpr[6] = (unsigned long) rt_sf;
+- regs->nip = (unsigned long) ka->sa.sa_handler;
++ regs->nip = (unsigned long) ksig->ka.sa.sa_handler;
+ /* enter the signal handler in native-endian mode */
+ regs->msr &= ~MSR_LE;
+ regs->msr |= (MSR_KERNEL & MSR_LE);
+- return 1;
++ return 0;
+
+ badframe:
+ if (show_unhandled_signals)
+@@ -1089,8 +1088,7 @@ badframe:
+ current->comm, current->pid,
+ addr, regs->nip, regs->link);
+
+- force_sigsegv(sig, current);
+- return 0;
++ return 1;
+ }
+
+ static int do_setcontext(struct ucontext __user *ucp, struct pt_regs *regs, int sig)
+@@ -1437,8 +1435,7 @@ int sys_debug_setcontext(struct ucontext
+ /*
+ * OK, we're invoking a handler
+ */
+-int handle_signal32(unsigned long sig, struct k_sigaction *ka,
+- siginfo_t *info, sigset_t *oldset, struct pt_regs *regs)
++int handle_signal32(struct ksignal *ksig, sigset_t *oldset, struct pt_regs *regs)
+ {
+ struct sigcontext __user *sc;
+ struct sigframe __user *frame;
+@@ -1448,7 +1445,7 @@ int handle_signal32(unsigned long sig, s
+ unsigned long tramp;
+
+ /* Set up Signal Frame */
+- frame = get_sigframe(ka, get_tm_stackpointer(regs), sizeof(*frame), 1);
++ frame = get_sigframe(&ksig->ka, get_tm_stackpointer(regs), sizeof(*frame), 1);
+ if (unlikely(frame == NULL))
+ goto badframe;
+ sc = (struct sigcontext __user *) &frame->sctx;
+@@ -1456,7 +1453,7 @@ int handle_signal32(unsigned long sig, s
+ #if _NSIG != 64
+ #error "Please adjust handle_signal()"
+ #endif
+- if (__put_user(to_user_ptr(ka->sa.sa_handler), &sc->handler)
++ if (__put_user(to_user_ptr(ksig->ka.sa.sa_handler), &sc->handler)
+ || __put_user(oldset->sig[0], &sc->oldmask)
+ #ifdef CONFIG_PPC64
+ || __put_user((oldset->sig[0] >> 32), &sc->_unused[3])
+@@ -1464,7 +1461,7 @@ int handle_signal32(unsigned long sig, s
+ || __put_user(oldset->sig[1], &sc->_unused[3])
+ #endif
+ || __put_user(to_user_ptr(&frame->mctx), &sc->regs)
+- || __put_user(sig, &sc->signal))
++ || __put_user(ksig->sig, &sc->signal))
+ goto badframe;
+
+ if (vdso32_sigtramp && current->mm->context.vdso_base) {
+@@ -1499,12 +1496,12 @@ int handle_signal32(unsigned long sig, s
+ goto badframe;
+
+ regs->gpr[1] = newsp;
+- regs->gpr[3] = sig;
++ regs->gpr[3] = ksig->sig;
+ regs->gpr[4] = (unsigned long) sc;
+- regs->nip = (unsigned long) ka->sa.sa_handler;
++ regs->nip = (unsigned long) (unsigned long)ksig->ka.sa.sa_handler;
+ /* enter the signal handler in big-endian mode */
+ regs->msr &= ~MSR_LE;
+- return 1;
++ return 0;
+
+ badframe:
+ if (show_unhandled_signals)
+@@ -1514,8 +1511,7 @@ badframe:
+ current->comm, current->pid,
+ frame, regs->nip, regs->link);
+
+- force_sigsegv(sig, current);
+- return 0;
++ return 1;
+ }
+
+ /*
+--- a/arch/powerpc/kernel/signal_64.c
++++ b/arch/powerpc/kernel/signal_64.c
+@@ -743,20 +743,19 @@ badframe:
+ return 0;
+ }
+
+-int handle_rt_signal64(int signr, struct k_sigaction *ka, siginfo_t *info,
+- sigset_t *set, struct pt_regs *regs)
++int handle_rt_signal64(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs)
+ {
+ struct rt_sigframe __user *frame;
+ unsigned long newsp = 0;
+ long err = 0;
+
+- frame = get_sigframe(ka, get_tm_stackpointer(regs), sizeof(*frame), 0);
++ frame = get_sigframe(&ksig->ka, get_tm_stackpointer(regs), sizeof(*frame), 0);
+ if (unlikely(frame == NULL))
+ goto badframe;
+
+ err |= __put_user(&frame->info, &frame->pinfo);
+ err |= __put_user(&frame->uc, &frame->puc);
+- err |= copy_siginfo_to_user(&frame->info, info);
++ err |= copy_siginfo_to_user(&frame->info, &ksig->info);
+ if (err)
+ goto badframe;
+
+@@ -771,15 +770,15 @@ int handle_rt_signal64(int signr, struct
+ err |= __put_user(&frame->uc_transact, &frame->uc.uc_link);
+ err |= setup_tm_sigcontexts(&frame->uc.uc_mcontext,
+ &frame->uc_transact.uc_mcontext,
+- regs, signr,
++ regs, ksig->sig,
+ NULL,
+- (unsigned long)ka->sa.sa_handler);
++ (unsigned long)ksig->ka.sa.sa_handler);
+ } else
+ #endif
+ {
+ err |= __put_user(0, &frame->uc.uc_link);
+- err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, signr,
+- NULL, (unsigned long)ka->sa.sa_handler,
++ err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, ksig->sig,
++ NULL, (unsigned long)ksig->ka.sa.sa_handler,
+ 1);
+ }
+ err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
+@@ -805,7 +804,7 @@ int handle_rt_signal64(int signr, struct
+
+ /* Set up "regs" so we "return" to the signal handler. */
+ if (is_elf2_task()) {
+- regs->nip = (unsigned long) ka->sa.sa_handler;
++ regs->nip = (unsigned long) ksig->ka.sa.sa_handler;
+ regs->gpr[12] = regs->nip;
+ } else {
+ /* Handler is *really* a pointer to the function descriptor for
+@@ -814,7 +813,7 @@ int handle_rt_signal64(int signr, struct
+ * entry is the TOC value we need to use.
+ */
+ func_descr_t __user *funct_desc_ptr =
+- (func_descr_t __user *) ka->sa.sa_handler;
++ (func_descr_t __user *) ksig->ka.sa.sa_handler;
+
+ err |= get_user(regs->nip, &funct_desc_ptr->entry);
+ err |= get_user(regs->gpr[2], &funct_desc_ptr->toc);
+@@ -824,9 +823,9 @@ int handle_rt_signal64(int signr, struct
+ regs->msr &= ~MSR_LE;
+ regs->msr |= (MSR_KERNEL & MSR_LE);
+ regs->gpr[1] = newsp;
+- regs->gpr[3] = signr;
++ regs->gpr[3] = ksig->sig;
+ regs->result = 0;
+- if (ka->sa.sa_flags & SA_SIGINFO) {
++ if (ksig->ka.sa.sa_flags & SA_SIGINFO) {
+ err |= get_user(regs->gpr[4], (unsigned long __user *)&frame->pinfo);
+ err |= get_user(regs->gpr[5], (unsigned long __user *)&frame->puc);
+ regs->gpr[6] = (unsigned long) frame;
+@@ -836,7 +835,7 @@ int handle_rt_signal64(int signr, struct
+ if (err)
+ goto badframe;
+
+- return 1;
++ return 0;
+
+ badframe:
+ if (show_unhandled_signals)
+@@ -844,6 +843,5 @@ badframe:
+ current->comm, current->pid, "setup_rt_frame",
+ (long)frame, regs->nip, regs->link);
+
+- force_sigsegv(signr, current);
+- return 0;
++ return 1;
+ }
diff --git a/queue-3.16/s390-use-get_signal-signal_setup_done.patch b/queue-3.16/s390-use-get_signal-signal_setup_done.patch
new file mode 100644
index 00000000..9b4c09c2
--- /dev/null
+++ b/queue-3.16/s390-use-get_signal-signal_setup_done.patch
@@ -0,0 +1,391 @@
+From: Richard Weinberger <richard@nod.at>
+Date: Sun, 13 Jul 2014 22:21:03 +0200
+Subject: s390: Use get_signal() signal_setup_done()
+
+commit 067bf2d4d3a7aedc5982f6a58716054e5004b801 upstream.
+
+Use the more generic functions get_signal() signal_setup_done()
+for signal delivery.
+
+Signed-off-by: Richard Weinberger <richard@nod.at>
+[bwh: Backported to 3.16 as dependency of commit 35634ffa1751
+ "signal: Always notice exiting tasks"]
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ arch/s390/kernel/compat_signal.c | 79 ++++++++++++++------------------
+ arch/s390/kernel/entry.h | 4 +-
+ arch/s390/kernel/signal.c | 78 +++++++++++++------------------
+ 3 files changed, 69 insertions(+), 92 deletions(-)
+
+--- a/arch/s390/kernel/compat_signal.c
++++ b/arch/s390/kernel/compat_signal.c
+@@ -320,38 +320,39 @@ static inline int map_signal(int sig)
+ return sig;
+ }
+
+-static int setup_frame32(int sig, struct k_sigaction *ka,
+- sigset_t *set, struct pt_regs * regs)
++static int setup_frame32(struct ksignal *ksig, sigset_t *set,
++ struct pt_regs *regs)
+ {
+- sigframe32 __user *frame = get_sigframe(ka, regs, sizeof(sigframe32));
++ int sig = ksig->sig;
++ sigframe32 __user *frame = get_sigframe(&ksig->ka, regs, sizeof(sigframe32));
+
+ if (frame == (void __user *) -1UL)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ if (__copy_to_user(&frame->sc.oldmask, &set->sig, _SIGMASK_COPY_SIZE32))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ if (save_sigregs32(regs, &frame->sregs))
+- goto give_sigsegv;
++ return -EFAULT;
+ if (save_sigregs_gprs_high(regs, frame->gprs_high))
+- goto give_sigsegv;
++ return -EFAULT;
+ if (__put_user((unsigned long) &frame->sregs, &frame->sc.sregs))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /* Set up to return from userspace. If provided, use a stub
+ already in userspace. */
+- if (ka->sa.sa_flags & SA_RESTORER) {
+- regs->gprs[14] = (__u64 __force) ka->sa.sa_restorer | PSW32_ADDR_AMODE;
++ if (ksig->ka.sa.sa_flags & SA_RESTORER) {
++ regs->gprs[14] = (__u64 __force) ksig->ka.sa.sa_restorer | PSW32_ADDR_AMODE;
+ } else {
+ regs->gprs[14] = (__u64 __force) frame->retcode | PSW32_ADDR_AMODE;
+ if (__put_user(S390_SYSCALL_OPCODE | __NR_sigreturn,
+ (u16 __force __user *)(frame->retcode)))
+- goto give_sigsegv;
++ return -EFAULT;
+ }
+
+ /* Set up backchain. */
+ if (__put_user(regs->gprs[15], (unsigned int __user *) frame))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /* Set up registers for signal handler */
+ regs->gprs[15] = (__force __u64) frame;
+@@ -359,7 +360,7 @@ static int setup_frame32(int sig, struct
+ regs->psw.mask = PSW_MASK_BA |
+ (PSW_USER_BITS & PSW_MASK_ASC) |
+ (regs->psw.mask & ~PSW_MASK_ASC);
+- regs->psw.addr = (__force __u64) ka->sa.sa_handler;
++ regs->psw.addr = (__force __u64) ksig->ka.sa.sa_handler;
+
+ regs->gprs[2] = map_signal(sig);
+ regs->gprs[3] = (__force __u64) &frame->sc;
+@@ -376,25 +377,21 @@ static int setup_frame32(int sig, struct
+
+ /* Place signal number on stack to allow backtrace from handler. */
+ if (__put_user(regs->gprs[2], (int __force __user *) &frame->signo))
+- goto give_sigsegv;
++ return -EFAULT;
+ return 0;
+-
+-give_sigsegv:
+- force_sigsegv(sig, current);
+- return -EFAULT;
+ }
+
+-static int setup_rt_frame32(int sig, struct k_sigaction *ka, siginfo_t *info,
+- sigset_t *set, struct pt_regs * regs)
++static int setup_rt_frame32(struct ksignal *ksig, sigset_t *set,
++ struct pt_regs *regs)
+ {
+ int err = 0;
+- rt_sigframe32 __user *frame = get_sigframe(ka, regs, sizeof(rt_sigframe32));
++ rt_sigframe32 __user *frame = get_sigframe(&ksig->ka, regs, sizeof(rt_sigframe32));
+
+ if (frame == (void __user *) -1UL)
+- goto give_sigsegv;
++ return -EFAULT;
+
+- if (copy_siginfo_to_user32(&frame->info, info))
+- goto give_sigsegv;
++ if (copy_siginfo_to_user32(&frame->info, &ksig->info))
++ return -EFAULT;
+
+ /* Create the ucontext. */
+ err |= __put_user(UC_EXTENDED, &frame->uc.uc_flags);
+@@ -404,22 +401,22 @@ static int setup_rt_frame32(int sig, str
+ err |= save_sigregs_gprs_high(regs, frame->gprs_high);
+ err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /* Set up to return from userspace. If provided, use a stub
+ already in userspace. */
+- if (ka->sa.sa_flags & SA_RESTORER) {
+- regs->gprs[14] = (__u64 __force) ka->sa.sa_restorer | PSW32_ADDR_AMODE;
++ if (ksig->ka.sa.sa_flags & SA_RESTORER) {
++ regs->gprs[14] = (__u64 __force) ksig->ka.sa.sa_restorer | PSW32_ADDR_AMODE;
+ } else {
+ regs->gprs[14] = (__u64 __force) frame->retcode | PSW32_ADDR_AMODE;
+ if (__put_user(S390_SYSCALL_OPCODE | __NR_rt_sigreturn,
+ (u16 __force __user *)(frame->retcode)))
+- goto give_sigsegv;
++ return -EFAULT;
+ }
+
+ /* Set up backchain. */
+ if (__put_user(regs->gprs[15], (unsigned int __force __user *) frame))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /* Set up registers for signal handler */
+ regs->gprs[15] = (__force __u64) frame;
+@@ -427,36 +424,30 @@ static int setup_rt_frame32(int sig, str
+ regs->psw.mask = PSW_MASK_BA |
+ (PSW_USER_BITS & PSW_MASK_ASC) |
+ (regs->psw.mask & ~PSW_MASK_ASC);
+- regs->psw.addr = (__u64 __force) ka->sa.sa_handler;
++ regs->psw.addr = (__u64 __force) ksig->ka.sa.sa_handler;
+
+- regs->gprs[2] = map_signal(sig);
++ regs->gprs[2] = map_signal(ksig->sig);
+ regs->gprs[3] = (__force __u64) &frame->info;
+ regs->gprs[4] = (__force __u64) &frame->uc;
+ regs->gprs[5] = task_thread_info(current)->last_break;
+ return 0;
+-
+-give_sigsegv:
+- force_sigsegv(sig, current);
+- return -EFAULT;
+ }
+
+ /*
+ * OK, we're invoking a handler
+ */
+
+-void handle_signal32(unsigned long sig, struct k_sigaction *ka,
+- siginfo_t *info, sigset_t *oldset, struct pt_regs *regs)
++void handle_signal32(struct ksignal *ksig, sigset_t *oldset,
++ struct pt_regs *regs)
+ {
+ int ret;
+
+ /* Set up the stack frame */
+- if (ka->sa.sa_flags & SA_SIGINFO)
+- ret = setup_rt_frame32(sig, ka, info, oldset, regs);
++ if (ksig->ka.sa.sa_flags & SA_SIGINFO)
++ ret = setup_rt_frame32(ksig, oldset, regs);
+ else
+- ret = setup_frame32(sig, ka, oldset, regs);
+- if (ret)
+- return;
+- signal_delivered(sig, info, ka, regs,
+- test_thread_flag(TIF_SINGLE_STEP));
++ ret = setup_frame32(ksig, oldset, regs);
++
++ signal_setup_done(ret, ksig, test_thread_flag(TIF_SINGLE_STEP));
+ }
+
+--- a/arch/s390/kernel/entry.h
++++ b/arch/s390/kernel/entry.h
+@@ -48,8 +48,8 @@ void do_per_trap(struct pt_regs *regs);
+ void syscall_trace(struct pt_regs *regs, int entryexit);
+ void kernel_stack_overflow(struct pt_regs * regs);
+ void do_signal(struct pt_regs *regs);
+-void handle_signal32(unsigned long sig, struct k_sigaction *ka,
+- siginfo_t *info, sigset_t *oldset, struct pt_regs *regs);
++void handle_signal32(struct ksignal *ksig, sigset_t *oldset,
++ struct pt_regs *regs);
+ void do_notify_resume(struct pt_regs *regs);
+
+ void __init init_IRQ(void);
+--- a/arch/s390/kernel/signal.c
++++ b/arch/s390/kernel/signal.c
+@@ -200,15 +200,15 @@ static int setup_frame(int sig, struct k
+ frame = get_sigframe(ka, regs, sizeof(sigframe));
+
+ if (frame == (void __user *) -1UL)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ if (__copy_to_user(&frame->sc.oldmask, &set->sig, _SIGMASK_COPY_SIZE))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ if (save_sigregs(regs, &frame->sregs))
+- goto give_sigsegv;
++ return -EFAULT;
+ if (__put_user(&frame->sregs, &frame->sc.sregs))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /* Set up to return from userspace. If provided, use a stub
+ already in userspace. */
+@@ -220,12 +220,12 @@ static int setup_frame(int sig, struct k
+ frame->retcode | PSW_ADDR_AMODE;
+ if (__put_user(S390_SYSCALL_OPCODE | __NR_sigreturn,
+ (u16 __user *)(frame->retcode)))
+- goto give_sigsegv;
++ return -EFAULT;
+ }
+
+ /* Set up backchain. */
+ if (__put_user(regs->gprs[15], (addr_t __user *) frame))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /* Set up registers for signal handler */
+ regs->gprs[15] = (unsigned long) frame;
+@@ -250,27 +250,23 @@ static int setup_frame(int sig, struct k
+
+ /* Place signal number on stack to allow backtrace from handler. */
+ if (__put_user(regs->gprs[2], (int __user *) &frame->signo))
+- goto give_sigsegv;
++ return -EFAULT;
+ return 0;
+-
+-give_sigsegv:
+- force_sigsegv(sig, current);
+- return -EFAULT;
+ }
+
+-static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+- sigset_t *set, struct pt_regs * regs)
++static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
++ struct pt_regs *regs)
+ {
+ int err = 0;
+ rt_sigframe __user *frame;
+
+- frame = get_sigframe(ka, regs, sizeof(rt_sigframe));
++ frame = get_sigframe(&ksig->ka, regs, sizeof(rt_sigframe));
+
+ if (frame == (void __user *) -1UL)
+- goto give_sigsegv;
++ return -EFAULT;
+
+- if (copy_siginfo_to_user(&frame->info, info))
+- goto give_sigsegv;
++ if (copy_siginfo_to_user(&frame->info, &ksig->info))
++ return -EFAULT;
+
+ /* Create the ucontext. */
+ err |= __put_user(0, &frame->uc.uc_flags);
+@@ -279,24 +275,24 @@ static int setup_rt_frame(int sig, struc
+ err |= save_sigregs(regs, &frame->uc.uc_mcontext);
+ err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /* Set up to return from userspace. If provided, use a stub
+ already in userspace. */
+- if (ka->sa.sa_flags & SA_RESTORER) {
++ if (ksig->ka.sa.sa_flags & SA_RESTORER) {
+ regs->gprs[14] = (unsigned long)
+- ka->sa.sa_restorer | PSW_ADDR_AMODE;
++ ksig->ka.sa.sa_restorer | PSW_ADDR_AMODE;
+ } else {
+ regs->gprs[14] = (unsigned long)
+ frame->retcode | PSW_ADDR_AMODE;
+ if (__put_user(S390_SYSCALL_OPCODE | __NR_rt_sigreturn,
+ (u16 __user *)(frame->retcode)))
+- goto give_sigsegv;
++ return -EFAULT;
+ }
+
+ /* Set up backchain. */
+ if (__put_user(regs->gprs[15], (addr_t __user *) frame))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /* Set up registers for signal handler */
+ regs->gprs[15] = (unsigned long) frame;
+@@ -304,34 +300,27 @@ static int setup_rt_frame(int sig, struc
+ regs->psw.mask = PSW_MASK_EA | PSW_MASK_BA |
+ (PSW_USER_BITS & PSW_MASK_ASC) |
+ (regs->psw.mask & ~PSW_MASK_ASC);
+- regs->psw.addr = (unsigned long) ka->sa.sa_handler | PSW_ADDR_AMODE;
++ regs->psw.addr = (unsigned long) ksig->ka.sa.sa_handler | PSW_ADDR_AMODE;
+
+- regs->gprs[2] = map_signal(sig);
++ regs->gprs[2] = map_signal(ksig->sig);
+ regs->gprs[3] = (unsigned long) &frame->info;
+ regs->gprs[4] = (unsigned long) &frame->uc;
+ regs->gprs[5] = task_thread_info(current)->last_break;
+ return 0;
+-
+-give_sigsegv:
+- force_sigsegv(sig, current);
+- return -EFAULT;
+ }
+
+-static void handle_signal(unsigned long sig, struct k_sigaction *ka,
+- siginfo_t *info, sigset_t *oldset,
+- struct pt_regs *regs)
++static void handle_signal(struct ksignal *ksig, sigset_t *oldset,
++ struct pt_regs *regs)
+ {
+ int ret;
+
+ /* Set up the stack frame */
+- if (ka->sa.sa_flags & SA_SIGINFO)
+- ret = setup_rt_frame(sig, ka, info, oldset, regs);
++ if (ksig->ka.sa.sa_flags & SA_SIGINFO)
++ ret = setup_rt_frame(ksig, oldset, regs);
+ else
+- ret = setup_frame(sig, ka, oldset, regs);
+- if (ret)
+- return;
+- signal_delivered(sig, info, ka, regs,
+- test_thread_flag(TIF_SINGLE_STEP));
++ ret = setup_frame(ksig->sig, &ksig->ka, oldset, regs);
++
++ signal_setup_done(ret, ksig, test_thread_flag(TIF_SINGLE_STEP));
+ }
+
+ /*
+@@ -345,9 +334,7 @@ static void handle_signal(unsigned long
+ */
+ void do_signal(struct pt_regs *regs)
+ {
+- siginfo_t info;
+- int signr;
+- struct k_sigaction ka;
++ struct ksignal ksig;
+ sigset_t *oldset = sigmask_to_save();
+
+ /*
+@@ -357,9 +344,8 @@ void do_signal(struct pt_regs *regs)
+ */
+ current_thread_info()->system_call =
+ test_pt_regs_flag(regs, PIF_SYSCALL) ? regs->int_code : 0;
+- signr = get_signal_to_deliver(&info, &ka, regs, NULL);
+
+- if (signr > 0) {
++ if (get_signal(&ksig)) {
+ /* Whee! Actually deliver the signal. */
+ if (current_thread_info()->system_call) {
+ regs->int_code = current_thread_info()->system_call;
+@@ -370,7 +356,7 @@ void do_signal(struct pt_regs *regs)
+ regs->gprs[2] = -EINTR;
+ break;
+ case -ERESTARTSYS:
+- if (!(ka.sa.sa_flags & SA_RESTART)) {
++ if (!(ksig.ka.sa.sa_flags & SA_RESTART)) {
+ regs->gprs[2] = -EINTR;
+ break;
+ }
+@@ -387,9 +373,9 @@ void do_signal(struct pt_regs *regs)
+ clear_pt_regs_flag(regs, PIF_SYSCALL);
+
+ if (is_compat_task())
+- handle_signal32(signr, &ka, &info, oldset, regs);
++ handle_signal32(&ksig, oldset, regs);
+ else
+- handle_signal(signr, &ka, &info, oldset, regs);
++ handle_signal(&ksig, oldset, regs);
+ return;
+ }
+
diff --git a/queue-3.16/score-use-get_signal-signal_setup_done.patch b/queue-3.16/score-use-get_signal-signal_setup_done.patch
new file mode 100644
index 00000000..28c17032
--- /dev/null
+++ b/queue-3.16/score-use-get_signal-signal_setup_done.patch
@@ -0,0 +1,126 @@
+From: Richard Weinberger <richard@nod.at>
+Date: Mon, 7 Oct 2013 14:37:50 +0200
+Subject: score: Use get_signal() signal_setup_done()
+
+commit 2bb12b773feb3e792145961e57ab356e6134d4a5 upstream.
+
+Use the more generic functions get_signal() signal_setup_done()
+for signal delivery.
+
+Acked-by: Lennox Wu <lennox.wu@gmail.com>
+Signed-off-by: Richard Weinberger <richard@nod.at>
+[bwh: Backported to 3.16 as dependency of commit 35634ffa1751
+ "signal: Always notice exiting tasks"]
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ arch/score/kernel/signal.c | 43 ++++++++++++++++----------------------
+ 1 file changed, 18 insertions(+), 25 deletions(-)
+
+--- a/arch/score/kernel/signal.c
++++ b/arch/score/kernel/signal.c
+@@ -173,15 +173,15 @@ badframe:
+ return 0;
+ }
+
+-static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
+- int signr, sigset_t *set, siginfo_t *info)
++static int setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs,
++ sigset_t *set)
+ {
+ struct rt_sigframe __user *frame;
+ int err = 0;
+
+- frame = get_sigframe(ka, regs, sizeof(*frame));
++ frame = get_sigframe(&ksig->ka, regs, sizeof(*frame));
+ if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /*
+ * Set up the return code ...
+@@ -194,7 +194,7 @@ static int setup_rt_frame(struct k_sigac
+ err |= __put_user(0x80008002, frame->rs_code + 1);
+ flush_cache_sigtramp((unsigned long) frame->rs_code);
+
+- err |= copy_siginfo_to_user(&frame->rs_info, info);
++ err |= copy_siginfo_to_user(&frame->rs_info, &ksig->info);
+ err |= __put_user(0, &frame->rs_uc.uc_flags);
+ err |= __put_user(NULL, &frame->rs_uc.uc_link);
+ err |= __save_altstack(&frame->rs_uc.uc_stack, regs->regs[0]);
+@@ -202,26 +202,23 @@ static int setup_rt_frame(struct k_sigac
+ err |= __copy_to_user(&frame->rs_uc.uc_sigmask, set, sizeof(*set));
+
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ regs->regs[0] = (unsigned long) frame;
+ regs->regs[3] = (unsigned long) frame->rs_code;
+- regs->regs[4] = signr;
++ regs->regs[4] = ksig->sig;
+ regs->regs[5] = (unsigned long) &frame->rs_info;
+ regs->regs[6] = (unsigned long) &frame->rs_uc;
+- regs->regs[29] = (unsigned long) ka->sa.sa_handler;
+- regs->cp0_epc = (unsigned long) ka->sa.sa_handler;
++ regs->regs[29] = (unsigned long) ksig->ka.sa.sa_handler;
++ regs->cp0_epc = (unsigned long) ksig->ka.sa.sa_handler;
+
+ return 0;
+-
+-give_sigsegv:
+- force_sigsegv(signr, current);
+- return -EFAULT;
+ }
+
+-static void handle_signal(unsigned long sig, siginfo_t *info,
+- struct k_sigaction *ka, struct pt_regs *regs)
++static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)
+ {
++ int ret;
++
+ if (regs->is_syscall) {
+ switch (regs->regs[4]) {
+ case ERESTART_RESTARTBLOCK:
+@@ -229,7 +226,7 @@ static void handle_signal(unsigned long
+ regs->regs[4] = EINTR;
+ break;
+ case ERESTARTSYS:
+- if (!(ka->sa.sa_flags & SA_RESTART)) {
++ if (!(ksig->ka.sa.sa_flags & SA_RESTART)) {
+ regs->regs[4] = EINTR;
+ break;
+ }
+@@ -245,17 +242,14 @@ static void handle_signal(unsigned long
+ /*
+ * Set up the stack frame
+ */
+- if (setup_rt_frame(ka, regs, sig, sigmask_to_save(), info) < 0)
+- return;
++ ret = setup_rt_frame(ksig, regs, sigmask_to_save());
+
+- signal_delivered(sig, info, ka, regs, 0);
++ signal_setup_done(ret, ksig, 0);
+ }
+
+ static void do_signal(struct pt_regs *regs)
+ {
+- struct k_sigaction ka;
+- siginfo_t info;
+- int signr;
++ struct ksignal ksig;
+
+ /*
+ * We want the common case to go fast, which is why we may in certain
+@@ -265,10 +259,9 @@ static void do_signal(struct pt_regs *re
+ if (!user_mode(regs))
+ return;
+
+- signr = get_signal_to_deliver(&info, &ka, regs, NULL);
+- if (signr > 0) {
++ if (get_signal(&ksig)) {
+ /* Actually deliver the signal. */
+- handle_signal(signr, &info, &ka, regs);
++ handle_signal(&ksig, regs);
+ return;
+ }
+
diff --git a/queue-3.16/series b/queue-3.16/series
index 8d3c1a1d..5d976da9 100644
--- a/queue-3.16/series
+++ b/queue-3.16/series
@@ -85,6 +85,7 @@ mm-oom-fix-use-after-free-in-oom_kill_process.patch
mm-hwpoison-use-do_send_sig_info-instead-of-force_sig.patch
mm-migrate-don-t-rely-on-__pagemovable-of-newpage-after-unlocking.patch
dmaengine-imx-dma-fix-wrong-callback-invoke.patch
+dmaengine-bcm2835-add-additional-defines-for-dma-registers.patch
dmaengine-bcm2835-fix-interrupt-race-on-rt.patch
dmaengine-bcm2835-fix-abort-of-transactions.patch
perf-x86-intel-uncore-add-node-id-mask.patch
@@ -93,7 +94,6 @@ dmaengine-dmatest-unmap-data-on-a-single-code-path-when-xfer-done.patch
dmaengine-dmatest-abort-test-in-case-of-mapping-error.patch
perf-tests-evsel-tp-sched-fix-bitwise-operator.patch
perf-test-fix-failure-of-evsel-tp-sched-test-on-s390.patch
-net-dp83640-expire-old-tx-skb.patch
s390-qeth-fix-use-after-free-in-error-path.patch
s390-qeth-cancel-close_dev-work-before-removing-a-card.patch
s390-qeth-conclude-all-event-processing-before-offlining-a-card.patch
@@ -105,6 +105,29 @@ alsa-compress-fix-stop-handling-on-compressed-capture-streams.patch
mtd-rawnand-gpmi-fix-mx28-bus-master-lockup-problem.patch
input-bma150-register-input-device-after-setting-private-data.patch
libata-add-nolpm-quirk-for-samsung-mz7te512hmhp-000l1-ssd.patch
+arc-use-get_signal-signal_setup_done.patch
+arm64-use-get_signal-signal_setup_done.patch
+avr32-use-get_signal-signal_setup_done.patch
+blackfin-use-get_signal-signal_setup_done.patch
+c6x-use-get_signal-signal_setup_done.patch
+cris-use-get_signal-signal_setup_done.patch
+frv-use-get_signal-signal_setup_done.patch
+hexagon-use-get_signal-signal_setup_done.patch
+ia64-use-get_signal-signal_setup_done.patch
+m32r-use-get_signal-signal_setup_done.patch
+m68k-use-get_signal-signal_setup_done.patch
+microblaze-use-get_signal-signal_setup_done.patch
+mips-use-get_signal-signal_setup_done.patch
+mn10300-use-get_signal-signal_setup_done.patch
+parisc-use-get_signal-signal_setup_done.patch
+powerpc-use-get_signal-signal_setup_done.patch
+s390-use-get_signal-signal_setup_done.patch
+score-use-get_signal-signal_setup_done.patch
+sh-use-get_signal-signal_setup_done.patch
+tile-use-get_signal-signal_setup_done.patch
+um-use-get_signal-signal_setup_done.patch
+unicore32-use-get_signal-signal_setup_done.patch
+xtensa-use-get_signal-signal_setup_done.patch
tracehook_signal_handler-remove-sig-info-ka-and-regs.patch
clean-up-signal_delivered.patch
rip-out-get_signal_to_deliver.patch
diff --git a/queue-3.16/sh-use-get_signal-signal_setup_done.patch b/queue-3.16/sh-use-get_signal-signal_setup_done.patch
new file mode 100644
index 00000000..d35fc651
--- /dev/null
+++ b/queue-3.16/sh-use-get_signal-signal_setup_done.patch
@@ -0,0 +1,453 @@
+From: Richard Weinberger <richard@nod.at>
+Date: Mon, 7 Oct 2013 14:51:14 +0200
+Subject: sh: Use get_signal() signal_setup_done()
+
+commit b46e848768acc458ba94feef162b8901592dbb9c upstream.
+
+Use the more generic functions get_signal() signal_setup_done()
+for signal delivery.
+
+Signed-off-by: Richard Weinberger <richard@nod.at>
+[bwh: Backported to 3.16 as dependency of commit 35634ffa1751
+ "signal: Always notice exiting tasks"]
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ arch/sh/kernel/signal_32.c | 79 +++++++++++++++---------------------
+ arch/sh/kernel/signal_64.c | 82 +++++++++++++++-----------------------
+ 2 files changed, 64 insertions(+), 97 deletions(-)
+
+--- a/arch/sh/kernel/signal_32.c
++++ b/arch/sh/kernel/signal_32.c
+@@ -262,17 +262,17 @@ get_sigframe(struct k_sigaction *ka, uns
+ extern void __kernel_sigreturn(void);
+ extern void __kernel_rt_sigreturn(void);
+
+-static int setup_frame(int sig, struct k_sigaction *ka,
+- sigset_t *set, struct pt_regs *regs)
++static int setup_frame(struct ksignal *ksig, sigset_t *set,
++ struct pt_regs *regs)
+ {
+ struct sigframe __user *frame;
+- int err = 0;
++ int err = 0, sig = ksig->sig;
+ int signal;
+
+- frame = get_sigframe(ka, regs->regs[15], sizeof(*frame));
++ frame = get_sigframe(&ksig->ka, regs->regs[15], sizeof(*frame));
+
+ if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ signal = current_thread_info()->exec_domain
+ && current_thread_info()->exec_domain->signal_invmap
+@@ -288,8 +288,8 @@ static int setup_frame(int sig, struct k
+
+ /* Set up to return from userspace. If provided, use a stub
+ already in userspace. */
+- if (ka->sa.sa_flags & SA_RESTORER) {
+- regs->pr = (unsigned long) ka->sa.sa_restorer;
++ if (ksig->ka.sa.sa_flags & SA_RESTORER) {
++ regs->pr = (unsigned long) ksig->ka.sa.sa_restorer;
+ #ifdef CONFIG_VSYSCALL
+ } else if (likely(current->mm->context.vdso)) {
+ regs->pr = VDSO_SYM(&__kernel_sigreturn);
+@@ -309,7 +309,7 @@ static int setup_frame(int sig, struct k
+ }
+
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /* Set up registers for signal handler */
+ regs->regs[15] = (unsigned long) frame;
+@@ -319,15 +319,15 @@ static int setup_frame(int sig, struct k
+
+ if (current->personality & FDPIC_FUNCPTRS) {
+ struct fdpic_func_descriptor __user *funcptr =
+- (struct fdpic_func_descriptor __user *)ka->sa.sa_handler;
++ (struct fdpic_func_descriptor __user *)ksig->ka.sa.sa_handler;
+
+ err |= __get_user(regs->pc, &funcptr->text);
+ err |= __get_user(regs->regs[12], &funcptr->GOT);
+ } else
+- regs->pc = (unsigned long)ka->sa.sa_handler;
++ regs->pc = (unsigned long)ksig->ka.sa.sa_handler;
+
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ set_fs(USER_DS);
+
+@@ -335,23 +335,19 @@ static int setup_frame(int sig, struct k
+ current->comm, task_pid_nr(current), frame, regs->pc, regs->pr);
+
+ return 0;
+-
+-give_sigsegv:
+- force_sigsegv(sig, current);
+- return -EFAULT;
+ }
+
+-static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+- sigset_t *set, struct pt_regs *regs)
++static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
++ struct pt_regs *regs)
+ {
+ struct rt_sigframe __user *frame;
+- int err = 0;
++ int err = 0, sig = ksig->sig;
+ int signal;
+
+- frame = get_sigframe(ka, regs->regs[15], sizeof(*frame));
++ frame = get_sigframe(&ksig->ka, regs->regs[15], sizeof(*frame));
+
+ if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ signal = current_thread_info()->exec_domain
+ && current_thread_info()->exec_domain->signal_invmap
+@@ -359,7 +355,7 @@ static int setup_rt_frame(int sig, struc
+ ? current_thread_info()->exec_domain->signal_invmap[sig]
+ : sig;
+
+- err |= copy_siginfo_to_user(&frame->info, info);
++ err |= copy_siginfo_to_user(&frame->info, &ksig->info);
+
+ /* Create the ucontext. */
+ err |= __put_user(0, &frame->uc.uc_flags);
+@@ -371,8 +367,8 @@ static int setup_rt_frame(int sig, struc
+
+ /* Set up to return from userspace. If provided, use a stub
+ already in userspace. */
+- if (ka->sa.sa_flags & SA_RESTORER) {
+- regs->pr = (unsigned long) ka->sa.sa_restorer;
++ if (ksig->ka.sa.sa_flags & SA_RESTORER) {
++ regs->pr = (unsigned long) ksig->ka.sa.sa_restorer;
+ #ifdef CONFIG_VSYSCALL
+ } else if (likely(current->mm->context.vdso)) {
+ regs->pr = VDSO_SYM(&__kernel_rt_sigreturn);
+@@ -392,7 +388,7 @@ static int setup_rt_frame(int sig, struc
+ }
+
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /* Set up registers for signal handler */
+ regs->regs[15] = (unsigned long) frame;
+@@ -402,15 +398,15 @@ static int setup_rt_frame(int sig, struc
+
+ if (current->personality & FDPIC_FUNCPTRS) {
+ struct fdpic_func_descriptor __user *funcptr =
+- (struct fdpic_func_descriptor __user *)ka->sa.sa_handler;
++ (struct fdpic_func_descriptor __user *)ksig->ka.sa.sa_handler;
+
+ err |= __get_user(regs->pc, &funcptr->text);
+ err |= __get_user(regs->regs[12], &funcptr->GOT);
+ } else
+- regs->pc = (unsigned long)ka->sa.sa_handler;
++ regs->pc = (unsigned long)ksig->ka.sa.sa_handler;
+
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ set_fs(USER_DS);
+
+@@ -418,10 +414,6 @@ static int setup_rt_frame(int sig, struc
+ current->comm, task_pid_nr(current), frame, regs->pc, regs->pr);
+
+ return 0;
+-
+-give_sigsegv:
+- force_sigsegv(sig, current);
+- return -EFAULT;
+ }
+
+ static inline void
+@@ -455,22 +447,18 @@ handle_syscall_restart(unsigned long sav
+ * OK, we're invoking a handler
+ */
+ static void
+-handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
+- struct pt_regs *regs, unsigned int save_r0)
++handle_signal(struct ksignal *ksig, struct pt_regs *regs, unsigned int save_r0)
+ {
+ sigset_t *oldset = sigmask_to_save();
+ int ret;
+
+ /* Set up the stack frame */
+- if (ka->sa.sa_flags & SA_SIGINFO)
+- ret = setup_rt_frame(sig, ka, info, oldset, regs);
++ if (ksig->ka.sa.sa_flags & SA_SIGINFO)
++ ret = setup_rt_frame(ksig, oldset, regs);
+ else
+- ret = setup_frame(sig, ka, oldset, regs);
++ ret = setup_frame(ksig, oldset, regs);
+
+- if (ret)
+- return;
+- signal_delivered(sig, info, ka, regs,
+- test_thread_flag(TIF_SINGLESTEP));
++ signal_setup_done(ret, ksig, test_thread_flag(TIF_SINGLESTEP));
+ }
+
+ /*
+@@ -484,9 +472,7 @@ handle_signal(unsigned long sig, struct
+ */
+ static void do_signal(struct pt_regs *regs, unsigned int save_r0)
+ {
+- siginfo_t info;
+- int signr;
+- struct k_sigaction ka;
++ struct ksignal ksig;
+
+ /*
+ * We want the common case to go fast, which
+@@ -497,12 +483,11 @@ static void do_signal(struct pt_regs *re
+ if (!user_mode(regs))
+ return;
+
+- signr = get_signal_to_deliver(&info, &ka, regs, NULL);
+- if (signr > 0) {
+- handle_syscall_restart(save_r0, regs, &ka.sa);
++ if (get_signal(&ksig)) {
++ handle_syscall_restart(save_r0, regs, &ksig.ka.sa);
+
+ /* Whee! Actually deliver the signal. */
+- handle_signal(signr, &ka, &info, regs, save_r0);
++ handle_signal(&ksig, regs, save_r0);
+ return;
+ }
+
+--- a/arch/sh/kernel/signal_64.c
++++ b/arch/sh/kernel/signal_64.c
+@@ -41,8 +41,7 @@
+ #define DEBUG_SIG 0
+
+ static void
+-handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
+- struct pt_regs * regs);
++handle_signal(struct ksignal *ksig, struct pt_regs *regs);
+
+ static inline void
+ handle_syscall_restart(struct pt_regs *regs, struct sigaction *sa)
+@@ -82,9 +81,7 @@ handle_syscall_restart(struct pt_regs *r
+ */
+ static void do_signal(struct pt_regs *regs)
+ {
+- siginfo_t info;
+- int signr;
+- struct k_sigaction ka;
++ struct ksignal ksig;
+
+ /*
+ * We want the common case to go fast, which
+@@ -95,12 +92,11 @@ static void do_signal(struct pt_regs *re
+ if (!user_mode(regs))
+ return;
+
+- signr = get_signal_to_deliver(&info, &ka, regs, 0);
+- if (signr > 0) {
+- handle_syscall_restart(regs, &ka.sa);
++ if (get_signal(&ksig)) {
++ handle_syscall_restart(regs, &ksig.ka.sa);
+
+ /* Whee! Actually deliver the signal. */
+- handle_signal(signr, &info, &ka, regs);
++ handle_signal(&ksig, regs);
+ return;
+ }
+
+@@ -378,17 +374,16 @@ get_sigframe(struct k_sigaction *ka, uns
+ void sa_default_restorer(void); /* See comments below */
+ void sa_default_rt_restorer(void); /* See comments below */
+
+-static int setup_frame(int sig, struct k_sigaction *ka,
+- sigset_t *set, struct pt_regs *regs)
++static int setup_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs)
+ {
+ struct sigframe __user *frame;
+- int err = 0;
++ int err = 0, sig = ksig->sig;
+ int signal;
+
+- frame = get_sigframe(ka, regs->regs[REG_SP], sizeof(*frame));
++ frame = get_sigframe(&ksig->ka, regs->regs[REG_SP], sizeof(*frame));
+
+ if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ signal = current_thread_info()->exec_domain
+ && current_thread_info()->exec_domain->signal_invmap
+@@ -400,7 +395,7 @@ static int setup_frame(int sig, struct k
+
+ /* Give up earlier as i386, in case */
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ if (_NSIG_WORDS > 1) {
+ err |= __copy_to_user(frame->extramask, &set->sig[1],
+@@ -408,16 +403,16 @@ static int setup_frame(int sig, struct k
+
+ /* Give up earlier as i386, in case */
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /* Set up to return from userspace. If provided, use a stub
+ already in userspace. */
+- if (ka->sa.sa_flags & SA_RESTORER) {
++ if (ksig->ka.sa.sa_flags & SA_RESTORER) {
+ /*
+ * On SH5 all edited pointers are subject to NEFF
+ */
+ DEREF_REG_PR = neff_sign_extend((unsigned long)
+- ka->sa.sa_restorer | 0x1);
++ ksig->ka->sa.sa_restorer | 0x1);
+ } else {
+ /*
+ * Different approach on SH5.
+@@ -435,7 +430,7 @@ static int setup_frame(int sig, struct k
+
+ if (__copy_to_user(frame->retcode,
+ (void *)((unsigned long)sa_default_restorer & (~1)), 16) != 0)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /* Cohere the trampoline with the I-cache. */
+ flush_cache_sigtramp(DEREF_REG_PR-1);
+@@ -460,7 +455,7 @@ static int setup_frame(int sig, struct k
+ regs->regs[REG_ARG2] = (unsigned long long)(unsigned long)(signed long)&frame->sc;
+ regs->regs[REG_ARG3] = (unsigned long long)(unsigned long)(signed long)&frame->sc;
+
+- regs->pc = neff_sign_extend((unsigned long)ka->sa.sa_handler);
++ regs->pc = neff_sign_extend((unsigned long)ksig->ka.sa.sa_handler);
+
+ set_fs(USER_DS);
+
+@@ -471,23 +466,19 @@ static int setup_frame(int sig, struct k
+ DEREF_REG_PR >> 32, DEREF_REG_PR & 0xffffffff);
+
+ return 0;
+-
+-give_sigsegv:
+- force_sigsegv(sig, current);
+- return -EFAULT;
+ }
+
+-static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+- sigset_t *set, struct pt_regs *regs)
++static int setup_rt_frame(struct ksignal *kig, sigset_t *set,
++ struct pt_regs *regs)
+ {
+ struct rt_sigframe __user *frame;
+- int err = 0;
++ int err = 0, sig = ksig->sig;
+ int signal;
+
+- frame = get_sigframe(ka, regs->regs[REG_SP], sizeof(*frame));
++ frame = get_sigframe(&ksig->ka, regs->regs[REG_SP], sizeof(*frame));
+
+ if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
+- goto give_sigsegv;
++ return -EFAULT;
+
+ signal = current_thread_info()->exec_domain
+ && current_thread_info()->exec_domain->signal_invmap
+@@ -497,11 +488,11 @@ static int setup_rt_frame(int sig, struc
+
+ err |= __put_user(&frame->info, &frame->pinfo);
+ err |= __put_user(&frame->uc, &frame->puc);
+- err |= copy_siginfo_to_user(&frame->info, info);
++ err |= copy_siginfo_to_user(&frame->info, &ksig->info);
+
+ /* Give up earlier as i386, in case */
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /* Create the ucontext. */
+ err |= __put_user(0, &frame->uc.uc_flags);
+@@ -513,16 +504,16 @@ static int setup_rt_frame(int sig, struc
+
+ /* Give up earlier as i386, in case */
+ if (err)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /* Set up to return from userspace. If provided, use a stub
+ already in userspace. */
+- if (ka->sa.sa_flags & SA_RESTORER) {
++ if (ksig->ka.sa.sa_flags & SA_RESTORER) {
+ /*
+ * On SH5 all edited pointers are subject to NEFF
+ */
+ DEREF_REG_PR = neff_sign_extend((unsigned long)
+- ka->sa.sa_restorer | 0x1);
++ ksig->ka.sa.sa_restorer | 0x1);
+ } else {
+ /*
+ * Different approach on SH5.
+@@ -540,7 +531,7 @@ static int setup_rt_frame(int sig, struc
+
+ if (__copy_to_user(frame->retcode,
+ (void *)((unsigned long)sa_default_rt_restorer & (~1)), 16) != 0)
+- goto give_sigsegv;
++ return -EFAULT;
+
+ /* Cohere the trampoline with the I-cache. */
+ flush_icache_range(DEREF_REG_PR-1, DEREF_REG_PR-1+15);
+@@ -554,7 +545,7 @@ static int setup_rt_frame(int sig, struc
+ regs->regs[REG_ARG1] = signal; /* Arg for signal handler */
+ regs->regs[REG_ARG2] = (unsigned long long)(unsigned long)(signed long)&frame->info;
+ regs->regs[REG_ARG3] = (unsigned long long)(unsigned long)(signed long)&frame->uc.uc_mcontext;
+- regs->pc = neff_sign_extend((unsigned long)ka->sa.sa_handler);
++ regs->pc = neff_sign_extend((unsigned long)ksig->ka.sa.sa_handler);
+
+ set_fs(USER_DS);
+
+@@ -564,33 +555,24 @@ static int setup_rt_frame(int sig, struc
+ DEREF_REG_PR >> 32, DEREF_REG_PR & 0xffffffff);
+
+ return 0;
+-
+-give_sigsegv:
+- force_sigsegv(sig, current);
+- return -EFAULT;
+ }
+
+ /*
+ * OK, we're invoking a handler
+ */
+ static void
+-handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
+- struct pt_regs * regs)
++handle_signal(struct ksignal *ksig, struct pt_regs *regs)
+ {
+ sigset_t *oldset = sigmask_to_save();
+ int ret;
+
+ /* Set up the stack frame */
+- if (ka->sa.sa_flags & SA_SIGINFO)
+- ret = setup_rt_frame(sig, ka, info, oldset, regs);
++ if (ksig->ka.sa.sa_flags & SA_SIGINFO)
++ ret = setup_rt_frame(ksig, oldset, regs);
+ else
+- ret = setup_frame(sig, ka, oldset, regs);
+-
+- if (ret)
+- return;
++ ret = setup_frame(ksig, oldset, regs);
+
+- signal_delivered(sig, info, ka, regs,
+- test_thread_flag(TIF_SINGLESTEP));
++ signal_setup_done(ret, ksig, test_thread_flag(TIF_SINGLESTEP));
+ }
+
+ asmlinkage void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags)
diff --git a/queue-3.16/tile-use-get_signal-signal_setup_done.patch b/queue-3.16/tile-use-get_signal-signal_setup_done.patch
new file mode 100644
index 00000000..ab061d56
--- /dev/null
+++ b/queue-3.16/tile-use-get_signal-signal_setup_done.patch
@@ -0,0 +1,250 @@
+From: Richard Weinberger <richard@nod.at>
+Date: Mon, 7 Oct 2013 15:01:08 +0200
+Subject: tile: Use get_signal() signal_setup_done()
+
+commit b3707c7ed013d36752272ca2f9ed20dc8aed92e4 upstream.
+
+Use the more generic functions get_signal() signal_setup_done()
+for signal delivery.
+
+Signed-off-by: Richard Weinberger <richard@nod.at>
+Acked-by: Chris Metcalf <cmetcalf@tilera.com>
+[bwh: Backported to 3.16 as dependency of commit 35634ffa1751
+ "signal: Always notice exiting tasks"]
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ arch/tile/include/asm/compat.h | 3 +-
+ arch/tile/kernel/compat_signal.c | 29 ++++++++---------
+ arch/tile/kernel/signal.c | 54 ++++++++++++++------------------
+ 3 files changed, 40 insertions(+), 46 deletions(-)
+
+--- a/arch/tile/include/asm/compat.h
++++ b/arch/tile/include/asm/compat.h
+@@ -267,8 +267,7 @@ static inline int is_compat_task(void)
+ return current_thread_info()->status & TS_COMPAT;
+ }
+
+-extern int compat_setup_rt_frame(int sig, struct k_sigaction *ka,
+- siginfo_t *info, sigset_t *set,
++extern int compat_setup_rt_frame(struct ksignal *ksig, sigset_t *set,
+ struct pt_regs *regs);
+
+ /* Compat syscalls. */
+--- a/arch/tile/kernel/compat_signal.c
++++ b/arch/tile/kernel/compat_signal.c
+@@ -190,18 +190,18 @@ static inline void __user *compat_get_si
+ return (void __user *) sp;
+ }
+
+-int compat_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+- sigset_t *set, struct pt_regs *regs)
++int compat_setup_rt_frame(struct ksignal *ksig, sigset_t *set,
++ struct pt_regs *regs)
+ {
+ unsigned long restorer;
+ struct compat_rt_sigframe __user *frame;
+- int err = 0;
++ int err = 0, sig = ksig->sig;
+ int usig;
+
+- frame = compat_get_sigframe(ka, regs, sizeof(*frame));
++ frame = compat_get_sigframe(&ksig->ka, regs, sizeof(*frame));
+
+ if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
+- goto give_sigsegv;
++ goto err;
+
+ usig = current_thread_info()->exec_domain
+ && current_thread_info()->exec_domain->signal_invmap
+@@ -210,12 +210,12 @@ int compat_setup_rt_frame(int sig, struc
+ : sig;
+
+ /* Always write at least the signal number for the stack backtracer. */
+- if (ka->sa.sa_flags & SA_SIGINFO) {
++ if (ksig->ka.sa.sa_flags & SA_SIGINFO) {
+ /* At sigreturn time, restore the callee-save registers too. */
+- err |= copy_siginfo_to_user32(&frame->info, info);
++ err |= copy_siginfo_to_user32(&frame->info, &ksig->info);
+ regs->flags |= PT_FLAGS_RESTORE_REGS;
+ } else {
+- err |= __put_user(info->si_signo, &frame->info.si_signo);
++ err |= __put_user(ksig->info.si_signo, &frame->info.si_signo);
+ }
+
+ /* Create the ucontext. */
+@@ -226,11 +226,11 @@ int compat_setup_rt_frame(int sig, struc
+ err |= setup_sigcontext(&frame->uc.uc_mcontext, regs);
+ err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
+ if (err)
+- goto give_sigsegv;
++ goto err;
+
+ restorer = VDSO_SYM(&__vdso_rt_sigreturn);
+- if (ka->sa.sa_flags & SA_RESTORER)
+- restorer = ptr_to_compat_reg(ka->sa.sa_restorer);
++ if (ksig->ka.sa.sa_flags & SA_RESTORER)
++ restorer = ptr_to_compat_reg(ksig->ka.sa.sa_restorer);
+
+ /*
+ * Set up registers for signal handler.
+@@ -239,7 +239,7 @@ int compat_setup_rt_frame(int sig, struc
+ * We always pass siginfo and mcontext, regardless of SA_SIGINFO,
+ * since some things rely on this (e.g. glibc's debug/segfault.c).
+ */
+- regs->pc = ptr_to_compat_reg(ka->sa.sa_handler);
++ regs->pc = ptr_to_compat_reg(ksig->ka.sa.sa_handler);
+ regs->ex1 = PL_ICS_EX1(USER_PL, 1); /* set crit sec in handler */
+ regs->sp = ptr_to_compat_reg(frame);
+ regs->lr = restorer;
+@@ -249,7 +249,8 @@ int compat_setup_rt_frame(int sig, struc
+ regs->flags |= PT_FLAGS_CALLER_SAVES;
+ return 0;
+
+-give_sigsegv:
+- signal_fault("bad setup frame", regs, frame, sig);
++err:
++ trace_unhandled_signal("bad sigreturn frame", regs,
++ (unsigned long)frame, SIGSEGV);
+ return -EFAULT;
+ }
+--- a/arch/tile/kernel/signal.c
++++ b/arch/tile/kernel/signal.c
+@@ -153,18 +153,18 @@ static inline void __user *get_sigframe(
+ return (void __user *) sp;
+ }
+
+-static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+- sigset_t *set, struct pt_regs *regs)
++static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
++ struct pt_regs *regs)
+ {
+ unsigned long restorer;
+ struct rt_sigframe __user *frame;
+- int err = 0;
++ int err = 0, sig = ksig->sig;
+ int usig;
+
+- frame = get_sigframe(ka, regs, sizeof(*frame));
++ frame = get_sigframe(&ksig->ka, regs, sizeof(*frame));
+
+ if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
+- goto give_sigsegv;
++ goto err;
+
+ usig = current_thread_info()->exec_domain
+ && current_thread_info()->exec_domain->signal_invmap
+@@ -173,12 +173,12 @@ static int setup_rt_frame(int sig, struc
+ : sig;
+
+ /* Always write at least the signal number for the stack backtracer. */
+- if (ka->sa.sa_flags & SA_SIGINFO) {
++ if (ksig->ka.sa.sa_flags & SA_SIGINFO) {
+ /* At sigreturn time, restore the callee-save registers too. */
+- err |= copy_siginfo_to_user(&frame->info, info);
++ err |= copy_siginfo_to_user(&frame->info, &ksig->info);
+ regs->flags |= PT_FLAGS_RESTORE_REGS;
+ } else {
+- err |= __put_user(info->si_signo, &frame->info.si_signo);
++ err |= __put_user(ksig->info.si_signo, &frame->info.si_signo);
+ }
+
+ /* Create the ucontext. */
+@@ -189,11 +189,11 @@ static int setup_rt_frame(int sig, struc
+ err |= setup_sigcontext(&frame->uc.uc_mcontext, regs);
+ err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
+ if (err)
+- goto give_sigsegv;
++ goto err;
+
+ restorer = VDSO_SYM(&__vdso_rt_sigreturn);
+- if (ka->sa.sa_flags & SA_RESTORER)
+- restorer = (unsigned long) ka->sa.sa_restorer;
++ if (ksig->ka.sa.sa_flags & SA_RESTORER)
++ restorer = (unsigned long) ksig->ka.sa.sa_restorer;
+
+ /*
+ * Set up registers for signal handler.
+@@ -202,7 +202,7 @@ static int setup_rt_frame(int sig, struc
+ * We always pass siginfo and mcontext, regardless of SA_SIGINFO,
+ * since some things rely on this (e.g. glibc's debug/segfault.c).
+ */
+- regs->pc = (unsigned long) ka->sa.sa_handler;
++ regs->pc = (unsigned long) ksig->ka.sa.sa_handler;
+ regs->ex1 = PL_ICS_EX1(USER_PL, 1); /* set crit sec in handler */
+ regs->sp = (unsigned long) frame;
+ regs->lr = restorer;
+@@ -212,8 +212,9 @@ static int setup_rt_frame(int sig, struc
+ regs->flags |= PT_FLAGS_CALLER_SAVES;
+ return 0;
+
+-give_sigsegv:
+- signal_fault("bad setup frame", regs, frame, sig);
++err:
++ trace_unhandled_signal("bad sigreturn frame", regs,
++ (unsigned long)frame, SIGSEGV);
+ return -EFAULT;
+ }
+
+@@ -221,9 +222,7 @@ give_sigsegv:
+ * OK, we're invoking a handler
+ */
+
+-static void handle_signal(unsigned long sig, siginfo_t *info,
+- struct k_sigaction *ka,
+- struct pt_regs *regs)
++static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)
+ {
+ sigset_t *oldset = sigmask_to_save();
+ int ret;
+@@ -238,7 +237,7 @@ static void handle_signal(unsigned long
+ break;
+
+ case -ERESTARTSYS:
+- if (!(ka->sa.sa_flags & SA_RESTART)) {
++ if (!(ksig->ka.sa.sa_flags & SA_RESTART)) {
+ regs->regs[0] = -EINTR;
+ break;
+ }
+@@ -254,14 +253,12 @@ static void handle_signal(unsigned long
+ /* Set up the stack frame */
+ #ifdef CONFIG_COMPAT
+ if (is_compat_task())
+- ret = compat_setup_rt_frame(sig, ka, info, oldset, regs);
++ ret = compat_setup_rt_frame(ksig, oldset, regs);
+ else
+ #endif
+- ret = setup_rt_frame(sig, ka, info, oldset, regs);
+- if (ret)
+- return;
+- signal_delivered(sig, info, ka, regs,
+- test_thread_flag(TIF_SINGLESTEP));
++ ret = setup_rt_frame(ksig, oldset, regs);
++
++ signal_setup_done(ret, ksig, test_thread_flag(TIF_SINGLESTEP));
+ }
+
+ /*
+@@ -271,9 +268,7 @@ static void handle_signal(unsigned long
+ */
+ void do_signal(struct pt_regs *regs)
+ {
+- siginfo_t info;
+- int signr;
+- struct k_sigaction ka;
++ struct ksignal ksig;
+
+ /*
+ * i386 will check if we're coming from kernel mode and bail out
+@@ -282,10 +277,9 @@ void do_signal(struct pt_regs *regs)
+ * helpful, we can reinstate the check on "!user_mode(regs)".
+ */
+
+- signr = get_signal_to_deliver(&info, &ka, regs, NULL);
+- if (signr > 0) {
++ if (get_signal(&ksig)) {
+ /* Whee! Actually deliver the signal. */
+- handle_signal(signr, &info, &ka, regs);
++ handle_signal(&ksig, regs);
+ goto done;
+ }
+
diff --git a/queue-3.16/um-use-get_signal-signal_setup_done.patch b/queue-3.16/um-use-get_signal-signal_setup_done.patch
new file mode 100644
index 00000000..22c9c5d8
--- /dev/null
+++ b/queue-3.16/um-use-get_signal-signal_setup_done.patch
@@ -0,0 +1,232 @@
+From: Richard Weinberger <richard@nod.at>
+Date: Sun, 6 Oct 2013 21:57:10 +0200
+Subject: um: Use get_signal() signal_setup_done()
+
+commit 307627eebbb0bc41b21e74d78b932362a6c1b38d upstream.
+
+Use the more generic functions get_signal() signal_setup_done()
+for signal delivery.
+
+Signed-off-by: Richard Weinberger <richard@nod.at>
+[bwh: Backported to 3.16 as dependency of commit 35634ffa1751
+ "signal: Always notice exiting tasks"]
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ arch/um/include/shared/frame_kern.h | 12 +++-----
+ arch/um/kernel/signal.c | 27 +++++++----------
+ arch/x86/um/signal.c | 45 ++++++++++++++---------------
+ 3 files changed, 36 insertions(+), 48 deletions(-)
+
+--- a/arch/um/include/shared/frame_kern.h
++++ b/arch/um/include/shared/frame_kern.h
+@@ -6,14 +6,10 @@
+ #ifndef __FRAME_KERN_H_
+ #define __FRAME_KERN_H_
+
+-extern int setup_signal_stack_sc(unsigned long stack_top, int sig,
+- struct k_sigaction *ka,
+- struct pt_regs *regs,
+- sigset_t *mask);
+-extern int setup_signal_stack_si(unsigned long stack_top, int sig,
+- struct k_sigaction *ka,
+- struct pt_regs *regs, struct siginfo *info,
+- sigset_t *mask);
++extern int setup_signal_stack_sc(unsigned long stack_top, struct ksignal *ksig,
++ struct pt_regs *regs, sigset_t *mask);
++extern int setup_signal_stack_si(unsigned long stack_top, struct ksignal *ksig,
++ struct pt_regs *regs, sigset_t *mask);
+
+ #endif
+
+--- a/arch/um/kernel/signal.c
++++ b/arch/um/kernel/signal.c
+@@ -18,8 +18,7 @@ EXPORT_SYMBOL(unblock_signals);
+ /*
+ * OK, we're invoking a handler
+ */
+-static void handle_signal(struct pt_regs *regs, unsigned long signr,
+- struct k_sigaction *ka, struct siginfo *info)
++static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)
+ {
+ sigset_t *oldset = sigmask_to_save();
+ int singlestep = 0;
+@@ -39,7 +38,7 @@ static void handle_signal(struct pt_regs
+ break;
+
+ case -ERESTARTSYS:
+- if (!(ka->sa.sa_flags & SA_RESTART)) {
++ if (!(ksig->ka.sa.sa_flags & SA_RESTART)) {
+ PT_REGS_SYSCALL_RET(regs) = -EINTR;
+ break;
+ }
+@@ -52,32 +51,28 @@ static void handle_signal(struct pt_regs
+ }
+
+ sp = PT_REGS_SP(regs);
+- if ((ka->sa.sa_flags & SA_ONSTACK) && (sas_ss_flags(sp) == 0))
++ if ((ksig->ka.sa.sa_flags & SA_ONSTACK) && (sas_ss_flags(sp) == 0))
+ sp = current->sas_ss_sp + current->sas_ss_size;
+
+ #ifdef CONFIG_ARCH_HAS_SC_SIGNALS
+- if (!(ka->sa.sa_flags & SA_SIGINFO))
+- err = setup_signal_stack_sc(sp, signr, ka, regs, oldset);
++ if (!(ksig->ka.sa.sa_flags & SA_SIGINFO))
++ err = setup_signal_stack_sc(sp, ksig, regs, oldset);
+ else
+ #endif
+- err = setup_signal_stack_si(sp, signr, ka, regs, info, oldset);
++ err = setup_signal_stack_si(sp, ksig, regs, oldset);
+
+- if (err)
+- force_sigsegv(signr, current);
+- else
+- signal_delivered(signr, info, ka, regs, singlestep);
++ signal_setup_done(err, ksig, singlestep);
+ }
+
+ static int kern_do_signal(struct pt_regs *regs)
+ {
+- struct k_sigaction ka_copy;
+- struct siginfo info;
+- int sig, handled_sig = 0;
++ struct ksignal ksig;
++ int handled_sig = 0;
+
+- while ((sig = get_signal_to_deliver(&info, &ka_copy, regs, NULL)) > 0) {
++ while (get_signal(&ksig)) {
+ handled_sig = 1;
+ /* Whee! Actually deliver the signal. */
+- handle_signal(regs, sig, &ka_copy, &info);
++ handle_signal(&ksig, regs);
+ }
+
+ /* Did we come from a system call? */
+--- a/arch/x86/um/signal.c
++++ b/arch/x86/um/signal.c
+@@ -370,13 +370,12 @@ struct rt_sigframe
+ char retcode[8];
+ };
+
+-int setup_signal_stack_sc(unsigned long stack_top, int sig,
+- struct k_sigaction *ka, struct pt_regs *regs,
+- sigset_t *mask)
++int setup_signal_stack_sc(unsigned long stack_top, struct ksignal *ksig,
++ struct pt_regs *regs, sigset_t *mask)
+ {
+ struct sigframe __user *frame;
+ void __user *restorer;
+- int err = 0;
++ int err = 0, sig = ksig->sig;
+
+ /* This is the same calculation as i386 - ((sp + 4) & 15) == 0 */
+ stack_top = ((stack_top + 4) & -16UL) - 4;
+@@ -385,8 +384,8 @@ int setup_signal_stack_sc(unsigned long
+ return 1;
+
+ restorer = frame->retcode;
+- if (ka->sa.sa_flags & SA_RESTORER)
+- restorer = ka->sa.sa_restorer;
++ if (ksig->ka.sa.sa_flags & SA_RESTORER)
++ restorer = ksig->ka.sa.sa_restorer;
+
+ err |= __put_user(restorer, &frame->pretcode);
+ err |= __put_user(sig, &frame->sig);
+@@ -410,20 +409,19 @@ int setup_signal_stack_sc(unsigned long
+ return err;
+
+ PT_REGS_SP(regs) = (unsigned long) frame;
+- PT_REGS_IP(regs) = (unsigned long) ka->sa.sa_handler;
++ PT_REGS_IP(regs) = (unsigned long) ksig->ka.sa.sa_handler;
+ PT_REGS_AX(regs) = (unsigned long) sig;
+ PT_REGS_DX(regs) = (unsigned long) 0;
+ PT_REGS_CX(regs) = (unsigned long) 0;
+ return 0;
+ }
+
+-int setup_signal_stack_si(unsigned long stack_top, int sig,
+- struct k_sigaction *ka, struct pt_regs *regs,
+- siginfo_t *info, sigset_t *mask)
++int setup_signal_stack_si(unsigned long stack_top, struct ksignal *ksig,
++ struct pt_regs *regs, sigset_t *mask)
+ {
+ struct rt_sigframe __user *frame;
+ void __user *restorer;
+- int err = 0;
++ int err = 0, sig = ksig->sig;
+
+ stack_top &= -8UL;
+ frame = (struct rt_sigframe __user *) stack_top - 1;
+@@ -431,14 +429,14 @@ int setup_signal_stack_si(unsigned long
+ return 1;
+
+ restorer = frame->retcode;
+- if (ka->sa.sa_flags & SA_RESTORER)
+- restorer = ka->sa.sa_restorer;
++ if (ksig->ka.sa.sa_flags & SA_RESTORER)
++ restorer = ksig->ka.sa.sa_restorer;
+
+ err |= __put_user(restorer, &frame->pretcode);
+ err |= __put_user(sig, &frame->sig);
+ err |= __put_user(&frame->info, &frame->pinfo);
+ err |= __put_user(&frame->uc, &frame->puc);
+- err |= copy_siginfo_to_user(&frame->info, info);
++ err |= copy_siginfo_to_user(&frame->info, &ksig->info);
+ err |= copy_ucontext_to_user(&frame->uc, &frame->fpstate, mask,
+ PT_REGS_SP(regs));
+
+@@ -457,7 +455,7 @@ int setup_signal_stack_si(unsigned long
+ return err;
+
+ PT_REGS_SP(regs) = (unsigned long) frame;
+- PT_REGS_IP(regs) = (unsigned long) ka->sa.sa_handler;
++ PT_REGS_IP(regs) = (unsigned long) ksig->ka.sa.sa_handler;
+ PT_REGS_AX(regs) = (unsigned long) sig;
+ PT_REGS_DX(regs) = (unsigned long) &frame->info;
+ PT_REGS_CX(regs) = (unsigned long) &frame->uc;
+@@ -502,12 +500,11 @@ struct rt_sigframe
+ struct _fpstate fpstate;
+ };
+
+-int setup_signal_stack_si(unsigned long stack_top, int sig,
+- struct k_sigaction *ka, struct pt_regs * regs,
+- siginfo_t *info, sigset_t *set)
++int setup_signal_stack_si(unsigned long stack_top, struct ksignal *ksig,
++ struct pt_regs *regs, sigset_t *set)
+ {
+ struct rt_sigframe __user *frame;
+- int err = 0;
++ int err = 0, sig = ksig->sig;
+
+ frame = (struct rt_sigframe __user *)
+ round_down(stack_top - sizeof(struct rt_sigframe), 16);
+@@ -517,8 +514,8 @@ int setup_signal_stack_si(unsigned long
+ if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
+ goto out;
+
+- if (ka->sa.sa_flags & SA_SIGINFO) {
+- err |= copy_siginfo_to_user(&frame->info, info);
++ if (ksig->ka.sa.sa_flags & SA_SIGINFO) {
++ err |= copy_siginfo_to_user(&frame->info, &ksig->info);
+ if (err)
+ goto out;
+ }
+@@ -543,8 +540,8 @@ int setup_signal_stack_si(unsigned long
+ * already in userspace.
+ */
+ /* x86-64 should always use SA_RESTORER. */
+- if (ka->sa.sa_flags & SA_RESTORER)
+- err |= __put_user(ka->sa.sa_restorer, &frame->pretcode);
++ if (ksig->ka.sa.sa_flags & SA_RESTORER)
++ err |= __put_user(ksig->ka.sa.sa_restorer, &frame->pretcode);
+ else
+ /* could use a vstub here */
+ return err;
+@@ -570,7 +567,7 @@ int setup_signal_stack_si(unsigned long
+ */
+ PT_REGS_SI(regs) = (unsigned long) &frame->info;
+ PT_REGS_DX(regs) = (unsigned long) &frame->uc;
+- PT_REGS_IP(regs) = (unsigned long) ka->sa.sa_handler;
++ PT_REGS_IP(regs) = (unsigned long) ksig->ka.sa.sa_handler;
+ out:
+ return err;
+ }
diff --git a/queue-3.16/unicore32-use-get_signal-signal_setup_done.patch b/queue-3.16/unicore32-use-get_signal-signal_setup_done.patch
new file mode 100644
index 00000000..725d5e18
--- /dev/null
+++ b/queue-3.16/unicore32-use-get_signal-signal_setup_done.patch
@@ -0,0 +1,147 @@
+From: Richard Weinberger <richard@nod.at>
+Date: Mon, 7 Oct 2013 15:05:57 +0200
+Subject: unicore32: Use get_signal() signal_setup_done()
+
+commit 649671c90eaf3cbbd0cd03460b6a92c0b674a32e upstream.
+
+Use the more generic functions get_signal() signal_setup_done()
+for signal delivery.
+
+Signed-off-by: Richard Weinberger <richard@nod.at>
+[bwh: Backported to 3.16 as dependency of commit 35634ffa1751
+ "signal: Always notice exiting tasks"]
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ arch/unicore32/kernel/signal.c | 48 ++++++++++++++--------------------
+ 1 file changed, 20 insertions(+), 28 deletions(-)
+
+diff --git a/arch/unicore32/kernel/signal.c b/arch/unicore32/kernel/signal.c
+index 6905f0ebdc77..780d77388dec 100644
+--- a/arch/unicore32/kernel/signal.c
++++ b/arch/unicore32/kernel/signal.c
+@@ -238,10 +238,10 @@ static int setup_return(struct pt_regs *regs, struct k_sigaction *ka,
+ return 0;
+ }
+
+-static int setup_frame(int usig, struct k_sigaction *ka,
+- sigset_t *set, struct pt_regs *regs)
++static int setup_frame(struct ksignal *ksig, sigset_t *set,
++ struct pt_regs *regs)
+ {
+- struct sigframe __user *frame = get_sigframe(ka, regs, sizeof(*frame));
++ struct sigframe __user *frame = get_sigframe(&ksig->ka, regs, sizeof(*frame));
+ int err = 0;
+
+ if (!frame)
+@@ -254,29 +254,29 @@ static int setup_frame(int usig, struct k_sigaction *ka,
+
+ err |= setup_sigframe(frame, regs, set);
+ if (err == 0)
+- err |= setup_return(regs, ka, frame->retcode, frame, usig);
++ err |= setup_return(regs, &ksig->ka, frame->retcode, frame, usig);
+
+ return err;
+ }
+
+-static int setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,
+- sigset_t *set, struct pt_regs *regs)
++static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
++ struct pt_regs *regs)
+ {
+ struct rt_sigframe __user *frame =
+- get_sigframe(ka, regs, sizeof(*frame));
++ get_sigframe(&ksig->ka, regs, sizeof(*frame));
+ int err = 0;
+
+ if (!frame)
+ return 1;
+
+- err |= copy_siginfo_to_user(&frame->info, info);
++ err |= copy_siginfo_to_user(&frame->info, &ksig->info);
+
+ err |= __put_user(0, &frame->sig.uc.uc_flags);
+ err |= __put_user(NULL, &frame->sig.uc.uc_link);
+ err |= __save_altstack(&frame->sig.uc.uc_stack, regs->UCreg_sp);
+ err |= setup_sigframe(&frame->sig, regs, set);
+ if (err == 0)
+- err |= setup_return(regs, ka, frame->sig.retcode, frame, usig);
++ err |= setup_return(regs, &ksig->ka, frame->sig.retcode, frame, usig);
+
+ if (err == 0) {
+ /*
+@@ -299,13 +299,13 @@ static inline void setup_syscall_restart(struct pt_regs *regs)
+ /*
+ * OK, we're invoking a handler
+ */
+-static void handle_signal(unsigned long sig, struct k_sigaction *ka,
+- siginfo_t *info, struct pt_regs *regs, int syscall)
++static void handle_signal(struct ksignal *ksig, struct pt_regs *regs,
++ int syscall)
+ {
+ struct thread_info *thread = current_thread_info();
+ struct task_struct *tsk = current;
+ sigset_t *oldset = sigmask_to_save();
+- int usig = sig;
++ int usig = ksig->sig;
+ int ret;
+
+ /*
+@@ -318,7 +318,7 @@ static void handle_signal(unsigned long sig, struct k_sigaction *ka,
+ regs->UCreg_00 = -EINTR;
+ break;
+ case -ERESTARTSYS:
+- if (!(ka->sa.sa_flags & SA_RESTART)) {
++ if (!(ksig->ka.sa.sa_flags & SA_RESTART)) {
+ regs->UCreg_00 = -EINTR;
+ break;
+ }
+@@ -338,22 +338,17 @@ static void handle_signal(unsigned long sig, struct k_sigaction *ka,
+ /*
+ * Set up the stack frame
+ */
+- if (ka->sa.sa_flags & SA_SIGINFO)
+- ret = setup_rt_frame(usig, ka, info, oldset, regs);
++ if (ksig->ka.sa.sa_flags & SA_SIGINFO)
++ ret = setup_rt_frame(ksig, oldset, regs);
+ else
+- ret = setup_frame(usig, ka, oldset, regs);
++ ret = setup_frame(ksig, oldset, regs);
+
+ /*
+ * Check that the resulting registers are actually sane.
+ */
+ ret |= !valid_user_regs(regs);
+
+- if (ret != 0) {
+- force_sigsegv(sig, tsk);
+- return;
+- }
+-
+- signal_delivered(sig, info, ka, regs, 0);
++ signal_setup_done(ret, ksig, 0);
+ }
+
+ /*
+@@ -367,9 +362,7 @@ static void handle_signal(unsigned long sig, struct k_sigaction *ka,
+ */
+ static void do_signal(struct pt_regs *regs, int syscall)
+ {
+- struct k_sigaction ka;
+- siginfo_t info;
+- int signr;
++ struct ksignal ksig;
+
+ /*
+ * We want the common case to go fast, which
+@@ -380,9 +373,8 @@ static void do_signal(struct pt_regs *regs, int syscall)
+ if (!user_mode(regs))
+ return;
+
+- signr = get_signal_to_deliver(&info, &ka, regs, NULL);
+- if (signr > 0) {
+- handle_signal(signr, &ka, &info, regs, syscall);
++ if (get_signsl(&ksig)) {
++ handle_signal(&ksig, regs, syscall);
+ return;
+ }
+
diff --git a/queue-3.16/xtensa-use-get_signal-signal_setup_done.patch b/queue-3.16/xtensa-use-get_signal-signal_setup_done.patch
new file mode 100644
index 00000000..c8b524a4
--- /dev/null
+++ b/queue-3.16/xtensa-use-get_signal-signal_setup_done.patch
@@ -0,0 +1,144 @@
+From: Richard Weinberger <richard@nod.at>
+Date: Mon, 7 Oct 2013 15:09:23 +0200
+Subject: xtensa: Use get_signal() signal_setup_done()
+
+commit 5bdb7611eb7987102f3c0fef1220dd64b6fbd9fd upstream.
+
+Use the more generic functions get_signal() signal_setup_done()
+for signal delivery.
+
+Signed-off-by: Richard Weinberger <richard@nod.at>
+[bwh: Backported to 3.16 as dependency of commit 35634ffa1751
+ "signal: Always notice exiting tasks"]
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ arch/xtensa/kernel/signal.c | 43 ++++++++++++++-----------------------
+ 1 file changed, 16 insertions(+), 27 deletions(-)
+
+diff --git a/arch/xtensa/kernel/signal.c b/arch/xtensa/kernel/signal.c
+index 98b67d5f1514..4612321c73cc 100644
+--- a/arch/xtensa/kernel/signal.c
++++ b/arch/xtensa/kernel/signal.c
+@@ -331,17 +331,17 @@ gen_return_code(unsigned char *codemem)
+ }
+
+
+-static int setup_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+- sigset_t *set, struct pt_regs *regs)
++static int setup_frame(struct ksignal *ksig, sigset_t *set,
++ struct pt_regs *regs)
+ {
+ struct rt_sigframe *frame;
+- int err = 0;
++ int err = 0, sig = ksig->sig;
+ int signal;
+ unsigned long sp, ra, tp;
+
+ sp = regs->areg[1];
+
+- if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && sas_ss_flags(sp) == 0) {
++ if ((ksig->ka.sa.sa_flags & SA_ONSTACK) != 0 && sas_ss_flags(sp) == 0) {
+ sp = current->sas_ss_sp + current->sas_ss_size;
+ }
+
+@@ -351,7 +351,7 @@ static int setup_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+ panic ("Double exception sys_sigreturn\n");
+
+ if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) {
+- goto give_sigsegv;
++ return -EFAULT;
+ }
+
+ signal = current_thread_info()->exec_domain
+@@ -360,8 +360,8 @@ static int setup_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+ ? current_thread_info()->exec_domain->signal_invmap[sig]
+ : sig;
+
+- if (ka->sa.sa_flags & SA_SIGINFO) {
+- err |= copy_siginfo_to_user(&frame->info, info);
++ if (ksig->ka.sa.sa_flags & SA_SIGINFO) {
++ err |= copy_siginfo_to_user(&frame->info, &ksig->info);
+ }
+
+ /* Create the user context. */
+@@ -372,8 +372,8 @@ static int setup_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+ err |= setup_sigcontext(frame, regs);
+ err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
+
+- if (ka->sa.sa_flags & SA_RESTORER) {
+- ra = (unsigned long)ka->sa.sa_restorer;
++ if (ksig->ka.sa.sa_flags & SA_RESTORER) {
++ ra = (unsigned long)ksig->ka.sa.sa_restorer;
+ } else {
+
+ /* Create sys_rt_sigreturn syscall in stack frame */
+@@ -381,7 +381,7 @@ static int setup_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+ err |= gen_return_code(frame->retcode);
+
+ if (err) {
+- goto give_sigsegv;
++ return -EFAULT;
+ }
+ ra = (unsigned long) frame->retcode;
+ }
+@@ -393,7 +393,7 @@ static int setup_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+
+ /* Set up registers for signal handler; preserve the threadptr */
+ tp = regs->threadptr;
+- start_thread(regs, (unsigned long) ka->sa.sa_handler,
++ start_thread(regs, (unsigned long) ksig->ka.sa.sa_handler,
+ (unsigned long) frame);
+
+ /* Set up a stack frame for a call4
+@@ -416,10 +416,6 @@ static int setup_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+ #endif
+
+ return 0;
+-
+-give_sigsegv:
+- force_sigsegv(sig, current);
+- return -EFAULT;
+ }
+
+ /*
+@@ -433,15 +429,11 @@ static int setup_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+ */
+ static void do_signal(struct pt_regs *regs)
+ {
+- siginfo_t info;
+- int signr;
+- struct k_sigaction ka;
++ struct ksignal ksig;
+
+ task_pt_regs(current)->icountlevel = 0;
+
+- signr = get_signal_to_deliver(&info, &ka, regs, NULL);
+-
+- if (signr > 0) {
++ if (get_signal(&ksig)) {
+ int ret;
+
+ /* Are we from a system call? */
+@@ -457,7 +449,7 @@ static void do_signal(struct pt_regs *regs)
+ break;
+
+ case -ERESTARTSYS:
+- if (!(ka.sa.sa_flags & SA_RESTART)) {
++ if (!(ksig.ka.sa.sa_flags & SA_RESTART)) {
+ regs->areg[2] = -EINTR;
+ break;
+ }
+@@ -476,11 +468,8 @@ static void do_signal(struct pt_regs *regs)
+
+ /* Whee! Actually deliver the signal. */
+ /* Set up the stack frame */
+- ret = setup_frame(signr, &ka, &info, sigmask_to_save(), regs);
+- if (ret)
+- return;
+-
+- signal_delivered(signr, &info, &ka, regs, 0);
++ ret = setup_frame(&ksig, sigmask_to_save(), regs);
++ signal_setup_done(ret, &ksig, 0);
+ if (current->ptrace & PT_SINGLESTEP)
+ task_pt_regs(current)->icountlevel = 1;
+