diff options
| author | David Howells <dhowells@redhat.com> | 2009-09-02 04:14:16 -0400 |
|---|---|---|
| committer | James Morris <jmorris@namei.org> | 2009-09-02 07:29:19 -0400 |
| commit | d0420c83f39f79afb82010c2d2cafd150eef651b (patch) | |
| tree | 0aa939d78ed62bafdd6e38ca26451f8039392378 | |
| parent | 7b1b9164598286fe93927ff41eed2a2609fd9056 (diff) | |
KEYS: Extend TIF_NOTIFY_RESUME to (almost) all architectures [try #6]
Implement TIF_NOTIFY_RESUME for most of those architectures in which isn't yet
available, and, whilst we're at it, have it call the appropriate tracehook.
After this patch, blackfin, m68k* and xtensa still lack support and need
alteration of assembly code to make it work.
Resume notification can then be used (by a later patch) to install a new
session keyring on the parent of a process.
Signed-off-by: David Howells <dhowells@redhat.com>
Acked-by: Russell King <rmk+kernel@arm.linux.org.uk>
cc: linux-arch@vger.kernel.org
Signed-off-by: James Morris <jmorris@namei.org>
| -rw-r--r-- | arch/alpha/include/asm/thread_info.h | 5 | ||||
| -rw-r--r-- | arch/alpha/kernel/signal.c | 5 | ||||
| -rw-r--r-- | arch/arm/include/asm/thread_info.h | 3 | ||||
| -rw-r--r-- | arch/arm/kernel/entry-common.S | 2 | ||||
| -rw-r--r-- | arch/arm/kernel/signal.c | 5 | ||||
| -rw-r--r-- | arch/avr32/include/asm/thread_info.h | 6 | ||||
| -rw-r--r-- | arch/avr32/kernel/entry-avr32b.S | 2 | ||||
| -rw-r--r-- | arch/avr32/kernel/signal.c | 5 | ||||
| -rw-r--r-- | arch/cris/kernel/ptrace.c | 5 | ||||
| -rw-r--r-- | arch/h8300/include/asm/thread_info.h | 2 | ||||
| -rw-r--r-- | arch/h8300/kernel/signal.c | 5 | ||||
| -rw-r--r-- | arch/m32r/include/asm/thread_info.h | 2 | ||||
| -rw-r--r-- | arch/m32r/kernel/signal.c | 5 | ||||
| -rw-r--r-- | arch/mips/include/asm/thread_info.h | 2 | ||||
| -rw-r--r-- | arch/mips/kernel/signal.c | 5 | ||||
| -rw-r--r-- | arch/parisc/include/asm/thread_info.h | 4 | ||||
| -rw-r--r-- | arch/parisc/kernel/entry.S | 2 | ||||
| -rw-r--r-- | arch/parisc/kernel/signal.c | 5 |
18 files changed, 64 insertions, 6 deletions
diff --git a/arch/alpha/include/asm/thread_info.h b/arch/alpha/include/asm/thread_info.h index 60c83abfde70..5076a8860b18 100644 --- a/arch/alpha/include/asm/thread_info.h +++ b/arch/alpha/include/asm/thread_info.h | |||
| @@ -75,6 +75,7 @@ register struct thread_info *__current_thread_info __asm__("$8"); | |||
| 75 | #define TIF_UAC_SIGBUS 7 | 75 | #define TIF_UAC_SIGBUS 7 |
| 76 | #define TIF_MEMDIE 8 | 76 | #define TIF_MEMDIE 8 |
| 77 | #define TIF_RESTORE_SIGMASK 9 /* restore signal mask in do_signal */ | 77 | #define TIF_RESTORE_SIGMASK 9 /* restore signal mask in do_signal */ |
| 78 | #define TIF_NOTIFY_RESUME 10 /* callback before returning to user */ | ||
| 78 | #define TIF_FREEZE 16 /* is freezing for suspend */ | 79 | #define TIF_FREEZE 16 /* is freezing for suspend */ |
| 79 | 80 | ||
| 80 | #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) | 81 | #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) |
| @@ -82,10 +83,12 @@ register struct thread_info *__current_thread_info __asm__("$8"); | |||
| 82 | #define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) | 83 | #define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) |
| 83 | #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) | 84 | #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) |
| 84 | #define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK) | 85 | #define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK) |
| 86 | #define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME) | ||
| 85 | #define _TIF_FREEZE (1<<TIF_FREEZE) | 87 | #define _TIF_FREEZE (1<<TIF_FREEZE) |
| 86 | 88 | ||
| 87 | /* Work to do on interrupt/exception return. */ | 89 | /* Work to do on interrupt/exception return. */ |
| 88 | #define _TIF_WORK_MASK (_TIF_SIGPENDING | _TIF_NEED_RESCHED) | 90 | #define _TIF_WORK_MASK (_TIF_SIGPENDING | _TIF_NEED_RESCHED | \ |
| 91 | _TIF_NOTIFY_RESUME) | ||
| 89 | 92 | ||
| 90 | /* Work to do on any return to userspace. */ | 93 | /* Work to do on any return to userspace. */ |
| 91 | #define _TIF_ALLWORK_MASK (_TIF_WORK_MASK \ | 94 | #define _TIF_ALLWORK_MASK (_TIF_WORK_MASK \ |
diff --git a/arch/alpha/kernel/signal.c b/arch/alpha/kernel/signal.c index df65eaa84c4c..04e17c1f0f1b 100644 --- a/arch/alpha/kernel/signal.c +++ b/arch/alpha/kernel/signal.c | |||
| @@ -683,4 +683,9 @@ do_notify_resume(struct pt_regs *regs, struct switch_stack *sw, | |||
| 683 | { | 683 | { |
| 684 | if (thread_info_flags & (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK)) | 684 | if (thread_info_flags & (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK)) |
| 685 | do_signal(regs, sw, r0, r19); | 685 | do_signal(regs, sw, r0, r19); |
| 686 | |||
| 687 | if (thread_info_flags & _TIF_NOTIFY_RESUME) { | ||
| 688 | clear_thread_flag(TIF_NOTIFY_RESUME); | ||
| 689 | tracehook_notify_resume(regs); | ||
| 690 | } | ||
| 686 | } | 691 | } |
diff --git a/arch/arm/include/asm/thread_info.h b/arch/arm/include/asm/thread_info.h index 73394e50cbca..d3a39b1e6c0f 100644 --- a/arch/arm/include/asm/thread_info.h +++ b/arch/arm/include/asm/thread_info.h | |||
| @@ -130,11 +130,13 @@ extern void vfp_sync_state(struct thread_info *thread); | |||
| 130 | * TIF_SYSCALL_TRACE - syscall trace active | 130 | * TIF_SYSCALL_TRACE - syscall trace active |
| 131 | * TIF_SIGPENDING - signal pending | 131 | * TIF_SIGPENDING - signal pending |
| 132 | * TIF_NEED_RESCHED - rescheduling necessary | 132 | * TIF_NEED_RESCHED - rescheduling necessary |
| 133 | * TIF_NOTIFY_RESUME - callback before returning to user | ||
| 133 | * TIF_USEDFPU - FPU was used by this task this quantum (SMP) | 134 | * TIF_USEDFPU - FPU was used by this task this quantum (SMP) |
| 134 | * TIF_POLLING_NRFLAG - true if poll_idle() is polling TIF_NEED_RESCHED | 135 | * TIF_POLLING_NRFLAG - true if poll_idle() is polling TIF_NEED_RESCHED |
| 135 | */ | 136 | */ |
| 136 | #define TIF_SIGPENDING 0 | 137 | #define TIF_SIGPENDING 0 |
| 137 | #define TIF_NEED_RESCHED 1 | 138 | #define TIF_NEED_RESCHED 1 |
| 139 | #define TIF_NOTIFY_RESUME 2 /* callback before returning to user */ | ||
| 138 | #define TIF_SYSCALL_TRACE 8 | 140 | #define TIF_SYSCALL_TRACE 8 |
| 139 | #define TIF_POLLING_NRFLAG 16 | 141 | #define TIF_POLLING_NRFLAG 16 |
| 140 | #define TIF_USING_IWMMXT 17 | 142 | #define TIF_USING_IWMMXT 17 |
| @@ -143,6 +145,7 @@ extern void vfp_sync_state(struct thread_info *thread); | |||
| 143 | 145 | ||
| 144 | #define _TIF_SIGPENDING (1 << TIF_SIGPENDING) | 146 | #define _TIF_SIGPENDING (1 << TIF_SIGPENDING) |
| 145 | #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) | 147 | #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) |
| 148 | #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) | ||
| 146 | #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) | 149 | #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) |
| 147 | #define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG) | 150 | #define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG) |
| 148 | #define _TIF_USING_IWMMXT (1 << TIF_USING_IWMMXT) | 151 | #define _TIF_USING_IWMMXT (1 << TIF_USING_IWMMXT) |
diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 8c3de1a350b5..7813ab782fda 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S | |||
| @@ -51,7 +51,7 @@ fast_work_pending: | |||
| 51 | work_pending: | 51 | work_pending: |
| 52 | tst r1, #_TIF_NEED_RESCHED | 52 | tst r1, #_TIF_NEED_RESCHED |
| 53 | bne work_resched | 53 | bne work_resched |
| 54 | tst r1, #_TIF_SIGPENDING | 54 | tst r1, #_TIF_SIGPENDING|_TIF_NOTIFY_RESUME |
| 55 | beq no_work_pending | 55 | beq no_work_pending |
| 56 | mov r0, sp @ 'regs' | 56 | mov r0, sp @ 'regs' |
| 57 | mov r2, why @ 'syscall' | 57 | mov r2, why @ 'syscall' |
diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index f6bc5d442782..13dec276927a 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c | |||
| @@ -707,4 +707,9 @@ do_notify_resume(struct pt_regs *regs, unsigned int thread_flags, int syscall) | |||
| 707 | { | 707 | { |
| 708 | if (thread_flags & _TIF_SIGPENDING) | 708 | if (thread_flags & _TIF_SIGPENDING) |
| 709 | do_signal(¤t->blocked, regs, syscall); | 709 | do_signal(¤t->blocked, regs, syscall); |
| 710 | |||
| 711 | if (thread_flags & _TIF_NOTIFY_RESUME) { | ||
| 712 | clear_thread_flag(TIF_NOTIFY_RESUME); | ||
| 713 | tracehook_notify_resume(regs); | ||
| 714 | } | ||
| 710 | } | 715 | } |
diff --git a/arch/avr32/include/asm/thread_info.h b/arch/avr32/include/asm/thread_info.h index fc42de5ca209..fd0c5d7e9337 100644 --- a/arch/avr32/include/asm/thread_info.h +++ b/arch/avr32/include/asm/thread_info.h | |||
| @@ -84,6 +84,7 @@ static inline struct thread_info *current_thread_info(void) | |||
| 84 | #define TIF_MEMDIE 6 | 84 | #define TIF_MEMDIE 6 |
| 85 | #define TIF_RESTORE_SIGMASK 7 /* restore signal mask in do_signal */ | 85 | #define TIF_RESTORE_SIGMASK 7 /* restore signal mask in do_signal */ |
| 86 | #define TIF_CPU_GOING_TO_SLEEP 8 /* CPU is entering sleep 0 mode */ | 86 | #define TIF_CPU_GOING_TO_SLEEP 8 /* CPU is entering sleep 0 mode */ |
| 87 | #define TIF_NOTIFY_RESUME 9 /* callback before returning to user */ | ||
| 87 | #define TIF_FREEZE 29 | 88 | #define TIF_FREEZE 29 |
| 88 | #define TIF_DEBUG 30 /* debugging enabled */ | 89 | #define TIF_DEBUG 30 /* debugging enabled */ |
| 89 | #define TIF_USERSPACE 31 /* true if FS sets userspace */ | 90 | #define TIF_USERSPACE 31 /* true if FS sets userspace */ |
| @@ -96,6 +97,7 @@ static inline struct thread_info *current_thread_info(void) | |||
| 96 | #define _TIF_MEMDIE (1 << TIF_MEMDIE) | 97 | #define _TIF_MEMDIE (1 << TIF_MEMDIE) |
| 97 | #define _TIF_RESTORE_SIGMASK (1 << TIF_RESTORE_SIGMASK) | 98 | #define _TIF_RESTORE_SIGMASK (1 << TIF_RESTORE_SIGMASK) |
| 98 | #define _TIF_CPU_GOING_TO_SLEEP (1 << TIF_CPU_GOING_TO_SLEEP) | 99 | #define _TIF_CPU_GOING_TO_SLEEP (1 << TIF_CPU_GOING_TO_SLEEP) |
| 100 | #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) | ||
| 99 | #define _TIF_FREEZE (1 << TIF_FREEZE) | 101 | #define _TIF_FREEZE (1 << TIF_FREEZE) |
| 100 | 102 | ||
| 101 | /* Note: The masks below must never span more than 16 bits! */ | 103 | /* Note: The masks below must never span more than 16 bits! */ |
| @@ -103,13 +105,15 @@ static inline struct thread_info *current_thread_info(void) | |||
| 103 | /* work to do on interrupt/exception return */ | 105 | /* work to do on interrupt/exception return */ |
| 104 | #define _TIF_WORK_MASK \ | 106 | #define _TIF_WORK_MASK \ |
| 105 | ((1 << TIF_SIGPENDING) \ | 107 | ((1 << TIF_SIGPENDING) \ |
| 108 | | _TIF_NOTIFY_RESUME \ | ||
| 106 | | (1 << TIF_NEED_RESCHED) \ | 109 | | (1 << TIF_NEED_RESCHED) \ |
| 107 | | (1 << TIF_POLLING_NRFLAG) \ | 110 | | (1 << TIF_POLLING_NRFLAG) \ |
| 108 | | (1 << TIF_BREAKPOINT) \ | 111 | | (1 << TIF_BREAKPOINT) \ |
| 109 | | (1 << TIF_RESTORE_SIGMASK)) | 112 | | (1 << TIF_RESTORE_SIGMASK)) |
| 110 | 113 | ||
| 111 | /* work to do on any return to userspace */ | 114 | /* work to do on any return to userspace */ |
| 112 | #define _TIF_ALLWORK_MASK (_TIF_WORK_MASK | (1 << TIF_SYSCALL_TRACE)) | 115 | #define _TIF_ALLWORK_MASK (_TIF_WORK_MASK | (1 << TIF_SYSCALL_TRACE) | \ |
| 116 | _TIF_NOTIFY_RESUME) | ||
| 113 | /* work to do on return from debug mode */ | 117 | /* work to do on return from debug mode */ |
| 114 | #define _TIF_DBGWORK_MASK (_TIF_WORK_MASK & ~(1 << TIF_BREAKPOINT)) | 118 | #define _TIF_DBGWORK_MASK (_TIF_WORK_MASK & ~(1 << TIF_BREAKPOINT)) |
| 115 | 119 | ||
diff --git a/arch/avr32/kernel/entry-avr32b.S b/arch/avr32/kernel/entry-avr32b.S index 009a80155d67..169268c40ae2 100644 --- a/arch/avr32/kernel/entry-avr32b.S +++ b/arch/avr32/kernel/entry-avr32b.S | |||
| @@ -281,7 +281,7 @@ syscall_exit_work: | |||
| 281 | ld.w r1, r0[TI_flags] | 281 | ld.w r1, r0[TI_flags] |
| 282 | rjmp 1b | 282 | rjmp 1b |
| 283 | 283 | ||
| 284 | 2: mov r2, _TIF_SIGPENDING | _TIF_RESTORE_SIGMASK | 284 | 2: mov r2, _TIF_SIGPENDING | _TIF_RESTORE_SIGMASK | _TIF_NOTIFY_RESUME |
| 285 | tst r1, r2 | 285 | tst r1, r2 |
| 286 | breq 3f | 286 | breq 3f |
| 287 | unmask_interrupts | 287 | unmask_interrupts |
diff --git a/arch/avr32/kernel/signal.c b/arch/avr32/kernel/signal.c index 27227561bad6..62d242e2d033 100644 --- a/arch/avr32/kernel/signal.c +++ b/arch/avr32/kernel/signal.c | |||
| @@ -322,4 +322,9 @@ asmlinkage void do_notify_resume(struct pt_regs *regs, struct thread_info *ti) | |||
| 322 | 322 | ||
| 323 | if (ti->flags & (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK)) | 323 | if (ti->flags & (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK)) |
| 324 | do_signal(regs, ¤t->blocked, syscall); | 324 | do_signal(regs, ¤t->blocked, syscall); |
| 325 | |||
| 326 | if (ti->flags & _TIF_NOTIFY_RESUME) { | ||
| 327 | clear_thread_flag(TIF_NOTIFY_RESUME); | ||
| 328 | tracehook_notify_resume(regs); | ||
| 329 | } | ||
| 325 | } | 330 | } |
diff --git a/arch/cris/kernel/ptrace.c b/arch/cris/kernel/ptrace.c index b326023baab2..4f06d7fb43dd 100644 --- a/arch/cris/kernel/ptrace.c +++ b/arch/cris/kernel/ptrace.c | |||
| @@ -36,4 +36,9 @@ void do_notify_resume(int canrestart, struct pt_regs *regs, | |||
| 36 | /* deal with pending signal delivery */ | 36 | /* deal with pending signal delivery */ |
| 37 | if (thread_info_flags & _TIF_SIGPENDING) | 37 | if (thread_info_flags & _TIF_SIGPENDING) |
| 38 | do_signal(canrestart,regs); | 38 | do_signal(canrestart,regs); |
| 39 | |||
| 40 | if (thread_info_flags & _TIF_NOTIFY_RESUME) { | ||
| 41 | clear_thread_flag(TIF_NOTIFY_RESUME); | ||
| 42 | tracehook_notify_resume(regs); | ||
| 43 | } | ||
| 39 | } | 44 | } |
diff --git a/arch/h8300/include/asm/thread_info.h b/arch/h8300/include/asm/thread_info.h index 8bbc8b0ee45d..70e67e47d020 100644 --- a/arch/h8300/include/asm/thread_info.h +++ b/arch/h8300/include/asm/thread_info.h | |||
| @@ -89,6 +89,7 @@ static inline struct thread_info *current_thread_info(void) | |||
| 89 | TIF_NEED_RESCHED */ | 89 | TIF_NEED_RESCHED */ |
| 90 | #define TIF_MEMDIE 4 | 90 | #define TIF_MEMDIE 4 |
| 91 | #define TIF_RESTORE_SIGMASK 5 /* restore signal mask in do_signal() */ | 91 | #define TIF_RESTORE_SIGMASK 5 /* restore signal mask in do_signal() */ |
| 92 | #define TIF_NOTIFY_RESUME 6 /* callback before returning to user */ | ||
| 92 | #define TIF_FREEZE 16 /* is freezing for suspend */ | 93 | #define TIF_FREEZE 16 /* is freezing for suspend */ |
| 93 | 94 | ||
| 94 | /* as above, but as bit values */ | 95 | /* as above, but as bit values */ |
| @@ -97,6 +98,7 @@ static inline struct thread_info *current_thread_info(void) | |||
| 97 | #define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) | 98 | #define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) |
| 98 | #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) | 99 | #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) |
| 99 | #define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK) | 100 | #define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK) |
| 101 | #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) | ||
| 100 | #define _TIF_FREEZE (1<<TIF_FREEZE) | 102 | #define _TIF_FREEZE (1<<TIF_FREEZE) |
| 101 | 103 | ||
| 102 | #define _TIF_WORK_MASK 0x0000FFFE /* work to do on interrupt/exception return */ | 104 | #define _TIF_WORK_MASK 0x0000FFFE /* work to do on interrupt/exception return */ |
diff --git a/arch/h8300/kernel/signal.c b/arch/h8300/kernel/signal.c index cf3472f7389b..56b3ab7dbbb0 100644 --- a/arch/h8300/kernel/signal.c +++ b/arch/h8300/kernel/signal.c | |||
| @@ -552,4 +552,9 @@ asmlinkage void do_notify_resume(struct pt_regs *regs, u32 thread_info_flags) | |||
| 552 | { | 552 | { |
| 553 | if (thread_info_flags & (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK)) | 553 | if (thread_info_flags & (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK)) |
| 554 | do_signal(regs, NULL); | 554 | do_signal(regs, NULL); |
| 555 | |||
| 556 | if (thread_info_flags & _TIF_NOTIFY_RESUME) { | ||
| 557 | clear_thread_flag(TIF_NOTIFY_RESUME); | ||
| 558 | tracehook_notify_resume(regs); | ||
| 559 | } | ||
| 555 | } | 560 | } |
diff --git a/arch/m32r/include/asm/thread_info.h b/arch/m32r/include/asm/thread_info.h index 07bb5bd00e2a..71578151a403 100644 --- a/arch/m32r/include/asm/thread_info.h +++ b/arch/m32r/include/asm/thread_info.h | |||
| @@ -149,6 +149,7 @@ static inline unsigned int get_thread_fault_code(void) | |||
| 149 | #define TIF_NEED_RESCHED 2 /* rescheduling necessary */ | 149 | #define TIF_NEED_RESCHED 2 /* rescheduling necessary */ |
| 150 | #define TIF_SINGLESTEP 3 /* restore singlestep on return to user mode */ | 150 | #define TIF_SINGLESTEP 3 /* restore singlestep on return to user mode */ |
| 151 | #define TIF_IRET 4 /* return with iret */ | 151 | #define TIF_IRET 4 /* return with iret */ |
| 152 | #define TIF_NOTIFY_RESUME 5 /* callback before returning to user */ | ||
| 152 | #define TIF_RESTORE_SIGMASK 8 /* restore signal mask in do_signal() */ | 153 | #define TIF_RESTORE_SIGMASK 8 /* restore signal mask in do_signal() */ |
| 153 | #define TIF_USEDFPU 16 /* FPU was used by this task this quantum (SMP) */ | 154 | #define TIF_USEDFPU 16 /* FPU was used by this task this quantum (SMP) */ |
| 154 | #define TIF_POLLING_NRFLAG 17 /* true if poll_idle() is polling TIF_NEED_RESCHED */ | 155 | #define TIF_POLLING_NRFLAG 17 /* true if poll_idle() is polling TIF_NEED_RESCHED */ |
| @@ -160,6 +161,7 @@ static inline unsigned int get_thread_fault_code(void) | |||
| 160 | #define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) | 161 | #define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) |
| 161 | #define _TIF_SINGLESTEP (1<<TIF_SINGLESTEP) | 162 | #define _TIF_SINGLESTEP (1<<TIF_SINGLESTEP) |
| 162 | #define _TIF_IRET (1<<TIF_IRET) | 163 | #define _TIF_IRET (1<<TIF_IRET) |
| 164 | #define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME) | ||
| 163 | #define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK) | 165 | #define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK) |
| 164 | #define _TIF_USEDFPU (1<<TIF_USEDFPU) | 166 | #define _TIF_USEDFPU (1<<TIF_USEDFPU) |
| 165 | #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) | 167 | #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) |
diff --git a/arch/m32r/kernel/signal.c b/arch/m32r/kernel/signal.c index 18124542a6eb..3220258be188 100644 --- a/arch/m32r/kernel/signal.c +++ b/arch/m32r/kernel/signal.c | |||
| @@ -408,5 +408,10 @@ void do_notify_resume(struct pt_regs *regs, sigset_t *oldset, | |||
| 408 | if (thread_info_flags & _TIF_SIGPENDING) | 408 | if (thread_info_flags & _TIF_SIGPENDING) |
| 409 | do_signal(regs,oldset); | 409 | do_signal(regs,oldset); |
| 410 | 410 | ||
| 411 | if (thread_info_flags & _TIF_NOTIFY_RESUME) { | ||
| 412 | clear_thread_flag(TIF_NOTIFY_RESUME); | ||
| 413 | tracehook_notify_resume(regs); | ||
| 414 | } | ||
| 415 | |||
| 411 | clear_thread_flag(TIF_IRET); | 416 | clear_thread_flag(TIF_IRET); |
| 412 | } | 417 | } |
diff --git a/arch/mips/include/asm/thread_info.h b/arch/mips/include/asm/thread_info.h index f9df720d2e40..01cc1630b66c 100644 --- a/arch/mips/include/asm/thread_info.h +++ b/arch/mips/include/asm/thread_info.h | |||
| @@ -115,6 +115,7 @@ register struct thread_info *__current_thread_info __asm__("$28"); | |||
| 115 | #define TIF_NEED_RESCHED 2 /* rescheduling necessary */ | 115 | #define TIF_NEED_RESCHED 2 /* rescheduling necessary */ |
| 116 | #define TIF_SYSCALL_AUDIT 3 /* syscall auditing active */ | 116 | #define TIF_SYSCALL_AUDIT 3 /* syscall auditing active */ |
| 117 | #define TIF_SECCOMP 4 /* secure computing */ | 117 | #define TIF_SECCOMP 4 /* secure computing */ |
| 118 | #define TIF_NOTIFY_RESUME 5 /* callback before returning to user */ | ||
| 118 | #define TIF_RESTORE_SIGMASK 9 /* restore signal mask in do_signal() */ | 119 | #define TIF_RESTORE_SIGMASK 9 /* restore signal mask in do_signal() */ |
| 119 | #define TIF_USEDFPU 16 /* FPU was used by this task this quantum (SMP) */ | 120 | #define TIF_USEDFPU 16 /* FPU was used by this task this quantum (SMP) */ |
| 120 | #define TIF_POLLING_NRFLAG 17 /* true if poll_idle() is polling TIF_NEED_RESCHED */ | 121 | #define TIF_POLLING_NRFLAG 17 /* true if poll_idle() is polling TIF_NEED_RESCHED */ |
| @@ -139,6 +140,7 @@ register struct thread_info *__current_thread_info __asm__("$28"); | |||
| 139 | #define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) | 140 | #define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) |
| 140 | #define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT) | 141 | #define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT) |
| 141 | #define _TIF_SECCOMP (1<<TIF_SECCOMP) | 142 | #define _TIF_SECCOMP (1<<TIF_SECCOMP) |
| 143 | #define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME) | ||
| 142 | #define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK) | 144 | #define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK) |
| 143 | #define _TIF_USEDFPU (1<<TIF_USEDFPU) | 145 | #define _TIF_USEDFPU (1<<TIF_USEDFPU) |
| 144 | #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) | 146 | #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) |
diff --git a/arch/mips/kernel/signal.c b/arch/mips/kernel/signal.c index 830c5ef9932b..a3d1015471de 100644 --- a/arch/mips/kernel/signal.c +++ b/arch/mips/kernel/signal.c | |||
| @@ -700,4 +700,9 @@ asmlinkage void do_notify_resume(struct pt_regs *regs, void *unused, | |||
| 700 | /* deal with pending signal delivery */ | 700 | /* deal with pending signal delivery */ |
| 701 | if (thread_info_flags & (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK)) | 701 | if (thread_info_flags & (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK)) |
| 702 | do_signal(regs); | 702 | do_signal(regs); |
| 703 | |||
| 704 | if (thread_info_flags & _TIF_NOTIFY_RESUME) { | ||
| 705 | clear_thread_flag(TIF_NOTIFY_RESUME); | ||
| 706 | tracehook_notify_resume(regs); | ||
| 707 | } | ||
| 703 | } | 708 | } |
diff --git a/arch/parisc/include/asm/thread_info.h b/arch/parisc/include/asm/thread_info.h index 4ce0edfbe969..ac775a76bff7 100644 --- a/arch/parisc/include/asm/thread_info.h +++ b/arch/parisc/include/asm/thread_info.h | |||
| @@ -59,6 +59,7 @@ struct thread_info { | |||
| 59 | #define TIF_MEMDIE 5 | 59 | #define TIF_MEMDIE 5 |
| 60 | #define TIF_RESTORE_SIGMASK 6 /* restore saved signal mask */ | 60 | #define TIF_RESTORE_SIGMASK 6 /* restore saved signal mask */ |
| 61 | #define TIF_FREEZE 7 /* is freezing for suspend */ | 61 | #define TIF_FREEZE 7 /* is freezing for suspend */ |
| 62 | #define TIF_NOTIFY_RESUME 8 /* callback before returning to user */ | ||
| 62 | 63 | ||
| 63 | #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) | 64 | #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) |
| 64 | #define _TIF_SIGPENDING (1 << TIF_SIGPENDING) | 65 | #define _TIF_SIGPENDING (1 << TIF_SIGPENDING) |
| @@ -67,8 +68,9 @@ struct thread_info { | |||
| 67 | #define _TIF_32BIT (1 << TIF_32BIT) | 68 | #define _TIF_32BIT (1 << TIF_32BIT) |
| 68 | #define _TIF_RESTORE_SIGMASK (1 << TIF_RESTORE_SIGMASK) | 69 | #define _TIF_RESTORE_SIGMASK (1 << TIF_RESTORE_SIGMASK) |
| 69 | #define _TIF_FREEZE (1 << TIF_FREEZE) | 70 | #define _TIF_FREEZE (1 << TIF_FREEZE) |
| 71 | #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) | ||
| 70 | 72 | ||
| 71 | #define _TIF_USER_WORK_MASK (_TIF_SIGPENDING | \ | 73 | #define _TIF_USER_WORK_MASK (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | \ |
| 72 | _TIF_NEED_RESCHED | _TIF_RESTORE_SIGMASK) | 74 | _TIF_NEED_RESCHED | _TIF_RESTORE_SIGMASK) |
| 73 | 75 | ||
| 74 | #endif /* __KERNEL__ */ | 76 | #endif /* __KERNEL__ */ |
diff --git a/arch/parisc/kernel/entry.S b/arch/parisc/kernel/entry.S index e552e547cb93..8c4712b74dc1 100644 --- a/arch/parisc/kernel/entry.S +++ b/arch/parisc/kernel/entry.S | |||
| @@ -948,7 +948,7 @@ intr_check_sig: | |||
| 948 | /* As above */ | 948 | /* As above */ |
| 949 | mfctl %cr30,%r1 | 949 | mfctl %cr30,%r1 |
| 950 | LDREG TI_FLAGS(%r1),%r19 | 950 | LDREG TI_FLAGS(%r1),%r19 |
| 951 | ldi (_TIF_SIGPENDING|_TIF_RESTORE_SIGMASK), %r20 | 951 | ldi (_TIF_SIGPENDING|_TIF_RESTORE_SIGMASK|_TIF_NOTIFY_RESUME), %r20 |
| 952 | and,COND(<>) %r19, %r20, %r0 | 952 | and,COND(<>) %r19, %r20, %r0 |
| 953 | b,n intr_restore /* skip past if we've nothing to do */ | 953 | b,n intr_restore /* skip past if we've nothing to do */ |
| 954 | 954 | ||
diff --git a/arch/parisc/kernel/signal.c b/arch/parisc/kernel/signal.c index f82544225e8e..b3bfc4326703 100644 --- a/arch/parisc/kernel/signal.c +++ b/arch/parisc/kernel/signal.c | |||
| @@ -645,4 +645,9 @@ void do_notify_resume(struct pt_regs *regs, long in_syscall) | |||
| 645 | if (test_thread_flag(TIF_SIGPENDING) || | 645 | if (test_thread_flag(TIF_SIGPENDING) || |
| 646 | test_thread_flag(TIF_RESTORE_SIGMASK)) | 646 | test_thread_flag(TIF_RESTORE_SIGMASK)) |
| 647 | do_signal(regs, in_syscall); | 647 | do_signal(regs, in_syscall); |
| 648 | |||
| 649 | if (test_thread_flag(TIF_NOTIFY_RESUME)) { | ||
| 650 | clear_thread_flag(TIF_NOTIFY_RESUME); | ||
| 651 | tracehook_notify_resume(regs); | ||
| 652 | } | ||
| 648 | } | 653 | } |
