]> git.karo-electronics.de Git - linux-beck.git/commitdiff
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 e8665e6f9464d2c7a77c225af1de88140315a543..126131f94a2ca951a2db9c9a414e3c30a142baeb 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 675a854966a62df047045c8dc8fc8016530e77c6..f29e73ca9dbbb7302c859ec92856d87c4b17f786 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 d8f6960e8fd9ecb98eedfe64a549665302fa4924..d9f3d1900eed029a5044fb05845dceeccb261844 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 5c39b80ed7de0bf16362a1e51a9ede3086a7ad9a..7f91c2fde5096b9eaaef2e33334cf0339b896352 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 aa47d1d49929cb508824a0cccde1fad4066309af..904fd9a4af4e45d472a121fdc678a523655059cc 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 281e38c2b6c74976c1c5da0ee061b51ce9335a4c..881ab8e379d4c68a42854b372fb906ef8f32d07c 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