m68k: add TIF_NOTIFY_RESUME and handle it.
authorAl Viro <viro@zeniv.linux.org.uk>
Tue, 24 Apr 2012 05:46:23 +0000 (01:46 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Tue, 22 May 2012 03:59:47 +0000 (23:59 -0400)
TIF_NOTIFY_RESUME added (as bit 5).  That way nommu glue needs no changes at
all; mmu one needs just to replace jmi do_signal_return to jne do_signal_return
There we have flags shifted up, until bit 6 (SIGPENDING) is in MSBit; instead
of checking that MSBit is set (jmi) we check that MSBit or something below it
is set (jne); bits 0..4 are never set, so that's precisely "bit 6 or bit 5 is
set".

Usual handling of NOTIFY_RESUME/SIGPENDING is done in do_notify_resume(); glue
calls it instead of do_signal().

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
arch/m68k/include/asm/thread_info.h
arch/m68k/kernel/entry_mm.S
arch/m68k/kernel/signal.c
arch/m68k/platform/68328/entry.S
arch/m68k/platform/68360/entry.S
arch/m68k/platform/coldfire/entry.S

index e8665e6..126131f 100644 (file)
@@ -71,6 +71,7 @@ static inline struct thread_info *current_thread_info(void)
  * bits 0-7 are tested at every exception exit
  * bits 8-15 are also tested at syscall exit
  */
+#define TIF_NOTIFY_RESUME      5       /* callback before returning to user */
 #define TIF_SIGPENDING         6       /* signal pending */
 #define TIF_NEED_RESCHED       7       /* rescheduling necessary */
 #define TIF_DELAYED_TRACE      14      /* single step a syscall */
index 675a854..f29e73c 100644 (file)
@@ -148,7 +148,7 @@ syscall_exit_work:
        jcs     do_trace_exit
        jmi     do_delayed_trace
        lslw    #8,%d0
-       jmi     do_signal_return
+       jne     do_signal_return
        pea     resume_userspace
        jra     schedule
 
@@ -172,7 +172,7 @@ exit_work:
        | save top of frame
        movel   %sp,%curptr@(TASK_THREAD+THREAD_ESP0)
        lslb    #1,%d0
-       jmi     do_signal_return
+       jne     do_signal_return
        pea     resume_userspace
        jra     schedule
 
@@ -182,7 +182,7 @@ do_signal_return:
        subql   #4,%sp                  | dummy return address
        SAVE_SWITCH_STACK
        pea     %sp@(SWITCH_STACK_SIZE)
-       bsrl    do_signal
+       bsrl    do_notify_resume
        addql   #4,%sp
        RESTORE_SWITCH_STACK
        addql   #4,%sp
index d8f6960..d9f3d19 100644 (file)
@@ -43,6 +43,7 @@
 #include <linux/tty.h>
 #include <linux/binfmts.h>
 #include <linux/module.h>
+#include <linux/tracehook.h>
 
 #include <asm/setup.h>
 #include <asm/uaccess.h>
@@ -1154,7 +1155,7 @@ handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info,
  * want to handle. Thus you cannot kill init even with a SIGKILL even by
  * mistake.
  */
-asmlinkage void do_signal(struct pt_regs *regs)
+static void do_signal(struct pt_regs *regs)
 {
        siginfo_t info;
        struct k_sigaction ka;
@@ -1186,3 +1187,15 @@ asmlinkage void do_signal(struct pt_regs *regs)
                sigprocmask(SIG_SETMASK, &current->saved_sigmask, NULL);
        }
 }
+
+void do_notify_resume(struct pt_regs *regs)
+{
+       if (test_thread_flag(TIF_SIGPENDING))
+               do_signal(regs);
+
+       if (test_and_clear_thread_flag(TIF_NOTIFY_RESUME)) {
+               tracehook_notify_resume(regs);
+               if (current->replacement_session_keyring)
+                       key_replace_session_keyring();
+       }
+}
index 5c39b80..7f91c2f 100644 (file)
@@ -119,7 +119,7 @@ Lsignal_return:
        subql   #4,%sp                  /* dummy return address*/
        SAVE_SWITCH_STACK
        pea     %sp@(SWITCH_STACK_SIZE)
-       bsrw    do_signal
+       bsrw    do_notify_resume
        addql   #4,%sp
        RESTORE_SWITCH_STACK
        addql   #4,%sp
index aa47d1d..904fd9a 100644 (file)
@@ -115,7 +115,7 @@ Lsignal_return:
        subql   #4,%sp                  /* dummy return address*/
        SAVE_SWITCH_STACK
        pea     %sp@(SWITCH_STACK_SIZE)
-       bsrw    do_signal
+       bsrw    do_notify_resume
        addql   #4,%sp
        RESTORE_SWITCH_STACK
        addql   #4,%sp
index 281e38c..881ab8e 100644 (file)
@@ -152,7 +152,7 @@ Lsignal_return:
        subql   #4,%sp                  /* dummy return address */
        SAVE_SWITCH_STACK
        pea     %sp@(SWITCH_STACK_SIZE)
-       jsr     do_signal
+       jsr     do_notify_resume
        addql   #4,%sp
        RESTORE_SWITCH_STACK
        addql   #4,%sp