aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/alpha/include/asm/thread_info.h3
-rw-r--r--arch/alpha/kernel/entry.S13
-rw-r--r--arch/alpha/kernel/ptrace.c32
-rw-r--r--arch/arm/include/asm/thread_info.h2
-rw-r--r--arch/arm/kernel/signal.c1
-rw-r--r--arch/avr32/include/asm/thread_info.h18
-rw-r--r--arch/avr32/kernel/signal.c1
-rw-r--r--arch/blackfin/include/asm/thread_info.h4
-rw-r--r--arch/blackfin/kernel/signal.c1
-rw-r--r--arch/c6x/Kconfig1
-rw-r--r--arch/c6x/include/asm/processor.h2
-rw-r--r--arch/c6x/include/asm/syscalls.h5
-rw-r--r--arch/c6x/include/asm/thread_info.h1
-rw-r--r--arch/c6x/include/asm/unistd.h3
-rw-r--r--arch/c6x/kernel/asm-offsets.c1
-rw-r--r--arch/c6x/kernel/entry.S56
-rw-r--r--arch/c6x/kernel/process.c72
-rw-r--r--arch/cris/include/asm/thread_info.h3
-rw-r--r--arch/frv/Kconfig1
-rw-r--r--arch/frv/include/asm/processor.h9
-rw-r--r--arch/frv/include/asm/ptrace.h1
-rw-r--r--arch/frv/include/asm/thread_info.h3
-rw-r--r--arch/frv/include/asm/unistd.h2
-rw-r--r--arch/frv/kernel/Makefile4
-rw-r--r--arch/frv/kernel/entry.S13
-rw-r--r--arch/frv/kernel/frv_ksyms.c1
-rw-r--r--arch/frv/kernel/kernel_execve.S33
-rw-r--r--arch/frv/kernel/kernel_thread.S77
-rw-r--r--arch/frv/kernel/process.c66
-rw-r--r--arch/frv/kernel/signal.c9
-rw-r--r--arch/h8300/include/asm/thread_info.h7
-rw-r--r--arch/h8300/kernel/signal.c1
-rw-r--r--arch/hexagon/include/asm/thread_info.h5
-rw-r--r--arch/hexagon/kernel/signal.c1
-rw-r--r--arch/ia64/include/asm/thread_info.h2
-rw-r--r--arch/ia64/kernel/signal.c8
-rw-r--r--arch/m32r/include/asm/thread_info.h9
-rw-r--r--arch/m32r/kernel/signal.c3
-rw-r--r--arch/m68k/Kconfig1
-rw-r--r--arch/m68k/include/asm/processor.h25
-rw-r--r--arch/m68k/include/asm/ptrace.h2
-rw-r--r--arch/m68k/include/asm/unistd.h2
-rw-r--r--arch/m68k/kernel/entry.S16
-rw-r--r--arch/m68k/kernel/process.c104
-rw-r--r--arch/m68k/kernel/sys_m68k.c17
-rw-r--r--arch/microblaze/include/asm/thread_info.h3
-rw-r--r--arch/microblaze/kernel/signal.c7
-rw-r--r--arch/mips/include/asm/thread_info.h3
-rw-r--r--arch/mn10300/Kconfig1
-rw-r--r--arch/mn10300/include/asm/frame.inc2
-rw-r--r--arch/mn10300/include/asm/processor.h18
-rw-r--r--arch/mn10300/include/asm/ptrace.h1
-rw-r--r--arch/mn10300/include/asm/thread_info.h3
-rw-r--r--arch/mn10300/include/asm/unistd.h2
-rw-r--r--arch/mn10300/kernel/Makefile4
-rw-r--r--arch/mn10300/kernel/entry.S18
-rw-r--r--arch/mn10300/kernel/internal.h6
-rw-r--r--arch/mn10300/kernel/kernel_execve.S37
-rw-r--r--arch/mn10300/kernel/kthread.S31
-rw-r--r--arch/mn10300/kernel/process.c91
-rw-r--r--arch/mn10300/kernel/signal.c13
-rw-r--r--arch/openrisc/include/asm/thread_info.h3
-rw-r--r--arch/parisc/hpux/gate.S2
-rw-r--r--arch/parisc/include/asm/thread_info.h5
-rw-r--r--arch/parisc/kernel/signal.c45
-rw-r--r--arch/parisc/kernel/syscall.S9
-rw-r--r--arch/powerpc/Kconfig1
-rw-r--r--arch/powerpc/include/asm/processor.h3
-rw-r--r--arch/powerpc/include/asm/ptrace.h2
-rw-r--r--arch/powerpc/include/asm/syscalls.h3
-rw-r--r--arch/powerpc/include/asm/thread_info.h2
-rw-r--r--arch/powerpc/include/asm/unistd.h2
-rw-r--r--arch/powerpc/kernel/entry_32.S16
-rw-r--r--arch/powerpc/kernel/entry_64.S16
-rw-r--r--arch/powerpc/kernel/misc.S7
-rw-r--r--arch/powerpc/kernel/misc_32.S33
-rw-r--r--arch/powerpc/kernel/misc_64.S34
-rw-r--r--arch/powerpc/kernel/ppc_ksyms.c1
-rw-r--r--arch/powerpc/kernel/process.c59
-rw-r--r--arch/powerpc/kernel/signal_32.c1
-rw-r--r--arch/powerpc/kernel/sys_ppc32.c22
-rw-r--r--arch/s390/include/asm/thread_info.h4
-rw-r--r--arch/score/include/asm/thread_info.h4
-rw-r--r--arch/score/kernel/signal.c1
-rw-r--r--arch/sh/include/asm/thread_info.h3
-rw-r--r--arch/sh/kernel/signal_32.c1
-rw-r--r--arch/sh/kernel/signal_64.c1
-rw-r--r--arch/sparc/include/asm/thread_info_32.h3
-rw-r--r--arch/sparc/include/asm/thread_info_64.h3
-rw-r--r--arch/tile/kernel/compat_signal.c9
-rw-r--r--arch/tile/kernel/signal.c12
-rw-r--r--arch/um/include/asm/thread_info.h3
-rw-r--r--arch/unicore32/include/asm/thread_info.h4
-rw-r--r--arch/unicore32/kernel/entry.S2
-rw-r--r--arch/unicore32/kernel/signal.c1
-rw-r--r--arch/x86/kernel/entry_32.S17
-rw-r--r--arch/xtensa/include/asm/thread_info.h5
-rw-r--r--arch/xtensa/kernel/signal.c4
98 files changed, 343 insertions, 881 deletions
diff --git a/arch/alpha/include/asm/thread_info.h b/arch/alpha/include/asm/thread_info.h
index 28335bd40e40..4554ecbff7c6 100644
--- a/arch/alpha/include/asm/thread_info.h
+++ b/arch/alpha/include/asm/thread_info.h
@@ -84,7 +84,6 @@ register struct thread_info *__current_thread_info __asm__("$8");
84#define _TIF_SIGPENDING (1<<TIF_SIGPENDING) 84#define _TIF_SIGPENDING (1<<TIF_SIGPENDING)
85#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) 85#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED)
86#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) 86#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG)
87#define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK)
88#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME) 87#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME)
89 88
90/* Work to do on interrupt/exception return. */ 89/* Work to do on interrupt/exception return. */
@@ -117,5 +116,7 @@ register struct thread_info *__current_thread_info __asm__("$8");
117 (int __user *)(value)); \ 116 (int __user *)(value)); \
118 }) 117 })
119 118
119#define tsk_is_polling(t) test_tsk_thread_flag(t, TIF_POLLING_NRFLAG)
120
120#endif /* __KERNEL__ */ 121#endif /* __KERNEL__ */
121#endif /* _ALPHA_THREAD_INFO_H */ 122#endif /* _ALPHA_THREAD_INFO_H */
diff --git a/arch/alpha/kernel/entry.S b/arch/alpha/kernel/entry.S
index 7e43e1156d10..2a359c9ee3cd 100644
--- a/arch/alpha/kernel/entry.S
+++ b/arch/alpha/kernel/entry.S
@@ -418,11 +418,10 @@ $work_notifysig:
418strace: 418strace:
419 /* set up signal stack, call syscall_trace */ 419 /* set up signal stack, call syscall_trace */
420 bsr $1, do_switch_stack 420 bsr $1, do_switch_stack
421 jsr $26, syscall_trace 421 jsr $26, syscall_trace_enter /* returns the syscall number */
422 bsr $1, undo_switch_stack 422 bsr $1, undo_switch_stack
423 423
424 /* get the system call number and the arguments back.. */ 424 /* get the arguments back.. */
425 ldq $0, 0($sp)
426 ldq $16, SP_OFF+24($sp) 425 ldq $16, SP_OFF+24($sp)
427 ldq $17, SP_OFF+32($sp) 426 ldq $17, SP_OFF+32($sp)
428 ldq $18, SP_OFF+40($sp) 427 ldq $18, SP_OFF+40($sp)
@@ -449,7 +448,7 @@ $strace_success:
449 stq $0, 0($sp) /* save return value */ 448 stq $0, 0($sp) /* save return value */
450 449
451 bsr $1, do_switch_stack 450 bsr $1, do_switch_stack
452 jsr $26, syscall_trace 451 jsr $26, syscall_trace_leave
453 bsr $1, undo_switch_stack 452 bsr $1, undo_switch_stack
454 br $31, ret_from_sys_call 453 br $31, ret_from_sys_call
455 454
@@ -467,7 +466,7 @@ $strace_error:
467 bsr $1, do_switch_stack 466 bsr $1, do_switch_stack
468 mov $19, $9 /* save old syscall number */ 467 mov $19, $9 /* save old syscall number */
469 mov $20, $10 /* save old a3 */ 468 mov $20, $10 /* save old a3 */
470 jsr $26, syscall_trace 469 jsr $26, syscall_trace_leave
471 mov $9, $19 470 mov $9, $19
472 mov $10, $20 471 mov $10, $20
473 bsr $1, undo_switch_stack 472 bsr $1, undo_switch_stack
@@ -698,7 +697,7 @@ sys_sigreturn:
698 lda $sp, -SWITCH_STACK_SIZE($sp) 697 lda $sp, -SWITCH_STACK_SIZE($sp)
699 jsr $26, do_sigreturn 698 jsr $26, do_sigreturn
700 bne $9, 1f 699 bne $9, 1f
701 jsr $26, syscall_trace 700 jsr $26, syscall_trace_leave
7021: br $1, undo_switch_stack 7011: br $1, undo_switch_stack
703 br ret_from_sys_call 702 br ret_from_sys_call
704.end sys_sigreturn 703.end sys_sigreturn
@@ -715,7 +714,7 @@ sys_rt_sigreturn:
715 lda $sp, -SWITCH_STACK_SIZE($sp) 714 lda $sp, -SWITCH_STACK_SIZE($sp)
716 jsr $26, do_rt_sigreturn 715 jsr $26, do_rt_sigreturn
717 bne $9, 1f 716 bne $9, 1f
718 jsr $26, syscall_trace 717 jsr $26, syscall_trace_leave
7191: br $1, undo_switch_stack 7181: br $1, undo_switch_stack
720 br ret_from_sys_call 719 br ret_from_sys_call
721.end sys_rt_sigreturn 720.end sys_rt_sigreturn
diff --git a/arch/alpha/kernel/ptrace.c b/arch/alpha/kernel/ptrace.c
index 54616f496aed..2a4a80ff4a20 100644
--- a/arch/alpha/kernel/ptrace.c
+++ b/arch/alpha/kernel/ptrace.c
@@ -13,6 +13,7 @@
13#include <linux/user.h> 13#include <linux/user.h>
14#include <linux/security.h> 14#include <linux/security.h>
15#include <linux/signal.h> 15#include <linux/signal.h>
16#include <linux/tracehook.h>
16 17
17#include <asm/uaccess.h> 18#include <asm/uaccess.h>
18#include <asm/pgtable.h> 19#include <asm/pgtable.h>
@@ -312,25 +313,18 @@ long arch_ptrace(struct task_struct *child, long request,
312 return ret; 313 return ret;
313} 314}
314 315
316asmlinkage unsigned long syscall_trace_enter(void)
317{
318 unsigned long ret = 0;
319 if (test_thread_flag(TIF_SYSCALL_TRACE) &&
320 tracehook_report_syscall_entry(current_pt_regs()))
321 ret = -1UL;
322 return ret ?: current_pt_regs()->r0;
323}
324
315asmlinkage void 325asmlinkage void
316syscall_trace(void) 326syscall_trace_leave(void)
317{ 327{
318 if (!test_thread_flag(TIF_SYSCALL_TRACE)) 328 if (test_thread_flag(TIF_SYSCALL_TRACE))
319 return; 329 tracehook_report_syscall_exit(current_pt_regs(), 0);
320 if (!(current->ptrace & PT_PTRACED))
321 return;
322 /* The 0x80 provides a way for the tracing parent to distinguish
323 between a syscall stop and SIGTRAP delivery */
324 ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD)
325 ? 0x80 : 0));
326
327 /*
328 * This isn't the same as continuing with a signal, but it will do
329 * for normal use. strace only continues with a signal if the
330 * stopping signal is not SIGTRAP. -brl
331 */
332 if (current->exit_code) {
333 send_sig(current->exit_code, current, 1);
334 current->exit_code = 0;
335 }
336} 330}
diff --git a/arch/arm/include/asm/thread_info.h b/arch/arm/include/asm/thread_info.h
index f71cdab18b87..8477b4c1d39f 100644
--- a/arch/arm/include/asm/thread_info.h
+++ b/arch/arm/include/asm/thread_info.h
@@ -151,7 +151,6 @@ extern int vfp_restore_user_hwstate(struct user_vfp __user *,
151#define TIF_SYSCALL_TRACE 8 151#define TIF_SYSCALL_TRACE 8
152#define TIF_SYSCALL_AUDIT 9 152#define TIF_SYSCALL_AUDIT 9
153#define TIF_SYSCALL_TRACEPOINT 10 153#define TIF_SYSCALL_TRACEPOINT 10
154#define TIF_POLLING_NRFLAG 16
155#define TIF_USING_IWMMXT 17 154#define TIF_USING_IWMMXT 17
156#define TIF_MEMDIE 18 /* is terminating due to OOM killer */ 155#define TIF_MEMDIE 18 /* is terminating due to OOM killer */
157#define TIF_RESTORE_SIGMASK 20 156#define TIF_RESTORE_SIGMASK 20
@@ -164,7 +163,6 @@ extern int vfp_restore_user_hwstate(struct user_vfp __user *,
164#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) 163#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE)
165#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT) 164#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT)
166#define _TIF_SYSCALL_TRACEPOINT (1 << TIF_SYSCALL_TRACEPOINT) 165#define _TIF_SYSCALL_TRACEPOINT (1 << TIF_SYSCALL_TRACEPOINT)
167#define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG)
168#define _TIF_USING_IWMMXT (1 << TIF_USING_IWMMXT) 166#define _TIF_USING_IWMMXT (1 << TIF_USING_IWMMXT)
169#define _TIF_SECCOMP (1 << TIF_SECCOMP) 167#define _TIF_SECCOMP (1 << TIF_SECCOMP)
170 168
diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c
index f27789e4e38a..56f72d257ebd 100644
--- a/arch/arm/kernel/signal.c
+++ b/arch/arm/kernel/signal.c
@@ -10,7 +10,6 @@
10#include <linux/errno.h> 10#include <linux/errno.h>
11#include <linux/signal.h> 11#include <linux/signal.h>
12#include <linux/personality.h> 12#include <linux/personality.h>
13#include <linux/freezer.h>
14#include <linux/uaccess.h> 13#include <linux/uaccess.h>
15#include <linux/tracehook.h> 14#include <linux/tracehook.h>
16 15
diff --git a/arch/avr32/include/asm/thread_info.h b/arch/avr32/include/asm/thread_info.h
index e5deda4691db..6dc62e1f94c7 100644
--- a/arch/avr32/include/asm/thread_info.h
+++ b/arch/avr32/include/asm/thread_info.h
@@ -77,8 +77,6 @@ static inline struct thread_info *current_thread_info(void)
77#define TIF_SYSCALL_TRACE 0 /* syscall trace active */ 77#define TIF_SYSCALL_TRACE 0 /* syscall trace active */
78#define TIF_SIGPENDING 1 /* signal pending */ 78#define TIF_SIGPENDING 1 /* signal pending */
79#define TIF_NEED_RESCHED 2 /* rescheduling necessary */ 79#define TIF_NEED_RESCHED 2 /* rescheduling necessary */
80#define TIF_POLLING_NRFLAG 3 /* true if poll_idle() is polling
81 TIF_NEED_RESCHED */
82#define TIF_BREAKPOINT 4 /* enter monitor mode on return */ 80#define TIF_BREAKPOINT 4 /* enter monitor mode on return */
83#define TIF_SINGLE_STEP 5 /* single step in progress */ 81#define TIF_SINGLE_STEP 5 /* single step in progress */
84#define TIF_MEMDIE 6 /* is terminating due to OOM killer */ 82#define TIF_MEMDIE 6 /* is terminating due to OOM killer */
@@ -91,10 +89,9 @@ static inline struct thread_info *current_thread_info(void)
91#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) 89#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE)
92#define _TIF_SIGPENDING (1 << TIF_SIGPENDING) 90#define _TIF_SIGPENDING (1 << TIF_SIGPENDING)
93#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) 91#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED)
94#define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG) 92#define _TIF_BREAKPOINT (1 << TIF_BREAKPOINT)
95#define _TIF_SINGLE_STEP (1 << TIF_SINGLE_STEP) 93#define _TIF_SINGLE_STEP (1 << TIF_SINGLE_STEP)
96#define _TIF_MEMDIE (1 << TIF_MEMDIE) 94#define _TIF_MEMDIE (1 << TIF_MEMDIE)
97#define _TIF_RESTORE_SIGMASK (1 << TIF_RESTORE_SIGMASK)
98#define _TIF_CPU_GOING_TO_SLEEP (1 << TIF_CPU_GOING_TO_SLEEP) 95#define _TIF_CPU_GOING_TO_SLEEP (1 << TIF_CPU_GOING_TO_SLEEP)
99#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) 96#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME)
100 97
@@ -102,17 +99,14 @@ static inline struct thread_info *current_thread_info(void)
102 99
103/* work to do on interrupt/exception return */ 100/* work to do on interrupt/exception return */
104#define _TIF_WORK_MASK \ 101#define _TIF_WORK_MASK \
105 ((1 << TIF_SIGPENDING) \ 102 (_TIF_SIGPENDING \
106 | _TIF_NOTIFY_RESUME \ 103 | _TIF_NOTIFY_RESUME \
107 | (1 << TIF_NEED_RESCHED) \ 104 | _TIF_NEED_RESCHED \
108 | (1 << TIF_POLLING_NRFLAG) \ 105 | _TIF_BREAKPOINT)
109 | (1 << TIF_BREAKPOINT) \
110 | (1 << TIF_RESTORE_SIGMASK))
111 106
112/* work to do on any return to userspace */ 107/* work to do on any return to userspace */
113#define _TIF_ALLWORK_MASK (_TIF_WORK_MASK | (1 << TIF_SYSCALL_TRACE) | \ 108#define _TIF_ALLWORK_MASK (_TIF_WORK_MASK | _TIF_SYSCALL_TRACE)
114 _TIF_NOTIFY_RESUME)
115/* work to do on return from debug mode */ 109/* work to do on return from debug mode */
116#define _TIF_DBGWORK_MASK (_TIF_WORK_MASK & ~(1 << TIF_BREAKPOINT)) 110#define _TIF_DBGWORK_MASK (_TIF_WORK_MASK & ~_TIF_BREAKPOINT)
117 111
118#endif /* __ASM_AVR32_THREAD_INFO_H */ 112#endif /* __ASM_AVR32_THREAD_INFO_H */
diff --git a/arch/avr32/kernel/signal.c b/arch/avr32/kernel/signal.c
index d552a854dacc..5e01c3a40ced 100644
--- a/arch/avr32/kernel/signal.c
+++ b/arch/avr32/kernel/signal.c
@@ -15,7 +15,6 @@
15#include <linux/errno.h> 15#include <linux/errno.h>
16#include <linux/ptrace.h> 16#include <linux/ptrace.h>
17#include <linux/unistd.h> 17#include <linux/unistd.h>
18#include <linux/freezer.h>
19#include <linux/tracehook.h> 18#include <linux/tracehook.h>
20 19
21#include <asm/uaccess.h> 20#include <asm/uaccess.h>
diff --git a/arch/blackfin/include/asm/thread_info.h b/arch/blackfin/include/asm/thread_info.h
index 53ad10005ae3..3894005337ba 100644
--- a/arch/blackfin/include/asm/thread_info.h
+++ b/arch/blackfin/include/asm/thread_info.h
@@ -96,8 +96,6 @@ static inline struct thread_info *current_thread_info(void)
96#define TIF_SYSCALL_TRACE 0 /* syscall trace active */ 96#define TIF_SYSCALL_TRACE 0 /* syscall trace active */
97#define TIF_SIGPENDING 1 /* signal pending */ 97#define TIF_SIGPENDING 1 /* signal pending */
98#define TIF_NEED_RESCHED 2 /* rescheduling necessary */ 98#define TIF_NEED_RESCHED 2 /* rescheduling necessary */
99#define TIF_POLLING_NRFLAG 3 /* true if poll_idle() is polling
100 TIF_NEED_RESCHED */
101#define TIF_MEMDIE 4 /* is terminating due to OOM killer */ 99#define TIF_MEMDIE 4 /* is terminating due to OOM killer */
102#define TIF_RESTORE_SIGMASK 5 /* restore signal mask in do_signal() */ 100#define TIF_RESTORE_SIGMASK 5 /* restore signal mask in do_signal() */
103#define TIF_IRQ_SYNC 7 /* sync pipeline stage */ 101#define TIF_IRQ_SYNC 7 /* sync pipeline stage */
@@ -108,8 +106,6 @@ static inline struct thread_info *current_thread_info(void)
108#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) 106#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)
109#define _TIF_SIGPENDING (1<<TIF_SIGPENDING) 107#define _TIF_SIGPENDING (1<<TIF_SIGPENDING)
110#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) 108#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED)
111#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG)
112#define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK)
113#define _TIF_IRQ_SYNC (1<<TIF_IRQ_SYNC) 109#define _TIF_IRQ_SYNC (1<<TIF_IRQ_SYNC)
114#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME) 110#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME)
115#define _TIF_SINGLESTEP (1<<TIF_SINGLESTEP) 111#define _TIF_SINGLESTEP (1<<TIF_SINGLESTEP)
diff --git a/arch/blackfin/kernel/signal.c b/arch/blackfin/kernel/signal.c
index 6682b73a8523..6ed20a1a4af9 100644
--- a/arch/blackfin/kernel/signal.c
+++ b/arch/blackfin/kernel/signal.c
@@ -10,7 +10,6 @@
10#include <linux/tty.h> 10#include <linux/tty.h>
11#include <linux/personality.h> 11#include <linux/personality.h>
12#include <linux/binfmts.h> 12#include <linux/binfmts.h>
13#include <linux/freezer.h>
14#include <linux/uaccess.h> 13#include <linux/uaccess.h>
15#include <linux/tracehook.h> 14#include <linux/tracehook.h>
16 15
diff --git a/arch/c6x/Kconfig b/arch/c6x/Kconfig
index 983c859e40b7..45268b50c0c8 100644
--- a/arch/c6x/Kconfig
+++ b/arch/c6x/Kconfig
@@ -17,6 +17,7 @@ config C6X
17 select OF 17 select OF
18 select OF_EARLY_FLATTREE 18 select OF_EARLY_FLATTREE
19 select GENERIC_CLOCKEVENTS 19 select GENERIC_CLOCKEVENTS
20 select GENERIC_KERNEL_THREAD
20 21
21config MMU 22config MMU
22 def_bool n 23 def_bool n
diff --git a/arch/c6x/include/asm/processor.h b/arch/c6x/include/asm/processor.h
index c50af7ef1c96..b9eb3da7f278 100644
--- a/arch/c6x/include/asm/processor.h
+++ b/arch/c6x/include/asm/processor.h
@@ -92,8 +92,6 @@ static inline void release_thread(struct task_struct *dead_task)
92{ 92{
93} 93}
94 94
95extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
96
97#define copy_segments(tsk, mm) do { } while (0) 95#define copy_segments(tsk, mm) do { } while (0)
98#define release_segments(mm) do { } while (0) 96#define release_segments(mm) do { } while (0)
99 97
diff --git a/arch/c6x/include/asm/syscalls.h b/arch/c6x/include/asm/syscalls.h
index aed53da703c9..e7b8991dc07c 100644
--- a/arch/c6x/include/asm/syscalls.h
+++ b/arch/c6x/include/asm/syscalls.h
@@ -44,11 +44,6 @@ extern int sys_cache_sync(unsigned long s, unsigned long e);
44struct pt_regs; 44struct pt_regs;
45 45
46extern asmlinkage long sys_c6x_clone(struct pt_regs *regs); 46extern asmlinkage long sys_c6x_clone(struct pt_regs *regs);
47extern asmlinkage long sys_c6x_execve(const char __user *name,
48 const char __user *const __user *argv,
49 const char __user *const __user *envp,
50 struct pt_regs *regs);
51
52 47
53#include <asm-generic/syscalls.h> 48#include <asm-generic/syscalls.h>
54 49
diff --git a/arch/c6x/include/asm/thread_info.h b/arch/c6x/include/asm/thread_info.h
index 1710bcbb8d09..4c8dc562bd90 100644
--- a/arch/c6x/include/asm/thread_info.h
+++ b/arch/c6x/include/asm/thread_info.h
@@ -97,7 +97,6 @@ struct thread_info *current_thread_info(void)
97#define TIF_NEED_RESCHED 3 /* rescheduling necessary */ 97#define TIF_NEED_RESCHED 3 /* rescheduling necessary */
98#define TIF_RESTORE_SIGMASK 4 /* restore signal mask in do_signal() */ 98#define TIF_RESTORE_SIGMASK 4 /* restore signal mask in do_signal() */
99 99
100#define TIF_POLLING_NRFLAG 16 /* true if polling TIF_NEED_RESCHED */
101#define TIF_MEMDIE 17 /* OOM killer killed process */ 100#define TIF_MEMDIE 17 /* OOM killer killed process */
102 101
103#define TIF_WORK_MASK 0x00007FFE /* work on irq/exception return */ 102#define TIF_WORK_MASK 0x00007FFE /* work on irq/exception return */
diff --git a/arch/c6x/include/asm/unistd.h b/arch/c6x/include/asm/unistd.h
index ed2259043eec..4ff747d12dad 100644
--- a/arch/c6x/include/asm/unistd.h
+++ b/arch/c6x/include/asm/unistd.h
@@ -14,6 +14,9 @@
14 * more details. 14 * more details.
15 */ 15 */
16 16
17#define __ARCH_WANT_KERNEL_EXECVE
18#define __ARCH_WANT_SYS_EXECVE
19
17/* Use the standard ABI for syscalls. */ 20/* Use the standard ABI for syscalls. */
18#include <asm-generic/unistd.h> 21#include <asm-generic/unistd.h>
19 22
diff --git a/arch/c6x/kernel/asm-offsets.c b/arch/c6x/kernel/asm-offsets.c
index 759ad6d207b6..60f1e437745d 100644
--- a/arch/c6x/kernel/asm-offsets.c
+++ b/arch/c6x/kernel/asm-offsets.c
@@ -116,7 +116,6 @@ void foo(void)
116 DEFINE(_TIF_NOTIFY_RESUME, (1<<TIF_NOTIFY_RESUME)); 116 DEFINE(_TIF_NOTIFY_RESUME, (1<<TIF_NOTIFY_RESUME));
117 DEFINE(_TIF_SIGPENDING, (1<<TIF_SIGPENDING)); 117 DEFINE(_TIF_SIGPENDING, (1<<TIF_SIGPENDING));
118 DEFINE(_TIF_NEED_RESCHED, (1<<TIF_NEED_RESCHED)); 118 DEFINE(_TIF_NEED_RESCHED, (1<<TIF_NEED_RESCHED));
119 DEFINE(_TIF_POLLING_NRFLAG, (1<<TIF_POLLING_NRFLAG));
120 119
121 DEFINE(_TIF_ALLWORK_MASK, TIF_ALLWORK_MASK); 120 DEFINE(_TIF_ALLWORK_MASK, TIF_ALLWORK_MASK);
122 DEFINE(_TIF_WORK_MASK, TIF_WORK_MASK); 121 DEFINE(_TIF_WORK_MASK, TIF_WORK_MASK);
diff --git a/arch/c6x/kernel/entry.S b/arch/c6x/kernel/entry.S
index 30b37e5f4a61..5449c36018fe 100644
--- a/arch/c6x/kernel/entry.S
+++ b/arch/c6x/kernel/entry.S
@@ -400,6 +400,32 @@ ret_from_fork_2:
400 STW .D2T2 B0,*+SP(REGS_A4+8) 400 STW .D2T2 B0,*+SP(REGS_A4+8)
401ENDPROC(ret_from_fork) 401ENDPROC(ret_from_fork)
402 402
403ENTRY(ret_from_kernel_thread)
404#ifdef CONFIG_C6X_BIG_KERNEL
405 MVKL .S1 schedule_tail,A0
406 MVKH .S1 schedule_tail,A0
407 B .S2X A0
408#else
409 B .S2 schedule_tail
410#endif
411 LDW .D2T2 *+SP(REGS_A0+8),B10 /* get fn */
412 ADDKPC .S2 0f,B3,3
4130:
414 B .S2 B10 /* call fn */
415 LDW .D2T1 *+SP(REGS_A1+8),A4 /* get arg */
416 MVKL .S2 sys_exit,B11
417 MVKH .S2 sys_exit,B11
418 ADDKPC .S2 0f,B3,1
4190:
420 BNOP .S2 B11,5 /* jump to sys_exit */
421ENDPROC(ret_from_kernel_thread)
422
423ENTRY(ret_from_kernel_execve)
424 GET_THREAD_INFO A12
425 BNOP .S2 syscall_exit,4
426 ADD .D2X A4,-8,SP
427ENDPROC(ret_from_kernel_execve)
428
403 ;; 429 ;;
404 ;; These are the interrupt handlers, responsible for calling __do_IRQ() 430 ;; These are the interrupt handlers, responsible for calling __do_IRQ()
405 ;; int6 is used for syscalls (see _system_call entry) 431 ;; int6 is used for syscalls (see _system_call entry)
@@ -593,13 +619,6 @@ ENTRY(sys_sigaltstack)
593 NOP 4 619 NOP 4
594ENDPROC(sys_sigaltstack) 620ENDPROC(sys_sigaltstack)
595 621
596 ;; kernel_execve
597ENTRY(kernel_execve)
598 MVK .S2 __NR_execve,B0
599 SWE
600 BNOP .S2 B3,5
601ENDPROC(kernel_execve)
602
603 ;; 622 ;;
604 ;; Special system calls 623 ;; Special system calls
605 ;; return address is in B3 624 ;; return address is in B3
@@ -628,29 +647,6 @@ ENTRY(sys_rt_sigreturn)
628#endif 647#endif
629ENDPROC(sys_rt_sigreturn) 648ENDPROC(sys_rt_sigreturn)
630 649
631ENTRY(sys_execve)
632 ADDAW .D2 SP,2,B6 ; put regs addr in 4th parameter
633 ; & adjust regs stack addr
634 LDW .D2T2 *+SP(REGS_B4+8),B4
635
636 ;; c6x_execve(char *name, char **argv,
637 ;; char **envp, struct pt_regs *regs)
638#ifdef CONFIG_C6X_BIG_KERNEL
639 || MVKL .S1 sys_c6x_execve,A0
640 MVKH .S1 sys_c6x_execve,A0
641 B .S2X A0
642#else
643 || B .S2 sys_c6x_execve
644#endif
645 STW .D2T2 B3,*SP--[2]
646 ADDKPC .S2 ret_from_c6x_execve,B3,3
647
648ret_from_c6x_execve:
649 LDW .D2T2 *++SP[2],B3
650 NOP 4
651 BNOP .S2 B3,5
652ENDPROC(sys_execve)
653
654ENTRY(sys_pread_c6x) 650ENTRY(sys_pread_c6x)
655 MV .D2X A8,B7 651 MV .D2X A8,B7
656#ifdef CONFIG_C6X_BIG_KERNEL 652#ifdef CONFIG_C6X_BIG_KERNEL
diff --git a/arch/c6x/kernel/process.c b/arch/c6x/kernel/process.c
index 45e924a636a0..2770d9a9a84e 100644
--- a/arch/c6x/kernel/process.c
+++ b/arch/c6x/kernel/process.c
@@ -25,6 +25,7 @@ void (*c6x_restart)(void);
25void (*c6x_halt)(void); 25void (*c6x_halt)(void);
26 26
27extern asmlinkage void ret_from_fork(void); 27extern asmlinkage void ret_from_fork(void);
28extern asmlinkage void ret_from_kernel_thread(void);
28 29
29/* 30/*
30 * power off function, if any 31 * power off function, if any
@@ -103,37 +104,6 @@ void machine_power_off(void)
103 halt_loop(); 104 halt_loop();
104} 105}
105 106
106static void kernel_thread_helper(int dummy, void *arg, int (*fn)(void *))
107{
108 do_exit(fn(arg));
109}
110
111/*
112 * Create a kernel thread
113 */
114int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
115{
116 struct pt_regs regs;
117
118 /*
119 * copy_thread sets a4 to zero (child return from fork)
120 * so we can't just set things up to directly return to
121 * fn.
122 */
123 memset(&regs, 0, sizeof(regs));
124 regs.b4 = (unsigned long) arg;
125 regs.a6 = (unsigned long) fn;
126 regs.pc = (unsigned long) kernel_thread_helper;
127 local_save_flags(regs.csr);
128 regs.csr |= 1;
129 regs.tsr = 5; /* Set GEE and GIE in TSR */
130
131 /* Ok, create the new process.. */
132 return do_fork(flags | CLONE_VM | CLONE_UNTRACED, -1, &regs,
133 0, NULL, NULL);
134}
135EXPORT_SYMBOL(kernel_thread);
136
137void flush_thread(void) 107void flush_thread(void)
138{ 108{
139} 109}
@@ -191,22 +161,24 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
191 161
192 childregs = task_pt_regs(p); 162 childregs = task_pt_regs(p);
193 163
194 *childregs = *regs; 164 if (!regs) {
195 childregs->a4 = 0;
196
197 if (usp == -1)
198 /* case of __kernel_thread: we return to supervisor space */ 165 /* case of __kernel_thread: we return to supervisor space */
166 memset(childregs, 0, sizeof(struct pt_regs));
199 childregs->sp = (unsigned long)(childregs + 1); 167 childregs->sp = (unsigned long)(childregs + 1);
200 else 168 p->thread.pc = (unsigned long) ret_from_kernel_thread;
169 childregs->a0 = usp; /* function */
170 childregs->a1 = ustk_size; /* argument */
171 } else {
201 /* Otherwise use the given stack */ 172 /* Otherwise use the given stack */
173 *childregs = *regs;
202 childregs->sp = usp; 174 childregs->sp = usp;
175 p->thread.pc = (unsigned long) ret_from_fork;
176 }
203 177
204 /* Set usp/ksp */ 178 /* Set usp/ksp */
205 p->thread.usp = childregs->sp; 179 p->thread.usp = childregs->sp;
206 /* switch_to uses stack to save/restore 14 callee-saved regs */
207 thread_saved_ksp(p) = (unsigned long)childregs - 8; 180 thread_saved_ksp(p) = (unsigned long)childregs - 8;
208 p->thread.pc = (unsigned int) ret_from_fork; 181 p->thread.wchan = p->thread.pc;
209 p->thread.wchan = (unsigned long) ret_from_fork;
210#ifdef __DSBT__ 182#ifdef __DSBT__
211 { 183 {
212 unsigned long dp; 184 unsigned long dp;
@@ -221,28 +193,6 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
221 return 0; 193 return 0;
222} 194}
223 195
224/*
225 * c6x_execve() executes a new program.
226 */
227SYSCALL_DEFINE4(c6x_execve, const char __user *, name,
228 const char __user *const __user *, argv,
229 const char __user *const __user *, envp,
230 struct pt_regs *, regs)
231{
232 int error;
233 char *filename;
234
235 filename = getname(name);
236 error = PTR_ERR(filename);
237 if (IS_ERR(filename))
238 goto out;
239
240 error = do_execve(filename, argv, envp, regs);
241 putname(filename);
242out:
243 return error;
244}
245
246unsigned long get_wchan(struct task_struct *p) 196unsigned long get_wchan(struct task_struct *p)
247{ 197{
248 return p->thread.wchan; 198 return p->thread.wchan;
diff --git a/arch/cris/include/asm/thread_info.h b/arch/cris/include/asm/thread_info.h
index 5b1c448df5c0..07c8c40c52b3 100644
--- a/arch/cris/include/asm/thread_info.h
+++ b/arch/cris/include/asm/thread_info.h
@@ -78,15 +78,12 @@ struct thread_info {
78#define TIF_SIGPENDING 2 /* signal pending */ 78#define TIF_SIGPENDING 2 /* signal pending */
79#define TIF_NEED_RESCHED 3 /* rescheduling necessary */ 79#define TIF_NEED_RESCHED 3 /* rescheduling necessary */
80#define TIF_RESTORE_SIGMASK 9 /* restore signal mask in do_signal() */ 80#define TIF_RESTORE_SIGMASK 9 /* restore signal mask in do_signal() */
81#define TIF_POLLING_NRFLAG 16 /* true if poll_idle() is polling TIF_NEED_RESCHED */
82#define TIF_MEMDIE 17 /* is terminating due to OOM killer */ 81#define TIF_MEMDIE 17 /* is terminating due to OOM killer */
83 82
84#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) 83#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)
85#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME) 84#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME)
86#define _TIF_SIGPENDING (1<<TIF_SIGPENDING) 85#define _TIF_SIGPENDING (1<<TIF_SIGPENDING)
87#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) 86#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED)
88#define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK)
89#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG)
90 87
91#define _TIF_WORK_MASK 0x0000FFFE /* work to do on interrupt/exception return */ 88#define _TIF_WORK_MASK 0x0000FFFE /* work to do on interrupt/exception return */
92#define _TIF_ALLWORK_MASK 0x0000FFFF /* work to do on any return to u-space */ 89#define _TIF_ALLWORK_MASK 0x0000FFFF /* work to do on any return to u-space */
diff --git a/arch/frv/Kconfig b/arch/frv/Kconfig
index 9d262645f667..b7412504f08a 100644
--- a/arch/frv/Kconfig
+++ b/arch/frv/Kconfig
@@ -12,6 +12,7 @@ config FRV
12 select ARCH_HAVE_NMI_SAFE_CMPXCHG 12 select ARCH_HAVE_NMI_SAFE_CMPXCHG
13 select GENERIC_CPU_DEVICES 13 select GENERIC_CPU_DEVICES
14 select ARCH_WANT_IPC_PARSE_VERSION 14 select ARCH_WANT_IPC_PARSE_VERSION
15 select GENERIC_KERNEL_THREAD
15 16
16config ZONE_DMA 17config ZONE_DMA
17 bool 18 bool
diff --git a/arch/frv/include/asm/processor.h b/arch/frv/include/asm/processor.h
index dccb9d162318..a34f309e5801 100644
--- a/arch/frv/include/asm/processor.h
+++ b/arch/frv/include/asm/processor.h
@@ -92,14 +92,12 @@ extern struct task_struct *__kernel_current_task;
92 92
93/* 93/*
94 * do necessary setup to start up a newly executed thread. 94 * do necessary setup to start up a newly executed thread.
95 * - need to discard the frame stacked by init() invoking the execve syscall
96 */ 95 */
97#define start_thread(_regs, _pc, _usp) \ 96#define start_thread(_regs, _pc, _usp) \
98do { \ 97do { \
99 __frame = __kernel_frame0_ptr; \ 98 _regs->pc = (_pc); \
100 __frame->pc = (_pc); \ 99 _regs->psr &= ~PSR_S; \
101 __frame->psr &= ~PSR_S; \ 100 _regs->sp = (_usp); \
102 __frame->sp = (_usp); \
103} while(0) 101} while(0)
104 102
105/* Free all resources held by a thread. */ 103/* Free all resources held by a thread. */
@@ -107,7 +105,6 @@ static inline void release_thread(struct task_struct *dead_task)
107{ 105{
108} 106}
109 107
110extern asmlinkage int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
111extern asmlinkage void save_user_regs(struct user_context *target); 108extern asmlinkage void save_user_regs(struct user_context *target);
112extern asmlinkage void *restore_user_regs(const struct user_context *target, ...); 109extern asmlinkage void *restore_user_regs(const struct user_context *target, ...);
113 110
diff --git a/arch/frv/include/asm/ptrace.h b/arch/frv/include/asm/ptrace.h
index ef6635ca4ecb..bd534b2d0258 100644
--- a/arch/frv/include/asm/ptrace.h
+++ b/arch/frv/include/asm/ptrace.h
@@ -76,6 +76,7 @@ register struct pt_regs *__frame asm("gr28");
76#define user_mode(regs) (!((regs)->psr & PSR_S)) 76#define user_mode(regs) (!((regs)->psr & PSR_S))
77#define instruction_pointer(regs) ((regs)->pc) 77#define instruction_pointer(regs) ((regs)->pc)
78#define user_stack_pointer(regs) ((regs)->sp) 78#define user_stack_pointer(regs) ((regs)->sp)
79#define current_pt_regs() (__frame)
79 80
80extern unsigned long user_stack(const struct pt_regs *); 81extern unsigned long user_stack(const struct pt_regs *);
81#define profile_pc(regs) ((regs)->pc) 82#define profile_pc(regs) ((regs)->pc)
diff --git a/arch/frv/include/asm/thread_info.h b/arch/frv/include/asm/thread_info.h
index 0ff03a33c81e..bebd7eadc772 100644
--- a/arch/frv/include/asm/thread_info.h
+++ b/arch/frv/include/asm/thread_info.h
@@ -94,7 +94,6 @@ register struct thread_info *__current_thread_info asm("gr15");
94#define TIF_NEED_RESCHED 3 /* rescheduling necessary */ 94#define TIF_NEED_RESCHED 3 /* rescheduling necessary */
95#define TIF_SINGLESTEP 4 /* restore singlestep on return to user mode */ 95#define TIF_SINGLESTEP 4 /* restore singlestep on return to user mode */
96#define TIF_RESTORE_SIGMASK 5 /* restore signal mask in do_signal() */ 96#define TIF_RESTORE_SIGMASK 5 /* restore signal mask in do_signal() */
97#define TIF_POLLING_NRFLAG 6 /* true if poll_idle() is polling TIF_NEED_RESCHED */
98#define TIF_MEMDIE 7 /* is terminating due to OOM killer */ 97#define TIF_MEMDIE 7 /* is terminating due to OOM killer */
99 98
100#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) 99#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE)
@@ -102,8 +101,6 @@ register struct thread_info *__current_thread_info asm("gr15");
102#define _TIF_SIGPENDING (1 << TIF_SIGPENDING) 101#define _TIF_SIGPENDING (1 << TIF_SIGPENDING)
103#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) 102#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED)
104#define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP) 103#define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP)
105#define _TIF_RESTORE_SIGMASK (1 << TIF_RESTORE_SIGMASK)
106#define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG)
107 104
108/* work to do on interrupt/exception return */ 105/* work to do on interrupt/exception return */
109#define _TIF_WORK_MASK \ 106#define _TIF_WORK_MASK \
diff --git a/arch/frv/include/asm/unistd.h b/arch/frv/include/asm/unistd.h
index 67f23a311db6..b6b07e55e473 100644
--- a/arch/frv/include/asm/unistd.h
+++ b/arch/frv/include/asm/unistd.h
@@ -372,6 +372,8 @@
372#define __ARCH_WANT_SYS_SIGPROCMASK 372#define __ARCH_WANT_SYS_SIGPROCMASK
373#define __ARCH_WANT_SYS_RT_SIGACTION 373#define __ARCH_WANT_SYS_RT_SIGACTION
374#define __ARCH_WANT_SYS_RT_SIGSUSPEND 374#define __ARCH_WANT_SYS_RT_SIGSUSPEND
375#define __ARCH_WANT_SYS_EXECVE
376#define __ARCH_WANT_KERNEL_EXECVE
375 377
376/* 378/*
377 * "Conditional" syscalls 379 * "Conditional" syscalls
diff --git a/arch/frv/kernel/Makefile b/arch/frv/kernel/Makefile
index ad4087b69968..3cbb3294b9f9 100644
--- a/arch/frv/kernel/Makefile
+++ b/arch/frv/kernel/Makefile
@@ -7,8 +7,8 @@ heads-$(CONFIG_MMU) := head-mmu-fr451.o
7 7
8extra-y:= head.o vmlinux.lds 8extra-y:= head.o vmlinux.lds
9 9
10obj-y := $(heads-y) entry.o entry-table.o break.o switch_to.o kernel_thread.o \ 10obj-y := $(heads-y) entry.o entry-table.o break.o switch_to.o \
11 kernel_execve.o process.o traps.o ptrace.o signal.o dma.o \ 11 process.o traps.o ptrace.o signal.o dma.o \
12 sys_frv.o time.o setup.o frv_ksyms.o \ 12 sys_frv.o time.o setup.o frv_ksyms.o \
13 debug-stub.o irq.o sleep.o uaccess.o 13 debug-stub.o irq.o sleep.o uaccess.o
14 14
diff --git a/arch/frv/kernel/entry.S b/arch/frv/kernel/entry.S
index 7d5e000fd32e..002732960315 100644
--- a/arch/frv/kernel/entry.S
+++ b/arch/frv/kernel/entry.S
@@ -863,6 +863,19 @@ ret_from_fork:
863 setlos.p #0,gr8 863 setlos.p #0,gr8
864 bra __syscall_exit 864 bra __syscall_exit
865 865
866 .globl ret_from_kernel_thread
867ret_from_kernel_thread:
868 lddi.p @(gr28,#REG_GR(8)),gr20
869 call schedule_tail
870 or.p gr20,gr20,gr8
871 calll @(gr21,gr0)
872 bra sys_exit
873
874 .globl ret_from_kernel_execve
875ret_from_kernel_execve:
876 ori gr28,0,sp
877 bra __syscall_exit
878
866################################################################################################### 879###################################################################################################
867# 880#
868# Return to user mode is not as complex as all this looks, 881# Return to user mode is not as complex as all this looks,
diff --git a/arch/frv/kernel/frv_ksyms.c b/arch/frv/kernel/frv_ksyms.c
index a89803b58b9a..86c516d96dcd 100644
--- a/arch/frv/kernel/frv_ksyms.c
+++ b/arch/frv/kernel/frv_ksyms.c
@@ -30,7 +30,6 @@ EXPORT_SYMBOL(ip_fast_csum);
30EXPORT_SYMBOL(local_irq_count); 30EXPORT_SYMBOL(local_irq_count);
31EXPORT_SYMBOL(local_bh_count); 31EXPORT_SYMBOL(local_bh_count);
32#endif 32#endif
33EXPORT_SYMBOL(kernel_thread);
34 33
35EXPORT_SYMBOL(__res_bus_clock_speed_HZ); 34EXPORT_SYMBOL(__res_bus_clock_speed_HZ);
36EXPORT_SYMBOL(__page_offset); 35EXPORT_SYMBOL(__page_offset);
diff --git a/arch/frv/kernel/kernel_execve.S b/arch/frv/kernel/kernel_execve.S
deleted file mode 100644
index 9b074a16a052..000000000000
--- a/arch/frv/kernel/kernel_execve.S
+++ /dev/null
@@ -1,33 +0,0 @@
1/* in-kernel program execution
2 *
3 * Copyright (C) 2006 Red Hat, Inc. All Rights Reserved.
4 * Written by David Howells (dhowells@redhat.com)
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version
9 * 2 of the License, or (at your option) any later version.
10 */
11
12#include <linux/linkage.h>
13#include <asm/unistd.h>
14
15###############################################################################
16#
17# Do a system call from kernel instead of calling sys_execve so we end up with
18# proper pt_regs.
19#
20# int kernel_execve(const char *filename, char *const argv[], char *const envp[])
21#
22# On entry: GR8/GR9/GR10: arguments to function
23# On return: GR8: syscall return.
24#
25###############################################################################
26 .globl kernel_execve
27 .type kernel_execve,@function
28kernel_execve:
29 setlos __NR_execve,gr7
30 tira gr0,#0
31 bralr
32
33 .size kernel_execve,.-kernel_execve
diff --git a/arch/frv/kernel/kernel_thread.S b/arch/frv/kernel/kernel_thread.S
deleted file mode 100644
index f0e52943f923..000000000000
--- a/arch/frv/kernel/kernel_thread.S
+++ /dev/null
@@ -1,77 +0,0 @@
1/* kernel_thread.S: kernel thread creation
2 *
3 * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved.
4 * Written by David Howells (dhowells@redhat.com)
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version
9 * 2 of the License, or (at your option) any later version.
10 */
11
12#include <linux/linkage.h>
13#include <linux/kern_levels.h>
14#include <asm/unistd.h>
15
16#define CLONE_VM 0x00000100 /* set if VM shared between processes */
17
18 .section .rodata
19kernel_thread_emsg:
20 .asciz KERN_ERR "failed to create kernel thread: error=%d\n"
21
22 .text
23 .balign 4
24
25###############################################################################
26#
27# Create a kernel thread
28#
29# int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
30#
31###############################################################################
32 .globl kernel_thread
33 .type kernel_thread,@function
34kernel_thread:
35 or.p gr8,gr0,gr4
36 or gr9,gr0,gr5
37
38 # start by forking the current process, but with shared VM
39 setlos.p #__NR_clone,gr7 ; syscall number
40 ori gr10,#CLONE_VM,gr8 ; first syscall arg [clone_flags]
41 sethi.p #0xe4e4,gr9 ; second syscall arg [newsp]
42 setlo #0xe4e4,gr9
43 setlos.p #0,gr10 ; third syscall arg [parent_tidptr]
44 setlos #0,gr11 ; fourth syscall arg [child_tidptr]
45 tira gr0,#0
46 setlos.p #4095,gr7
47 andcc gr8,gr8,gr0,icc0
48 addcc.p gr8,gr7,gr0,icc1
49 bnelr icc0,#2
50 bc icc1,#0,kernel_thread_error
51
52 # now invoke the work function
53 or gr5,gr0,gr8
54 calll @(gr4,gr0)
55
56 # and finally exit the thread
57 setlos #__NR_exit,gr7 ; syscall number
58 tira gr0,#0
59
60kernel_thread_error:
61 subi sp,#8,sp
62 movsg lr,gr4
63 sti gr8,@(sp,#0)
64 sti.p gr4,@(sp,#4)
65
66 or gr8,gr0,gr9
67 sethi.p %hi(kernel_thread_emsg),gr8
68 setlo %lo(kernel_thread_emsg),gr8
69
70 call printk
71
72 ldi @(sp,#4),gr4
73 ldi @(sp,#0),gr8
74 subi sp,#8,sp
75 jmpl @(gr4,gr0)
76
77 .size kernel_thread,.-kernel_thread
diff --git a/arch/frv/kernel/process.c b/arch/frv/kernel/process.c
index 2eb7fa5bf9d8..655d90d20bb0 100644
--- a/arch/frv/kernel/process.c
+++ b/arch/frv/kernel/process.c
@@ -38,6 +38,7 @@
38#include "local.h" 38#include "local.h"
39 39
40asmlinkage void ret_from_fork(void); 40asmlinkage void ret_from_fork(void);
41asmlinkage void ret_from_kernel_thread(void);
41 42
42#include <asm/pgalloc.h> 43#include <asm/pgalloc.h>
43 44
@@ -172,32 +173,13 @@ asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp,
172 * set up the kernel stack and exception frames for a new process 173 * set up the kernel stack and exception frames for a new process
173 */ 174 */
174int copy_thread(unsigned long clone_flags, 175int copy_thread(unsigned long clone_flags,
175 unsigned long usp, unsigned long topstk, 176 unsigned long usp, unsigned long arg,
176 struct task_struct *p, struct pt_regs *regs) 177 struct task_struct *p, struct pt_regs *regs)
177{ 178{
178 struct pt_regs *childregs0, *childregs, *regs0; 179 struct pt_regs *childregs;
179 180
180 regs0 = __kernel_frame0_ptr; 181 childregs = (struct pt_regs *)
181 childregs0 = (struct pt_regs *)
182 (task_stack_page(p) + THREAD_SIZE - FRV_FRAME0_SIZE); 182 (task_stack_page(p) + THREAD_SIZE - FRV_FRAME0_SIZE);
183 childregs = childregs0;
184
185 /* set up the userspace frame (the only place that the USP is stored) */
186 *childregs0 = *regs0;
187
188 childregs0->gr8 = 0;
189 childregs0->sp = usp;
190 childregs0->next_frame = NULL;
191
192 /* set up the return kernel frame if called from kernel_thread() */
193 if (regs != regs0) {
194 childregs--;
195 *childregs = *regs;
196 childregs->sp = (unsigned long) childregs0;
197 childregs->next_frame = childregs0;
198 childregs->gr15 = (unsigned long) task_thread_info(p);
199 childregs->gr29 = (unsigned long) p;
200 }
201 183
202 p->set_child_tid = p->clear_child_tid = NULL; 184 p->set_child_tid = p->clear_child_tid = NULL;
203 185
@@ -206,8 +188,25 @@ int copy_thread(unsigned long clone_flags,
206 p->thread.sp = (unsigned long) childregs; 188 p->thread.sp = (unsigned long) childregs;
207 p->thread.fp = 0; 189 p->thread.fp = 0;
208 p->thread.lr = 0; 190 p->thread.lr = 0;
209 p->thread.pc = (unsigned long) ret_from_fork; 191 p->thread.frame0 = childregs;
210 p->thread.frame0 = childregs0; 192
193 if (unlikely(!regs)) {
194 memset(childregs, 0, sizeof(struct pt_regs));
195 childregs->gr9 = usp; /* function */
196 childregs->gr8 = arg;
197 chilregs->psr = PSR_S;
198 p->thread.pc = (unsigned long) ret_from_kernel_thread;
199 save_user_regs(p->thread.user);
200 return 0;
201 }
202
203 /* set up the userspace frame (the only place that the USP is stored) */
204 *childregs = *regs;
205
206 childregs->sp = usp;
207 childregs->next_frame = NULL;
208
209 p->thread.pc = (unsigned long) ret_from_fork;
211 210
212 /* the new TLS pointer is passed in as arg #5 to sys_clone() */ 211 /* the new TLS pointer is passed in as arg #5 to sys_clone() */
213 if (clone_flags & CLONE_SETTLS) 212 if (clone_flags & CLONE_SETTLS)
@@ -218,25 +217,6 @@ int copy_thread(unsigned long clone_flags,
218 return 0; 217 return 0;
219} /* end copy_thread() */ 218} /* end copy_thread() */
220 219
221/*
222 * sys_execve() executes a new program.
223 */
224asmlinkage int sys_execve(const char __user *name,
225 const char __user *const __user *argv,
226 const char __user *const __user *envp)
227{
228 int error;
229 char * filename;
230
231 filename = getname(name);
232 error = PTR_ERR(filename);
233 if (IS_ERR(filename))
234 return error;
235 error = do_execve(filename, argv, envp, __frame);
236 putname(filename);
237 return error;
238}
239
240unsigned long get_wchan(struct task_struct *p) 220unsigned long get_wchan(struct task_struct *p)
241{ 221{
242 struct pt_regs *regs0; 222 struct pt_regs *regs0;
diff --git a/arch/frv/kernel/signal.c b/arch/frv/kernel/signal.c
index 864c2f0d497b..535810a3217a 100644
--- a/arch/frv/kernel/signal.c
+++ b/arch/frv/kernel/signal.c
@@ -20,7 +20,6 @@
20#include <linux/ptrace.h> 20#include <linux/ptrace.h>
21#include <linux/unistd.h> 21#include <linux/unistd.h>
22#include <linux/personality.h> 22#include <linux/personality.h>
23#include <linux/freezer.h>
24#include <linux/tracehook.h> 23#include <linux/tracehook.h>
25#include <asm/ucontext.h> 24#include <asm/ucontext.h>
26#include <asm/uaccess.h> 25#include <asm/uaccess.h>
@@ -298,10 +297,6 @@ static int setup_frame(int sig, struct k_sigaction *ka, sigset_t *set)
298 __frame->lr = (unsigned long) &frame->retcode; 297 __frame->lr = (unsigned long) &frame->retcode;
299 __frame->gr8 = sig; 298 __frame->gr8 = sig;
300 299
301 /* the tracer may want to single-step inside the handler */
302 if (test_thread_flag(TIF_SINGLESTEP))
303 ptrace_notify(SIGTRAP);
304
305#if DEBUG_SIG 300#if DEBUG_SIG
306 printk("SIG deliver %d (%s:%d): sp=%p pc=%lx ra=%p\n", 301 printk("SIG deliver %d (%s:%d): sp=%p pc=%lx ra=%p\n",
307 sig, current->comm, current->pid, frame, __frame->pc, 302 sig, current->comm, current->pid, frame, __frame->pc,
@@ -400,10 +395,6 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
400 __frame->gr8 = sig; 395 __frame->gr8 = sig;
401 __frame->gr9 = (unsigned long) &frame->info; 396 __frame->gr9 = (unsigned long) &frame->info;
402 397
403 /* the tracer may want to single-step inside the handler */
404 if (test_thread_flag(TIF_SINGLESTEP))
405 ptrace_notify(SIGTRAP);
406
407#if DEBUG_SIG 398#if DEBUG_SIG
408 printk("SIG deliver %d (%s:%d): sp=%p pc=%lx ra=%p\n", 399 printk("SIG deliver %d (%s:%d): sp=%p pc=%lx ra=%p\n",
409 sig, current->comm, current->pid, frame, __frame->pc, 400 sig, current->comm, current->pid, frame, __frame->pc,
diff --git a/arch/h8300/include/asm/thread_info.h b/arch/h8300/include/asm/thread_info.h
index 9c126e0c09aa..ec2f7777c65a 100644
--- a/arch/h8300/include/asm/thread_info.h
+++ b/arch/h8300/include/asm/thread_info.h
@@ -85,8 +85,6 @@ static inline struct thread_info *current_thread_info(void)
85#define TIF_SYSCALL_TRACE 0 /* syscall trace active */ 85#define TIF_SYSCALL_TRACE 0 /* syscall trace active */
86#define TIF_SIGPENDING 1 /* signal pending */ 86#define TIF_SIGPENDING 1 /* signal pending */
87#define TIF_NEED_RESCHED 2 /* rescheduling necessary */ 87#define TIF_NEED_RESCHED 2 /* rescheduling necessary */
88#define TIF_POLLING_NRFLAG 3 /* true if poll_idle() is polling
89 TIF_NEED_RESCHED */
90#define TIF_MEMDIE 4 /* is terminating due to OOM killer */ 88#define TIF_MEMDIE 4 /* is terminating due to OOM killer */
91#define TIF_RESTORE_SIGMASK 5 /* restore signal mask in do_signal() */ 89#define TIF_RESTORE_SIGMASK 5 /* restore signal mask in do_signal() */
92#define TIF_NOTIFY_RESUME 6 /* callback before returning to user */ 90#define TIF_NOTIFY_RESUME 6 /* callback before returning to user */
@@ -95,11 +93,10 @@ static inline struct thread_info *current_thread_info(void)
95#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) 93#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)
96#define _TIF_SIGPENDING (1<<TIF_SIGPENDING) 94#define _TIF_SIGPENDING (1<<TIF_SIGPENDING)
97#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) 95#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED)
98#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG)
99#define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK)
100#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) 96#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME)
101 97
102#define _TIF_WORK_MASK 0x0000FFFE /* work to do on interrupt/exception return */ 98#define _TIF_WORK_MASK (_TIF_SIGPENDING | _TIF_NEED_RESCHED | \
99 _TIF_NOTIFY_RESUME)
103 100
104#endif /* __KERNEL__ */ 101#endif /* __KERNEL__ */
105 102
diff --git a/arch/h8300/kernel/signal.c b/arch/h8300/kernel/signal.c
index 5adaadaf9218..0e81b96c642f 100644
--- a/arch/h8300/kernel/signal.c
+++ b/arch/h8300/kernel/signal.c
@@ -38,7 +38,6 @@
38#include <linux/personality.h> 38#include <linux/personality.h>
39#include <linux/tty.h> 39#include <linux/tty.h>
40#include <linux/binfmts.h> 40#include <linux/binfmts.h>
41#include <linux/freezer.h>
42#include <linux/tracehook.h> 41#include <linux/tracehook.h>
43 42
44#include <asm/setup.h> 43#include <asm/setup.h>
diff --git a/arch/hexagon/include/asm/thread_info.h b/arch/hexagon/include/asm/thread_info.h
index 4f936a7ee847..e4a0aad69cbb 100644
--- a/arch/hexagon/include/asm/thread_info.h
+++ b/arch/hexagon/include/asm/thread_info.h
@@ -120,10 +120,8 @@ register struct thread_info *__current_thread_info asm(QUOTED_THREADINFO_REG);
120#define TIF_SIGPENDING 2 /* signal pending */ 120#define TIF_SIGPENDING 2 /* signal pending */
121#define TIF_NEED_RESCHED 3 /* rescheduling necessary */ 121#define TIF_NEED_RESCHED 3 /* rescheduling necessary */
122#define TIF_SINGLESTEP 4 /* restore ss @ return to usr mode */ 122#define TIF_SINGLESTEP 4 /* restore ss @ return to usr mode */
123#define TIF_IRET 5 /* return with iret */
124#define TIF_RESTORE_SIGMASK 6 /* restore sig mask in do_signal() */ 123#define TIF_RESTORE_SIGMASK 6 /* restore sig mask in do_signal() */
125/* true if poll_idle() is polling TIF_NEED_RESCHED */ 124/* true if poll_idle() is polling TIF_NEED_RESCHED */
126#define TIF_POLLING_NRFLAG 16
127#define TIF_MEMDIE 17 /* OOM killer killed process */ 125#define TIF_MEMDIE 17 /* OOM killer killed process */
128 126
129#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) 127#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE)
@@ -131,9 +129,6 @@ register struct thread_info *__current_thread_info asm(QUOTED_THREADINFO_REG);
131#define _TIF_SIGPENDING (1 << TIF_SIGPENDING) 129#define _TIF_SIGPENDING (1 << TIF_SIGPENDING)
132#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) 130#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED)
133#define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP) 131#define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP)
134#define _TIF_IRET (1 << TIF_IRET)
135#define _TIF_RESTORE_SIGMASK (1 << TIF_RESTORE_SIGMASK)
136#define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG)
137 132
138/* work to do on interrupt/exception return - All but TIF_SYSCALL_TRACE */ 133/* work to do on interrupt/exception return - All but TIF_SYSCALL_TRACE */
139#define _TIF_WORK_MASK (0x0000FFFF & ~_TIF_SYSCALL_TRACE) 134#define _TIF_WORK_MASK (0x0000FFFF & ~_TIF_SYSCALL_TRACE)
diff --git a/arch/hexagon/kernel/signal.c b/arch/hexagon/kernel/signal.c
index 304b0808d072..1ea16bec7b91 100644
--- a/arch/hexagon/kernel/signal.c
+++ b/arch/hexagon/kernel/signal.c
@@ -20,7 +20,6 @@
20 20
21#include <linux/linkage.h> 21#include <linux/linkage.h>
22#include <linux/syscalls.h> 22#include <linux/syscalls.h>
23#include <linux/freezer.h>
24#include <linux/tracehook.h> 23#include <linux/tracehook.h>
25#include <asm/registers.h> 24#include <asm/registers.h>
26#include <asm/thread_info.h> 25#include <asm/thread_info.h>
diff --git a/arch/ia64/include/asm/thread_info.h b/arch/ia64/include/asm/thread_info.h
index f7ee85378311..ff2ae4136584 100644
--- a/arch/ia64/include/asm/thread_info.h
+++ b/arch/ia64/include/asm/thread_info.h
@@ -106,7 +106,6 @@ struct thread_info {
106#define TIF_SYSCALL_AUDIT 3 /* syscall auditing active */ 106#define TIF_SYSCALL_AUDIT 3 /* syscall auditing active */
107#define TIF_SINGLESTEP 4 /* restore singlestep on return to user mode */ 107#define TIF_SINGLESTEP 4 /* restore singlestep on return to user mode */
108#define TIF_NOTIFY_RESUME 6 /* resumption notification requested */ 108#define TIF_NOTIFY_RESUME 6 /* resumption notification requested */
109#define TIF_POLLING_NRFLAG 16 /* true if poll_idle() is polling TIF_NEED_RESCHED */
110#define TIF_MEMDIE 17 /* is terminating due to OOM killer */ 109#define TIF_MEMDIE 17 /* is terminating due to OOM killer */
111#define TIF_MCA_INIT 18 /* this task is processing MCA or INIT */ 110#define TIF_MCA_INIT 18 /* this task is processing MCA or INIT */
112#define TIF_DB_DISABLED 19 /* debug trap disabled for fsyscall */ 111#define TIF_DB_DISABLED 19 /* debug trap disabled for fsyscall */
@@ -119,7 +118,6 @@ struct thread_info {
119#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) 118#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME)
120#define _TIF_SIGPENDING (1 << TIF_SIGPENDING) 119#define _TIF_SIGPENDING (1 << TIF_SIGPENDING)
121#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) 120#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED)
122#define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG)
123#define _TIF_MCA_INIT (1 << TIF_MCA_INIT) 121#define _TIF_MCA_INIT (1 << TIF_MCA_INIT)
124#define _TIF_DB_DISABLED (1 << TIF_DB_DISABLED) 122#define _TIF_DB_DISABLED (1 << TIF_DB_DISABLED)
125#define _TIF_RESTORE_RSE (1 << TIF_RESTORE_RSE) 123#define _TIF_RESTORE_RSE (1 << TIF_RESTORE_RSE)
diff --git a/arch/ia64/kernel/signal.c b/arch/ia64/kernel/signal.c
index 37dd79511cbe..680b73786be8 100644
--- a/arch/ia64/kernel/signal.c
+++ b/arch/ia64/kernel/signal.c
@@ -438,14 +438,6 @@ ia64_do_signal (struct sigscratch *scr, long in_syscall)
438 long errno = scr->pt.r8; 438 long errno = scr->pt.r8;
439 439
440 /* 440 /*
441 * In the ia64_leave_kernel code path, we want the common case to go fast, which
442 * is why we may in certain cases get here from kernel mode. Just return without
443 * doing anything if so.
444 */
445 if (!user_mode(&scr->pt))
446 return;
447
448 /*
449 * This only loops in the rare cases of handle_signal() failing, in which case we 441 * This only loops in the rare cases of handle_signal() failing, in which case we
450 * need to push through a forced SIGSEGV. 442 * need to push through a forced SIGSEGV.
451 */ 443 */
diff --git a/arch/m32r/include/asm/thread_info.h b/arch/m32r/include/asm/thread_info.h
index c083f6073ef4..c074f4c2e858 100644
--- a/arch/m32r/include/asm/thread_info.h
+++ b/arch/m32r/include/asm/thread_info.h
@@ -119,25 +119,20 @@ static inline unsigned int get_thread_fault_code(void)
119#define TIF_SIGPENDING 1 /* signal pending */ 119#define TIF_SIGPENDING 1 /* signal pending */
120#define TIF_NEED_RESCHED 2 /* rescheduling necessary */ 120#define TIF_NEED_RESCHED 2 /* rescheduling necessary */
121#define TIF_SINGLESTEP 3 /* restore singlestep on return to user mode */ 121#define TIF_SINGLESTEP 3 /* restore singlestep on return to user mode */
122#define TIF_IRET 4 /* return with iret */
123#define TIF_NOTIFY_RESUME 5 /* callback before returning to user */ 122#define TIF_NOTIFY_RESUME 5 /* callback before returning to user */
124#define TIF_RESTORE_SIGMASK 8 /* restore signal mask in do_signal() */ 123#define TIF_RESTORE_SIGMASK 8 /* restore signal mask in do_signal() */
125#define TIF_USEDFPU 16 /* FPU was used by this task this quantum (SMP) */ 124#define TIF_USEDFPU 16 /* FPU was used by this task this quantum (SMP) */
126#define TIF_POLLING_NRFLAG 17 /* true if poll_idle() is polling TIF_NEED_RESCHED */
127#define TIF_MEMDIE 18 /* is terminating due to OOM killer */ 125#define TIF_MEMDIE 18 /* is terminating due to OOM killer */
128 126
129#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) 127#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)
130#define _TIF_SIGPENDING (1<<TIF_SIGPENDING) 128#define _TIF_SIGPENDING (1<<TIF_SIGPENDING)
131#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) 129#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED)
132#define _TIF_SINGLESTEP (1<<TIF_SINGLESTEP) 130#define _TIF_SINGLESTEP (1<<TIF_SINGLESTEP)
133#define _TIF_IRET (1<<TIF_IRET)
134#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME) 131#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME)
135#define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK)
136#define _TIF_USEDFPU (1<<TIF_USEDFPU) 132#define _TIF_USEDFPU (1<<TIF_USEDFPU)
137#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG)
138 133
139#define _TIF_WORK_MASK 0x0000FFFE /* work to do on interrupt/exception return */ 134#define _TIF_WORK_MASK (_TIF_SIGPENDING | _TIF_NEED_RESCHED | _TIF_NOTIFY_RESUME)
140#define _TIF_ALLWORK_MASK 0x0000FFFF /* work to do on any return to u-space */ 135#define _TIF_ALLWORK_MASK (_TIF_WORK_MASK | _TIF_SYSCALL_TRACE)
141 136
142/* 137/*
143 * Thread-synchronous status. 138 * Thread-synchronous status.
diff --git a/arch/m32r/kernel/signal.c b/arch/m32r/kernel/signal.c
index d0f60b97bbc5..6e3c26a1607c 100644
--- a/arch/m32r/kernel/signal.c
+++ b/arch/m32r/kernel/signal.c
@@ -20,7 +20,6 @@
20#include <linux/unistd.h> 20#include <linux/unistd.h>
21#include <linux/stddef.h> 21#include <linux/stddef.h>
22#include <linux/personality.h> 22#include <linux/personality.h>
23#include <linux/freezer.h>
24#include <linux/tracehook.h> 23#include <linux/tracehook.h>
25#include <asm/cacheflush.h> 24#include <asm/cacheflush.h>
26#include <asm/ucontext.h> 25#include <asm/ucontext.h>
@@ -366,6 +365,4 @@ void do_notify_resume(struct pt_regs *regs, __u32 thread_info_flags)
366 clear_thread_flag(TIF_NOTIFY_RESUME); 365 clear_thread_flag(TIF_NOTIFY_RESUME);
367 tracehook_notify_resume(regs); 366 tracehook_notify_resume(regs);
368 } 367 }
369
370 clear_thread_flag(TIF_IRET);
371} 368}
diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig
index dae1e7e16a37..76fd6e2f71da 100644
--- a/arch/m68k/Kconfig
+++ b/arch/m68k/Kconfig
@@ -15,6 +15,7 @@ config M68K
15 select FPU if MMU 15 select FPU if MMU
16 select ARCH_WANT_IPC_PARSE_VERSION 16 select ARCH_WANT_IPC_PARSE_VERSION
17 select ARCH_USES_GETTIMEOFFSET if MMU && !COLDFIRE 17 select ARCH_USES_GETTIMEOFFSET if MMU && !COLDFIRE
18 select GENERIC_KERNEL_THREAD
18 19
19config RWSEM_GENERIC_SPINLOCK 20config RWSEM_GENERIC_SPINLOCK
20 bool 21 bool
diff --git a/arch/m68k/include/asm/processor.h b/arch/m68k/include/asm/processor.h
index f17c42aff7ff..ae700f49e51d 100644
--- a/arch/m68k/include/asm/processor.h
+++ b/arch/m68k/include/asm/processor.h
@@ -100,6 +100,16 @@ struct thread_struct {
100 .fs = __KERNEL_DS, \ 100 .fs = __KERNEL_DS, \
101} 101}
102 102
103/*
104 * ColdFire stack format sbould be 0x4 for an aligned usp (will always be
105 * true on thread creation). We need to set this explicitly.
106 */
107#ifdef CONFIG_COLDFIRE
108#define setframeformat(_regs) do { (_regs)->format = 0x4; } while(0)
109#else
110#define setframeformat(_regs) do { } while (0)
111#endif
112
103#ifdef CONFIG_MMU 113#ifdef CONFIG_MMU
104/* 114/*
105 * Do necessary setup to start up a newly executed thread. 115 * Do necessary setup to start up a newly executed thread.
@@ -109,6 +119,7 @@ static inline void start_thread(struct pt_regs * regs, unsigned long pc,
109{ 119{
110 regs->pc = pc; 120 regs->pc = pc;
111 regs->sr &= ~0x2000; 121 regs->sr &= ~0x2000;
122 setframeformat(regs);
112 wrusp(usp); 123 wrusp(usp);
113} 124}
114 125
@@ -116,21 +127,11 @@ extern int handle_kernel_fault(struct pt_regs *regs);
116 127
117#else 128#else
118 129
119/*
120 * Coldfire stacks need to be re-aligned on trap exit, conventional
121 * 68k can handle this case cleanly.
122 */
123#ifdef CONFIG_COLDFIRE
124#define reformat(_regs) do { (_regs)->format = 0x4; } while(0)
125#else
126#define reformat(_regs) do { } while (0)
127#endif
128
129#define start_thread(_regs, _pc, _usp) \ 130#define start_thread(_regs, _pc, _usp) \
130do { \ 131do { \
131 (_regs)->pc = (_pc); \ 132 (_regs)->pc = (_pc); \
132 ((struct switch_stack *)(_regs))[-1].a6 = 0; \ 133 ((struct switch_stack *)(_regs))[-1].a6 = 0; \
133 reformat(_regs); \ 134 setframeformat(_regs); \
134 if (current->mm) \ 135 if (current->mm) \
135 (_regs)->d5 = current->mm->start_data; \ 136 (_regs)->d5 = current->mm->start_data; \
136 (_regs)->sr &= ~0x2000; \ 137 (_regs)->sr &= ~0x2000; \
@@ -153,8 +154,6 @@ static inline void release_thread(struct task_struct *dead_task)
153{ 154{
154} 155}
155 156
156extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
157
158/* 157/*
159 * Free current thread data structures etc.. 158 * Free current thread data structures etc..
160 */ 159 */
diff --git a/arch/m68k/include/asm/ptrace.h b/arch/m68k/include/asm/ptrace.h
index 65322b17b6cf..5e08b597f012 100644
--- a/arch/m68k/include/asm/ptrace.h
+++ b/arch/m68k/include/asm/ptrace.h
@@ -85,6 +85,8 @@ struct switch_stack {
85#define user_mode(regs) (!((regs)->sr & PS_S)) 85#define user_mode(regs) (!((regs)->sr & PS_S))
86#define instruction_pointer(regs) ((regs)->pc) 86#define instruction_pointer(regs) ((regs)->pc)
87#define profile_pc(regs) instruction_pointer(regs) 87#define profile_pc(regs) instruction_pointer(regs)
88#define current_pt_regs() \
89 (struct pt_regs *)((char *)current_thread_info() + THREAD_SIZE) - 1
88 90
89#define arch_has_single_step() (1) 91#define arch_has_single_step() (1)
90 92
diff --git a/arch/m68k/include/asm/unistd.h b/arch/m68k/include/asm/unistd.h
index 045cfd6a9e31..c702ad716791 100644
--- a/arch/m68k/include/asm/unistd.h
+++ b/arch/m68k/include/asm/unistd.h
@@ -382,6 +382,8 @@
382#define __ARCH_WANT_SYS_SIGPROCMASK 382#define __ARCH_WANT_SYS_SIGPROCMASK
383#define __ARCH_WANT_SYS_RT_SIGACTION 383#define __ARCH_WANT_SYS_RT_SIGACTION
384#define __ARCH_WANT_SYS_RT_SIGSUSPEND 384#define __ARCH_WANT_SYS_RT_SIGSUSPEND
385#define __ARCH_WANT_SYS_EXECVE
386#define __ARCH_WANT_KERNEL_EXECVE
385 387
386/* 388/*
387 * "Conditional" syscalls 389 * "Conditional" syscalls
diff --git a/arch/m68k/kernel/entry.S b/arch/m68k/kernel/entry.S
index 165ee9f9d5c9..946cb0187751 100644
--- a/arch/m68k/kernel/entry.S
+++ b/arch/m68k/kernel/entry.S
@@ -111,6 +111,22 @@ ENTRY(ret_from_fork)
111 addql #4,%sp 111 addql #4,%sp
112 jra ret_from_exception 112 jra ret_from_exception
113 113
114ENTRY(ret_from_kernel_thread)
115 | a3 contains the kernel thread payload, d7 - its argument
116 movel %d1,%sp@-
117 jsr schedule_tail
118 GET_CURRENT(%d0)
119 movel %d7,(%sp)
120 jsr %a3@
121 addql #4,%sp
122 movel %d0,(%sp)
123 jra sys_exit
124
125ENTRY(ret_from_kernel_execve)
126 movel 4(%sp), %sp
127 GET_CURRENT(%d0)
128 jra ret_from_exception
129
114#if defined(CONFIG_COLDFIRE) || !defined(CONFIG_MMU) 130#if defined(CONFIG_COLDFIRE) || !defined(CONFIG_MMU)
115 131
116#ifdef TRAP_DBG_INTERRUPT 132#ifdef TRAP_DBG_INTERRUPT
diff --git a/arch/m68k/kernel/process.c b/arch/m68k/kernel/process.c
index ac2892e49c7c..c51bb172e14d 100644
--- a/arch/m68k/kernel/process.c
+++ b/arch/m68k/kernel/process.c
@@ -35,6 +35,7 @@
35 35
36 36
37asmlinkage void ret_from_fork(void); 37asmlinkage void ret_from_fork(void);
38asmlinkage void ret_from_kernel_thread(void);
38 39
39 40
40/* 41/*
@@ -123,51 +124,6 @@ void show_regs(struct pt_regs * regs)
123 printk("USP: %08lx\n", rdusp()); 124 printk("USP: %08lx\n", rdusp());
124} 125}
125 126
126/*
127 * Create a kernel thread
128 */
129int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
130{
131 int pid;
132 mm_segment_t fs;
133
134 fs = get_fs();
135 set_fs (KERNEL_DS);
136
137 {
138 register long retval __asm__ ("d0");
139 register long clone_arg __asm__ ("d1") = flags | CLONE_VM | CLONE_UNTRACED;
140
141 retval = __NR_clone;
142 __asm__ __volatile__
143 ("clrl %%d2\n\t"
144 "trap #0\n\t" /* Linux/m68k system call */
145 "tstl %0\n\t" /* child or parent */
146 "jne 1f\n\t" /* parent - jump */
147#ifdef CONFIG_MMU
148 "lea %%sp@(%c7),%6\n\t" /* reload current */
149 "movel %6@,%6\n\t"
150#endif
151 "movel %3,%%sp@-\n\t" /* push argument */
152 "jsr %4@\n\t" /* call fn */
153 "movel %0,%%d1\n\t" /* pass exit value */
154 "movel %2,%%d0\n\t" /* exit */
155 "trap #0\n"
156 "1:"
157 : "+d" (retval)
158 : "i" (__NR_clone), "i" (__NR_exit),
159 "r" (arg), "a" (fn), "d" (clone_arg), "r" (current),
160 "i" (-THREAD_SIZE)
161 : "d2");
162
163 pid = retval;
164 }
165
166 set_fs (fs);
167 return pid;
168}
169EXPORT_SYMBOL(kernel_thread);
170
171void flush_thread(void) 127void flush_thread(void)
172{ 128{
173 current->thread.fs = __USER_DS; 129 current->thread.fs = __USER_DS;
@@ -219,30 +175,18 @@ asmlinkage int m68k_clone(struct pt_regs *regs)
219} 175}
220 176
221int copy_thread(unsigned long clone_flags, unsigned long usp, 177int copy_thread(unsigned long clone_flags, unsigned long usp,
222 unsigned long unused, 178 unsigned long arg,
223 struct task_struct * p, struct pt_regs * regs) 179 struct task_struct * p, struct pt_regs * regs)
224{ 180{
225 struct pt_regs * childregs; 181 struct pt_regs * childregs;
226 struct switch_stack * childstack, *stack; 182 struct switch_stack *childstack;
227 unsigned long *retp;
228 183
229 childregs = (struct pt_regs *) (task_stack_page(p) + THREAD_SIZE) - 1; 184 childregs = (struct pt_regs *) (task_stack_page(p) + THREAD_SIZE) - 1;
230
231 *childregs = *regs;
232 childregs->d0 = 0;
233
234 retp = ((unsigned long *) regs);
235 stack = ((struct switch_stack *) retp) - 1;
236
237 childstack = ((struct switch_stack *) childregs) - 1; 185 childstack = ((struct switch_stack *) childregs) - 1;
238 *childstack = *stack;
239 childstack->retpc = (unsigned long)ret_from_fork;
240 186
241 p->thread.usp = usp; 187 p->thread.usp = usp;
242 p->thread.ksp = (unsigned long)childstack; 188 p->thread.ksp = (unsigned long)childstack;
243 189 p->thread.esp0 = (unsigned long)childregs;
244 if (clone_flags & CLONE_SETTLS)
245 task_thread_info(p)->tp_value = regs->d5;
246 190
247 /* 191 /*
248 * Must save the current SFC/DFC value, NOT the value when 192 * Must save the current SFC/DFC value, NOT the value when
@@ -250,6 +194,26 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
250 */ 194 */
251 p->thread.fs = get_fs().seg; 195 p->thread.fs = get_fs().seg;
252 196
197 if (unlikely(!regs)) {
198 /* kernel thread */
199 memset(childstack, 0,
200 sizeof(struct switch_stack) + sizeof(struct pt_regs));
201 childregs->sr = PS_S;
202 childstack->a3 = usp; /* function */
203 childstack->d7 = arg;
204 childstack->retpc = (unsigned long)ret_from_kernel_thread;
205 p->thread.usp = 0;
206 return 0;
207 }
208 *childregs = *regs;
209 childregs->d0 = 0;
210
211 *childstack = ((struct switch_stack *) regs)[-1];
212 childstack->retpc = (unsigned long)ret_from_fork;
213
214 if (clone_flags & CLONE_SETTLS)
215 task_thread_info(p)->tp_value = regs->d5;
216
253#ifdef CONFIG_FPU 217#ifdef CONFIG_FPU
254 if (!FPU_IS_EMU) { 218 if (!FPU_IS_EMU) {
255 /* Copy the current fpu state */ 219 /* Copy the current fpu state */
@@ -337,26 +301,6 @@ int dump_fpu (struct pt_regs *regs, struct user_m68kfp_struct *fpu)
337EXPORT_SYMBOL(dump_fpu); 301EXPORT_SYMBOL(dump_fpu);
338#endif /* CONFIG_FPU */ 302#endif /* CONFIG_FPU */
339 303
340/*
341 * sys_execve() executes a new program.
342 */
343asmlinkage int sys_execve(const char __user *name,
344 const char __user *const __user *argv,
345 const char __user *const __user *envp)
346{
347 int error;
348 char * filename;
349 struct pt_regs *regs = (struct pt_regs *) &name;
350
351 filename = getname(name);
352 error = PTR_ERR(filename);
353 if (IS_ERR(filename))
354 return error;
355 error = do_execve(filename, argv, envp, regs);
356 putname(filename);
357 return error;
358}
359
360unsigned long get_wchan(struct task_struct *p) 304unsigned long get_wchan(struct task_struct *p)
361{ 305{
362 unsigned long fp, pc; 306 unsigned long fp, pc;
diff --git a/arch/m68k/kernel/sys_m68k.c b/arch/m68k/kernel/sys_m68k.c
index 9a5932ec3689..3a480b3df0d6 100644
--- a/arch/m68k/kernel/sys_m68k.c
+++ b/arch/m68k/kernel/sys_m68k.c
@@ -549,23 +549,6 @@ asmlinkage int sys_getpagesize(void)
549 return PAGE_SIZE; 549 return PAGE_SIZE;
550} 550}
551 551
552/*
553 * Do a system call from kernel instead of calling sys_execve so we
554 * end up with proper pt_regs.
555 */
556int kernel_execve(const char *filename,
557 const char *const argv[],
558 const char *const envp[])
559{
560 register long __res asm ("%d0") = __NR_execve;
561 register long __a asm ("%d1") = (long)(filename);
562 register long __b asm ("%d2") = (long)(argv);
563 register long __c asm ("%d3") = (long)(envp);
564 asm volatile ("trap #0" : "+d" (__res)
565 : "d" (__a), "d" (__b), "d" (__c));
566 return __res;
567}
568
569asmlinkage unsigned long sys_get_thread_area(void) 552asmlinkage unsigned long sys_get_thread_area(void)
570{ 553{
571 return current_thread_info()->tp_value; 554 return current_thread_info()->tp_value;
diff --git a/arch/microblaze/include/asm/thread_info.h b/arch/microblaze/include/asm/thread_info.h
index 6c610234ffab..008f30433d22 100644
--- a/arch/microblaze/include/asm/thread_info.h
+++ b/arch/microblaze/include/asm/thread_info.h
@@ -121,7 +121,6 @@ static inline struct thread_info *current_thread_info(void)
121#define TIF_NEED_RESCHED 3 /* rescheduling necessary */ 121#define TIF_NEED_RESCHED 3 /* rescheduling necessary */
122/* restore singlestep on return to user mode */ 122/* restore singlestep on return to user mode */
123#define TIF_SINGLESTEP 4 123#define TIF_SINGLESTEP 4
124#define TIF_IRET 5 /* return with iret */
125#define TIF_MEMDIE 6 /* is terminating due to OOM killer */ 124#define TIF_MEMDIE 6 /* is terminating due to OOM killer */
126#define TIF_SYSCALL_AUDIT 9 /* syscall auditing active */ 125#define TIF_SYSCALL_AUDIT 9 /* syscall auditing active */
127#define TIF_SECCOMP 10 /* secure computing */ 126#define TIF_SECCOMP 10 /* secure computing */
@@ -134,7 +133,6 @@ static inline struct thread_info *current_thread_info(void)
134#define _TIF_SIGPENDING (1 << TIF_SIGPENDING) 133#define _TIF_SIGPENDING (1 << TIF_SIGPENDING)
135#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) 134#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED)
136#define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP) 135#define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP)
137#define _TIF_IRET (1 << TIF_IRET)
138#define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG) 136#define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG)
139#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT) 137#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT)
140#define _TIF_SECCOMP (1 << TIF_SECCOMP) 138#define _TIF_SECCOMP (1 << TIF_SECCOMP)
@@ -184,6 +182,7 @@ static inline bool test_and_clear_restore_sigmask(void)
184 ti->status &= ~TS_RESTORE_SIGMASK; 182 ti->status &= ~TS_RESTORE_SIGMASK;
185 return true; 183 return true;
186} 184}
185#define tsk_is_polling(t) test_tsk_thread_flag(t, TIF_POLLING_NRFLAG)
187#endif 186#endif
188 187
189#endif /* __KERNEL__ */ 188#endif /* __KERNEL__ */
diff --git a/arch/microblaze/kernel/signal.c b/arch/microblaze/kernel/signal.c
index c1220dbf87cd..3847e5b9c601 100644
--- a/arch/microblaze/kernel/signal.c
+++ b/arch/microblaze/kernel/signal.c
@@ -254,10 +254,6 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
254 254
255 set_fs(USER_DS); 255 set_fs(USER_DS);
256 256
257 /* the tracer may want to single-step inside the handler */
258 if (test_thread_flag(TIF_SINGLESTEP))
259 ptrace_notify(SIGTRAP);
260
261#ifdef DEBUG_SIG 257#ifdef DEBUG_SIG
262 printk(KERN_INFO "SIG deliver (%s:%d): sp=%p pc=%08lx\n", 258 printk(KERN_INFO "SIG deliver (%s:%d): sp=%p pc=%08lx\n",
263 current->comm, current->pid, frame, regs->pc); 259 current->comm, current->pid, frame, regs->pc);
@@ -315,7 +311,8 @@ handle_signal(unsigned long sig, struct k_sigaction *ka,
315 if (ret) 311 if (ret)
316 return; 312 return;
317 313
318 signal_delivered(sig, info, ka, regs, 0); 314 signal_delivered(sig, info, ka, regs,
315 test_thread_flag(TIF_SINGLESTEP));
319} 316}
320 317
321/* 318/*
diff --git a/arch/mips/include/asm/thread_info.h b/arch/mips/include/asm/thread_info.h
index 946e010f2018..8debe9e91754 100644
--- a/arch/mips/include/asm/thread_info.h
+++ b/arch/mips/include/asm/thread_info.h
@@ -103,7 +103,6 @@ register struct thread_info *__current_thread_info __asm__("$28");
103#define TIF_NOTIFY_RESUME 5 /* callback before returning to user */ 103#define TIF_NOTIFY_RESUME 5 /* callback before returning to user */
104#define TIF_RESTORE_SIGMASK 9 /* restore signal mask in do_signal() */ 104#define TIF_RESTORE_SIGMASK 9 /* restore signal mask in do_signal() */
105#define TIF_USEDFPU 16 /* FPU was used by this task this quantum (SMP) */ 105#define TIF_USEDFPU 16 /* FPU was used by this task this quantum (SMP) */
106#define TIF_POLLING_NRFLAG 17 /* true if poll_idle() is polling TIF_NEED_RESCHED */
107#define TIF_MEMDIE 18 /* is terminating due to OOM killer */ 106#define TIF_MEMDIE 18 /* is terminating due to OOM killer */
108#define TIF_FIXADE 20 /* Fix address errors in software */ 107#define TIF_FIXADE 20 /* Fix address errors in software */
109#define TIF_LOGADE 21 /* Log address errors to syslog */ 108#define TIF_LOGADE 21 /* Log address errors to syslog */
@@ -125,9 +124,7 @@ register struct thread_info *__current_thread_info __asm__("$28");
125#define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT) 124#define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT)
126#define _TIF_SECCOMP (1<<TIF_SECCOMP) 125#define _TIF_SECCOMP (1<<TIF_SECCOMP)
127#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME) 126#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME)
128#define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK)
129#define _TIF_USEDFPU (1<<TIF_USEDFPU) 127#define _TIF_USEDFPU (1<<TIF_USEDFPU)
130#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG)
131#define _TIF_FIXADE (1<<TIF_FIXADE) 128#define _TIF_FIXADE (1<<TIF_FIXADE)
132#define _TIF_LOGADE (1<<TIF_LOGADE) 129#define _TIF_LOGADE (1<<TIF_LOGADE)
133#define _TIF_32BIT_REGS (1<<TIF_32BIT_REGS) 130#define _TIF_32BIT_REGS (1<<TIF_32BIT_REGS)
diff --git a/arch/mn10300/Kconfig b/arch/mn10300/Kconfig
index 5cfb086b3903..ddbdc33471a8 100644
--- a/arch/mn10300/Kconfig
+++ b/arch/mn10300/Kconfig
@@ -8,6 +8,7 @@ config MN10300
8 select HAVE_ARCH_KGDB 8 select HAVE_ARCH_KGDB
9 select HAVE_NMI_WATCHDOG if MN10300_WD_TIMER 9 select HAVE_NMI_WATCHDOG if MN10300_WD_TIMER
10 select GENERIC_CLOCKEVENTS 10 select GENERIC_CLOCKEVENTS
11 select GENERIC_KERNEL_THREAD
11 12
12config AM33_2 13config AM33_2
13 def_bool n 14 def_bool n
diff --git a/arch/mn10300/include/asm/frame.inc b/arch/mn10300/include/asm/frame.inc
index 2ee58e3eb6b3..1c3eb4fda958 100644
--- a/arch/mn10300/include/asm/frame.inc
+++ b/arch/mn10300/include/asm/frame.inc
@@ -61,7 +61,7 @@
61############################################################################### 61###############################################################################
62.macro RESTORE_ALL 62.macro RESTORE_ALL
63 # peel back the stack to the calling frame 63 # peel back the stack to the calling frame
64 # - this permits execve() to discard extra frames due to kernel syscalls 64 # - we need that when returning from interrupts to kernel mode
65 GET_THREAD_INFO a0 65 GET_THREAD_INFO a0
66 mov (TI_frame,a0),fp 66 mov (TI_frame,a0),fp
67 mov fp,sp 67 mov fp,sp
diff --git a/arch/mn10300/include/asm/processor.h b/arch/mn10300/include/asm/processor.h
index 247928c9f549..8b80b19d0c8a 100644
--- a/arch/mn10300/include/asm/processor.h
+++ b/arch/mn10300/include/asm/processor.h
@@ -119,20 +119,13 @@ struct thread_struct {
119 119
120/* 120/*
121 * do necessary setup to start up a newly executed thread 121 * do necessary setup to start up a newly executed thread
122 * - need to discard the frame stacked by the kernel thread invoking the execve
123 * syscall (see RESTORE_ALL macro)
124 */ 122 */
125static inline void start_thread(struct pt_regs *regs, 123static inline void start_thread(struct pt_regs *regs,
126 unsigned long new_pc, unsigned long new_sp) 124 unsigned long new_pc, unsigned long new_sp)
127{ 125{
128 struct thread_info *ti = current_thread_info(); 126 regs->epsw = EPSW_nSL | EPSW_IE | EPSW_IM;
129 struct pt_regs *frame0; 127 regs->pc = new_pc;
130 128 regs->sp = new_sp;
131 frame0 = thread_info_to_uregs(ti);
132 frame0->epsw = EPSW_nSL | EPSW_IE | EPSW_IM;
133 frame0->pc = new_pc;
134 frame0->sp = new_sp;
135 ti->frame = frame0;
136} 129}
137 130
138 131
@@ -140,11 +133,6 @@ static inline void start_thread(struct pt_regs *regs,
140extern void release_thread(struct task_struct *); 133extern void release_thread(struct task_struct *);
141 134
142/* 135/*
143 * create a kernel thread without removing it from tasklists
144 */
145extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
146
147/*
148 * Return saved PC of a blocked thread. 136 * Return saved PC of a blocked thread.
149 */ 137 */
150extern unsigned long thread_saved_pc(struct task_struct *tsk); 138extern unsigned long thread_saved_pc(struct task_struct *tsk);
diff --git a/arch/mn10300/include/asm/ptrace.h b/arch/mn10300/include/asm/ptrace.h
index 44251b974f1d..08ac856c053e 100644
--- a/arch/mn10300/include/asm/ptrace.h
+++ b/arch/mn10300/include/asm/ptrace.h
@@ -86,6 +86,7 @@ struct pt_regs {
86#define user_mode(regs) (((regs)->epsw & EPSW_nSL) == EPSW_nSL) 86#define user_mode(regs) (((regs)->epsw & EPSW_nSL) == EPSW_nSL)
87#define instruction_pointer(regs) ((regs)->pc) 87#define instruction_pointer(regs) ((regs)->pc)
88#define user_stack_pointer(regs) ((regs)->sp) 88#define user_stack_pointer(regs) ((regs)->sp)
89#define current_pt_regs() current_frame()
89 90
90#define arch_has_single_step() (1) 91#define arch_has_single_step() (1)
91 92
diff --git a/arch/mn10300/include/asm/thread_info.h b/arch/mn10300/include/asm/thread_info.h
index ac519bbd42ff..f90062b0622d 100644
--- a/arch/mn10300/include/asm/thread_info.h
+++ b/arch/mn10300/include/asm/thread_info.h
@@ -160,12 +160,13 @@ void arch_release_thread_info(struct thread_info *ti);
160#define _TIF_SIGPENDING +(1 << TIF_SIGPENDING) 160#define _TIF_SIGPENDING +(1 << TIF_SIGPENDING)
161#define _TIF_NEED_RESCHED +(1 << TIF_NEED_RESCHED) 161#define _TIF_NEED_RESCHED +(1 << TIF_NEED_RESCHED)
162#define _TIF_SINGLESTEP +(1 << TIF_SINGLESTEP) 162#define _TIF_SINGLESTEP +(1 << TIF_SINGLESTEP)
163#define _TIF_RESTORE_SIGMASK +(1 << TIF_RESTORE_SIGMASK)
164#define _TIF_POLLING_NRFLAG +(1 << TIF_POLLING_NRFLAG) 163#define _TIF_POLLING_NRFLAG +(1 << TIF_POLLING_NRFLAG)
165 164
166#define _TIF_WORK_MASK 0x0000FFFE /* work to do on interrupt/exception return */ 165#define _TIF_WORK_MASK 0x0000FFFE /* work to do on interrupt/exception return */
167#define _TIF_ALLWORK_MASK 0x0000FFFF /* work to do on any return to u-space */ 166#define _TIF_ALLWORK_MASK 0x0000FFFF /* work to do on any return to u-space */
168 167
168#define tsk_is_polling(t) test_tsk_thread_flag(t, TIF_POLLING_NRFLAG)
169
169#endif /* __KERNEL__ */ 170#endif /* __KERNEL__ */
170 171
171#endif /* _ASM_THREAD_INFO_H */ 172#endif /* _ASM_THREAD_INFO_H */
diff --git a/arch/mn10300/include/asm/unistd.h b/arch/mn10300/include/asm/unistd.h
index 866eb14749d7..044c770adbb6 100644
--- a/arch/mn10300/include/asm/unistd.h
+++ b/arch/mn10300/include/asm/unistd.h
@@ -382,6 +382,8 @@
382#define __ARCH_WANT_SYS_SIGPROCMASK 382#define __ARCH_WANT_SYS_SIGPROCMASK
383#define __ARCH_WANT_SYS_RT_SIGACTION 383#define __ARCH_WANT_SYS_RT_SIGACTION
384#define __ARCH_WANT_SYS_RT_SIGSUSPEND 384#define __ARCH_WANT_SYS_RT_SIGSUSPEND
385#define __ARCH_WANT_SYS_EXECVE
386#define __ARCH_WANT_KERNEL_EXECVE
385 387
386/* 388/*
387 * "Conditional" syscalls 389 * "Conditional" syscalls
diff --git a/arch/mn10300/kernel/Makefile b/arch/mn10300/kernel/Makefile
index d06749173d63..561029f7fa44 100644
--- a/arch/mn10300/kernel/Makefile
+++ b/arch/mn10300/kernel/Makefile
@@ -7,8 +7,8 @@ fpu-obj-y := fpu-nofpu.o fpu-nofpu-low.o
7fpu-obj-$(CONFIG_FPU) := fpu.o fpu-low.o 7fpu-obj-$(CONFIG_FPU) := fpu.o fpu-low.o
8 8
9obj-y := process.o signal.o entry.o traps.o irq.o \ 9obj-y := process.o signal.o entry.o traps.o irq.o \
10 ptrace.o setup.o time.o sys_mn10300.o io.o kthread.o \ 10 ptrace.o setup.o time.o sys_mn10300.o io.o \
11 switch_to.o mn10300_ksyms.o kernel_execve.o $(fpu-obj-y) \ 11 switch_to.o mn10300_ksyms.o $(fpu-obj-y) \
12 csrc-mn10300.o cevt-mn10300.o 12 csrc-mn10300.o cevt-mn10300.o
13 13
14obj-$(CONFIG_SMP) += smp.o smp-low.o 14obj-$(CONFIG_SMP) += smp.o smp-low.o
diff --git a/arch/mn10300/kernel/entry.S b/arch/mn10300/kernel/entry.S
index 8e11f9f48999..0c631d34c8d7 100644
--- a/arch/mn10300/kernel/entry.S
+++ b/arch/mn10300/kernel/entry.S
@@ -55,6 +55,20 @@ ENTRY(ret_from_fork)
55 mov d0,(REG_D0,fp) 55 mov d0,(REG_D0,fp)
56 jmp syscall_exit 56 jmp syscall_exit
57 57
58ENTRY(ret_from_kernel_thread)
59 call schedule_tail[],0
60 mov (REG_D0,fp),d0
61 mov (REG_A0,fp),a0
62 calls (a0)
63 jmp sys_exit
64
65ENTRY(ret_from_kernel_execve)
66 add -12,d0 /* pt_regs -> frame */
67 mov d0,sp
68 GET_THREAD_INFO a2
69 clr d0
70 jmp syscall_exit
71
58############################################################################### 72###############################################################################
59# 73#
60# system call handler 74# system call handler
@@ -94,6 +108,10 @@ restore_all:
94############################################################################### 108###############################################################################
95 ALIGN 109 ALIGN
96syscall_exit_work: 110syscall_exit_work:
111 mov (REG_EPSW,fp),d0
112 and EPSW_nSL,d0
113 beq resume_kernel # returning to supervisor mode
114
97 btst _TIF_SYSCALL_TRACE,d2 115 btst _TIF_SYSCALL_TRACE,d2
98 beq work_pending 116 beq work_pending
99 LOCAL_IRQ_ENABLE # could let syscall_trace_exit() call 117 LOCAL_IRQ_ENABLE # could let syscall_trace_exit() call
diff --git a/arch/mn10300/kernel/internal.h b/arch/mn10300/kernel/internal.h
index 2df440105a80..561785581f6c 100644
--- a/arch/mn10300/kernel/internal.h
+++ b/arch/mn10300/kernel/internal.h
@@ -15,14 +15,10 @@ struct clocksource;
15struct clock_event_device; 15struct clock_event_device;
16 16
17/* 17/*
18 * kthread.S
19 */
20extern int kernel_thread_helper(int);
21
22/*
23 * entry.S 18 * entry.S
24 */ 19 */
25extern void ret_from_fork(struct task_struct *) __attribute__((noreturn)); 20extern void ret_from_fork(struct task_struct *) __attribute__((noreturn));
21extern void ret_from_kernel_thread(struct task_struct *) __attribute__((noreturn));
26 22
27/* 23/*
28 * smp-low.S 24 * smp-low.S
diff --git a/arch/mn10300/kernel/kernel_execve.S b/arch/mn10300/kernel/kernel_execve.S
deleted file mode 100644
index 86039f105268..000000000000
--- a/arch/mn10300/kernel/kernel_execve.S
+++ /dev/null
@@ -1,37 +0,0 @@
1/* MN10300 In-kernel program execution
2 *
3 * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
4 * Written by David Howells (dhowells@redhat.com)
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public Licence
8 * as published by the Free Software Foundation; either version
9 * 2 of the Licence, or (at your option) any later version.
10 */
11#include <linux/linkage.h>
12#include <asm/unistd.h>
13
14###############################################################################
15#
16# Do a system call from kernel instead of calling sys_execve so we end up with
17# proper pt_regs.
18#
19# int kernel_execve(const char *filename, char *const argv[],
20# char *const envp[])
21#
22# On entry: D0/D1/8(SP): arguments to function
23# On return: D0: syscall return.
24#
25###############################################################################
26 .globl kernel_execve
27 .type kernel_execve,@function
28kernel_execve:
29 mov a3,a1
30 mov d0,a0
31 mov (12,sp),a3
32 mov +__NR_execve,d0
33 syscall 0
34 mov a1,a3
35 rets
36
37 .size kernel_execve,.-kernel_execve
diff --git a/arch/mn10300/kernel/kthread.S b/arch/mn10300/kernel/kthread.S
deleted file mode 100644
index b5ae467ac5ec..000000000000
--- a/arch/mn10300/kernel/kthread.S
+++ /dev/null
@@ -1,31 +0,0 @@
1/* MN10300 Kernel thread trampoline function
2 *
3 * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
4 * Written by Mark Salter (msalter@redhat.com)
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public Licence
8 * as published by the Free Software Foundation; either version
9 * 2 of the Licence, or (at your option) any later version.
10 */
11 .text
12
13###############################################################################
14#
15# kernel_thread_helper - trampoline for kernel_thread()
16#
17# On entry:
18# A2 = address of function to call
19# D2 = function argument
20#
21###############################################################################
22 .globl kernel_thread_helper
23 .type kernel_thread_helper,@function
24kernel_thread_helper:
25 mov do_exit,d1
26 mov d1,(sp)
27 mov d1,mdr
28 mov d2,d0
29 jmp (a2)
30
31 .size kernel_thread_helper,.-kernel_thread_helper
diff --git a/arch/mn10300/kernel/process.c b/arch/mn10300/kernel/process.c
index e9cceba193b6..d0c671b6d9ff 100644
--- a/arch/mn10300/kernel/process.c
+++ b/arch/mn10300/kernel/process.c
@@ -165,27 +165,6 @@ void show_regs(struct pt_regs *regs)
165} 165}
166 166
167/* 167/*
168 * create a kernel thread
169 */
170int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags)
171{
172 struct pt_regs regs;
173
174 memset(&regs, 0, sizeof(regs));
175
176 regs.a2 = (unsigned long) fn;
177 regs.d2 = (unsigned long) arg;
178 regs.pc = (unsigned long) kernel_thread_helper;
179 local_save_flags(regs.epsw);
180 regs.epsw |= EPSW_IE | EPSW_IM_7;
181
182 /* Ok, create the new process.. */
183 return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, &regs, 0,
184 NULL, NULL);
185}
186EXPORT_SYMBOL(kernel_thread);
187
188/*
189 * free current thread data structures etc.. 168 * free current thread data structures etc..
190 */ 169 */
191void exit_thread(void) 170void exit_thread(void)
@@ -230,50 +209,42 @@ int copy_thread(unsigned long clone_flags,
230 struct task_struct *p, struct pt_regs *kregs) 209 struct task_struct *p, struct pt_regs *kregs)
231{ 210{
232 struct thread_info *ti = task_thread_info(p); 211 struct thread_info *ti = task_thread_info(p);
233 struct pt_regs *c_uregs, *c_kregs, *uregs; 212 struct pt_regs *c_regs;
234 unsigned long c_ksp; 213 unsigned long c_ksp;
235 214
236 uregs = current->thread.uregs;
237
238 c_ksp = (unsigned long) task_stack_page(p) + THREAD_SIZE; 215 c_ksp = (unsigned long) task_stack_page(p) + THREAD_SIZE;
239 216
240 /* allocate the userspace exception frame and set it up */ 217 /* allocate the userspace exception frame and set it up */
241 c_ksp -= sizeof(struct pt_regs); 218 c_ksp -= sizeof(struct pt_regs);
242 c_uregs = (struct pt_regs *) c_ksp; 219 c_regs = (struct pt_regs *) c_ksp;
220 c_ksp -= 12; /* allocate function call ABI slack */
243 221
244 p->thread.uregs = c_uregs; 222 /* set up things up so the scheduler can start the new task */
245 *c_uregs = *uregs; 223 p->thread.uregs = c_regs;
246 c_uregs->sp = c_usp; 224 ti->frame = c_regs;
247 c_uregs->epsw &= ~EPSW_FE; /* my FPU */ 225 p->thread.a3 = (unsigned long) c_regs;
226 p->thread.sp = c_ksp;
227 p->thread.wchan = p->thread.pc;
228 p->thread.usp = c_usp;
248 229
249 c_ksp -= 12; /* allocate function call ABI slack */ 230 if (unlikely(!kregs)) {
231 memset(c_regs, 0, sizeof(struct pt_regs));
232 c_regs->a0 = c_usp; /* function */
233 c_regs->d0 = ustk_size; /* argument */
234 local_save_flags(c_regs->epsw);
235 c_regs->epsw |= EPSW_IE | EPSW_IM_7;
236 p->thread.pc = (unsigned long) ret_from_kernel_thread;
237 return 0;
238 }
239 *c_regs = *kregs;
240 c_regs->sp = c_usp;
241 c_regs->epsw &= ~EPSW_FE; /* my FPU */
250 242
251 /* the new TLS pointer is passed in as arg #5 to sys_clone() */ 243 /* the new TLS pointer is passed in as arg #5 to sys_clone() */
252 if (clone_flags & CLONE_SETTLS) 244 if (clone_flags & CLONE_SETTLS)
253 c_uregs->e2 = current_frame()->d3; 245 c_regs->e2 = current_frame()->d3;
254
255 /* set up the return kernel frame if called from kernel_thread() */
256 c_kregs = c_uregs;
257 if (kregs != uregs) {
258 c_ksp -= sizeof(struct pt_regs);
259 c_kregs = (struct pt_regs *) c_ksp;
260 *c_kregs = *kregs;
261 c_kregs->sp = c_usp;
262 c_kregs->next = c_uregs;
263#ifdef CONFIG_MN10300_CURRENT_IN_E2
264 c_kregs->e2 = (unsigned long) p; /* current */
265#endif
266
267 c_ksp -= 12; /* allocate function call ABI slack */
268 }
269 246
270 /* set up things up so the scheduler can start the new task */
271 ti->frame = c_kregs;
272 p->thread.a3 = (unsigned long) c_kregs;
273 p->thread.sp = c_ksp;
274 p->thread.pc = (unsigned long) ret_from_fork; 247 p->thread.pc = (unsigned long) ret_from_fork;
275 p->thread.wchan = (unsigned long) ret_from_fork;
276 p->thread.usp = c_usp;
277 248
278 return 0; 249 return 0;
279} 250}
@@ -302,22 +273,6 @@ asmlinkage long sys_vfork(void)
302 current_frame(), 0, NULL, NULL); 273 current_frame(), 0, NULL, NULL);
303} 274}
304 275
305asmlinkage long sys_execve(const char __user *name,
306 const char __user *const __user *argv,
307 const char __user *const __user *envp)
308{
309 char *filename;
310 int error;
311
312 filename = getname(name);
313 error = PTR_ERR(filename);
314 if (IS_ERR(filename))
315 return error;
316 error = do_execve(filename, argv, envp, current_frame());
317 putname(filename);
318 return error;
319}
320
321unsigned long get_wchan(struct task_struct *p) 276unsigned long get_wchan(struct task_struct *p)
322{ 277{
323 return p->thread.wchan; 278 return p->thread.wchan;
diff --git a/arch/mn10300/kernel/signal.c b/arch/mn10300/kernel/signal.c
index 4d584ae29ae1..f570b3085ef9 100644
--- a/arch/mn10300/kernel/signal.c
+++ b/arch/mn10300/kernel/signal.c
@@ -317,10 +317,6 @@ static int setup_frame(int sig, struct k_sigaction *ka, sigset_t *set,
317 regs->d0 = sig; 317 regs->d0 = sig;
318 regs->d1 = (unsigned long) &frame->sc; 318 regs->d1 = (unsigned long) &frame->sc;
319 319
320 /* the tracer may want to single-step inside the handler */
321 if (test_thread_flag(TIF_SINGLESTEP))
322 ptrace_notify(SIGTRAP);
323
324#if DEBUG_SIG 320#if DEBUG_SIG
325 printk(KERN_DEBUG "SIG deliver %d (%s:%d): sp=%p pc=%lx ra=%p\n", 321 printk(KERN_DEBUG "SIG deliver %d (%s:%d): sp=%p pc=%lx ra=%p\n",
326 sig, current->comm, current->pid, frame, regs->pc, 322 sig, current->comm, current->pid, frame, regs->pc,
@@ -398,10 +394,6 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
398 regs->d0 = sig; 394 regs->d0 = sig;
399 regs->d1 = (long) &frame->info; 395 regs->d1 = (long) &frame->info;
400 396
401 /* the tracer may want to single-step inside the handler */
402 if (test_thread_flag(TIF_SINGLESTEP))
403 ptrace_notify(SIGTRAP);
404
405#if DEBUG_SIG 397#if DEBUG_SIG
406 printk(KERN_DEBUG "SIG deliver %d (%s:%d): sp=%p pc=%lx ra=%p\n", 398 printk(KERN_DEBUG "SIG deliver %d (%s:%d): sp=%p pc=%lx ra=%p\n",
407 sig, current->comm, current->pid, frame, regs->pc, 399 sig, current->comm, current->pid, frame, regs->pc,
@@ -475,11 +467,6 @@ static void do_signal(struct pt_regs *regs)
475 siginfo_t info; 467 siginfo_t info;
476 int signr; 468 int signr;
477 469
478 /* we want the common case to go fast, which is why we may in certain
479 * cases get here from kernel mode */
480 if (!user_mode(regs))
481 return;
482
483 signr = get_signal_to_deliver(&info, &ka, regs, NULL); 470 signr = get_signal_to_deliver(&info, &ka, regs, NULL);
484 if (signr > 0) { 471 if (signr > 0) {
485 if (handle_signal(signr, &info, &ka, regs) == 0) { 472 if (handle_signal(signr, &info, &ka, regs) == 0) {
diff --git a/arch/openrisc/include/asm/thread_info.h b/arch/openrisc/include/asm/thread_info.h
index 07a8bc080ef2..07f3212422ad 100644
--- a/arch/openrisc/include/asm/thread_info.h
+++ b/arch/openrisc/include/asm/thread_info.h
@@ -121,7 +121,6 @@ register struct thread_info *current_thread_info_reg asm("r10");
121#define _TIF_SIGPENDING (1<<TIF_SIGPENDING) 121#define _TIF_SIGPENDING (1<<TIF_SIGPENDING)
122#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) 122#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED)
123#define _TIF_SINGLESTEP (1<<TIF_SINGLESTEP) 123#define _TIF_SINGLESTEP (1<<TIF_SINGLESTEP)
124#define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK)
125#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) 124#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG)
126 125
127 126
@@ -129,6 +128,8 @@ register struct thread_info *current_thread_info_reg asm("r10");
129/* For OpenRISC, this is anything in the LSW other than syscall trace */ 128/* For OpenRISC, this is anything in the LSW other than syscall trace */
130#define _TIF_WORK_MASK (0xff & ~(_TIF_SYSCALL_TRACE|_TIF_SINGLESTEP)) 129#define _TIF_WORK_MASK (0xff & ~(_TIF_SYSCALL_TRACE|_TIF_SINGLESTEP))
131 130
131#define tsk_is_polling(t) test_tsk_thread_flag(t, TIF_POLLING_NRFLAG)
132
132#endif /* __KERNEL__ */ 133#endif /* __KERNEL__ */
133 134
134#endif /* _ASM_THREAD_INFO_H */ 135#endif /* _ASM_THREAD_INFO_H */
diff --git a/arch/parisc/hpux/gate.S b/arch/parisc/hpux/gate.S
index 38a1c1b8d4e8..011468857e98 100644
--- a/arch/parisc/hpux/gate.S
+++ b/arch/parisc/hpux/gate.S
@@ -71,7 +71,7 @@ ENTRY(hpux_gateway_page)
71 STREG %r26, TASK_PT_GR26(%r1) /* 1st argument */ 71 STREG %r26, TASK_PT_GR26(%r1) /* 1st argument */
72 STREG %r27, TASK_PT_GR27(%r1) /* user dp */ 72 STREG %r27, TASK_PT_GR27(%r1) /* user dp */
73 STREG %r28, TASK_PT_GR28(%r1) /* return value 0 */ 73 STREG %r28, TASK_PT_GR28(%r1) /* return value 0 */
74 STREG %r28, TASK_PT_ORIG_R28(%r1) /* return value 0 (saved for signals) */ 74 STREG %r0, TASK_PT_ORIG_R28(%r1) /* don't prohibit restarts */
75 STREG %r29, TASK_PT_GR29(%r1) /* 8th argument */ 75 STREG %r29, TASK_PT_GR29(%r1) /* 8th argument */
76 STREG %r31, TASK_PT_GR31(%r1) /* preserve syscall return ptr */ 76 STREG %r31, TASK_PT_GR31(%r1) /* preserve syscall return ptr */
77 77
diff --git a/arch/parisc/include/asm/thread_info.h b/arch/parisc/include/asm/thread_info.h
index 22b4726dee49..d1fb79a36f3d 100644
--- a/arch/parisc/include/asm/thread_info.h
+++ b/arch/parisc/include/asm/thread_info.h
@@ -68,13 +68,16 @@ struct thread_info {
68#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) 68#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED)
69#define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG) 69#define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG)
70#define _TIF_32BIT (1 << TIF_32BIT) 70#define _TIF_32BIT (1 << TIF_32BIT)
71#define _TIF_RESTORE_SIGMASK (1 << TIF_RESTORE_SIGMASK)
72#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) 71#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME)
73#define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP) 72#define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP)
74#define _TIF_BLOCKSTEP (1 << TIF_BLOCKSTEP) 73#define _TIF_BLOCKSTEP (1 << TIF_BLOCKSTEP)
75 74
76#define _TIF_USER_WORK_MASK (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | \ 75#define _TIF_USER_WORK_MASK (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | \
77 _TIF_NEED_RESCHED) 76 _TIF_NEED_RESCHED)
77#define _TIF_SYSCALL_TRACE_MASK (_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP | \
78 _TIF_BLOCKSTEP)
79
80#define tsk_is_polling(t) test_tsk_thread_flag(t, TIF_POLLING_NRFLAG)
78 81
79#endif /* __KERNEL__ */ 82#endif /* __KERNEL__ */
80 83
diff --git a/arch/parisc/kernel/signal.c b/arch/parisc/kernel/signal.c
index 594459bde14e..537996955998 100644
--- a/arch/parisc/kernel/signal.c
+++ b/arch/parisc/kernel/signal.c
@@ -113,6 +113,8 @@ sys_rt_sigreturn(struct pt_regs *regs, int in_syscall)
113 (usp - sigframe_size); 113 (usp - sigframe_size);
114 DBG(2,"sys_rt_sigreturn: frame is %p\n", frame); 114 DBG(2,"sys_rt_sigreturn: frame is %p\n", frame);
115 115
116 regs->orig_r28 = 1; /* no restarts for sigreturn */
117
116#ifdef CONFIG_64BIT 118#ifdef CONFIG_64BIT
117 compat_frame = (struct compat_rt_sigframe __user *)frame; 119 compat_frame = (struct compat_rt_sigframe __user *)frame;
118 120
@@ -437,7 +439,7 @@ give_sigsegv:
437 * OK, we're invoking a handler. 439 * OK, we're invoking a handler.
438 */ 440 */
439 441
440static long 442static void
441handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, 443handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
442 struct pt_regs *regs, int in_syscall) 444 struct pt_regs *regs, int in_syscall)
443{ 445{
@@ -447,7 +449,7 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
447 449
448 /* Set up the stack frame */ 450 /* Set up the stack frame */
449 if (!setup_rt_frame(sig, ka, info, oldset, regs, in_syscall)) 451 if (!setup_rt_frame(sig, ka, info, oldset, regs, in_syscall))
450 return 0; 452 return;
451 453
452 signal_delivered(sig, info, ka, regs, 454 signal_delivered(sig, info, ka, regs,
453 test_thread_flag(TIF_SINGLESTEP) || 455 test_thread_flag(TIF_SINGLESTEP) ||
@@ -455,13 +457,14 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
455 457
456 DBG(1,KERN_DEBUG "do_signal: Exit (success), regs->gr[28] = %ld\n", 458 DBG(1,KERN_DEBUG "do_signal: Exit (success), regs->gr[28] = %ld\n",
457 regs->gr[28]); 459 regs->gr[28]);
458
459 return 1;
460} 460}
461 461
462static inline void 462static inline void
463syscall_restart(struct pt_regs *regs, struct k_sigaction *ka) 463syscall_restart(struct pt_regs *regs, struct k_sigaction *ka)
464{ 464{
465 if (regs->orig_r28)
466 return;
467 regs->orig_r28 = 1; /* no more restarts */
465 /* Check the return code */ 468 /* Check the return code */
466 switch (regs->gr[28]) { 469 switch (regs->gr[28]) {
467 case -ERESTART_RESTARTBLOCK: 470 case -ERESTART_RESTARTBLOCK:
@@ -482,8 +485,6 @@ syscall_restart(struct pt_regs *regs, struct k_sigaction *ka)
482 * we have to do is fiddle the return pointer. 485 * we have to do is fiddle the return pointer.
483 */ 486 */
484 regs->gr[31] -= 8; /* delayed branching */ 487 regs->gr[31] -= 8; /* delayed branching */
485 /* Preserve original r28. */
486 regs->gr[28] = regs->orig_r28;
487 break; 488 break;
488 } 489 }
489} 490}
@@ -491,6 +492,9 @@ syscall_restart(struct pt_regs *regs, struct k_sigaction *ka)
491static inline void 492static inline void
492insert_restart_trampoline(struct pt_regs *regs) 493insert_restart_trampoline(struct pt_regs *regs)
493{ 494{
495 if (regs->orig_r28)
496 return;
497 regs->orig_r28 = 1; /* no more restarts */
494 switch(regs->gr[28]) { 498 switch(regs->gr[28]) {
495 case -ERESTART_RESTARTBLOCK: { 499 case -ERESTART_RESTARTBLOCK: {
496 /* Restart the system call - no handlers present */ 500 /* Restart the system call - no handlers present */
@@ -525,9 +529,6 @@ insert_restart_trampoline(struct pt_regs *regs)
525 flush_user_icache_range(regs->gr[30], regs->gr[30] + 4); 529 flush_user_icache_range(regs->gr[30], regs->gr[30] + 4);
526 530
527 regs->gr[31] = regs->gr[30] + 8; 531 regs->gr[31] = regs->gr[30] + 8;
528 /* Preserve original r28. */
529 regs->gr[28] = regs->orig_r28;
530
531 return; 532 return;
532 } 533 }
533 case -ERESTARTNOHAND: 534 case -ERESTARTNOHAND:
@@ -539,9 +540,6 @@ insert_restart_trampoline(struct pt_regs *regs)
539 * slot of the branch external instruction. 540 * slot of the branch external instruction.
540 */ 541 */
541 regs->gr[31] -= 8; 542 regs->gr[31] -= 8;
542 /* Preserve original r28. */
543 regs->gr[28] = regs->orig_r28;
544
545 return; 543 return;
546 } 544 }
547 default: 545 default:
@@ -570,30 +568,17 @@ do_signal(struct pt_regs *regs, long in_syscall)
570 DBG(1,"\ndo_signal: regs=0x%p, sr7 %#lx, in_syscall=%d\n", 568 DBG(1,"\ndo_signal: regs=0x%p, sr7 %#lx, in_syscall=%d\n",
571 regs, regs->sr[7], in_syscall); 569 regs, regs->sr[7], in_syscall);
572 570
573 /* Everyone else checks to see if they are in kernel mode at 571 signr = get_signal_to_deliver(&info, &ka, regs, NULL);
574 this point and exits if that's the case. I'm not sure why 572 DBG(3,"do_signal: signr = %d, regs->gr[28] = %ld\n", signr, regs->gr[28]);
575 we would be called in that case, but for some reason we
576 are. */
577
578 /* May need to force signal if handle_signal failed to deliver */
579 while (1) {
580 signr = get_signal_to_deliver(&info, &ka, regs, NULL);
581 DBG(3,"do_signal: signr = %d, regs->gr[28] = %ld\n", signr, regs->gr[28]);
582 573
583 if (signr <= 0) 574 if (signr > 0) {
584 break;
585
586 /* Restart a system call if necessary. */ 575 /* Restart a system call if necessary. */
587 if (in_syscall) 576 if (in_syscall)
588 syscall_restart(regs, &ka); 577 syscall_restart(regs, &ka);
589 578
590 /* Whee! Actually deliver the signal. If the 579 handle_signal(signr, &info, &ka, regs, in_syscall);
591 delivery failed, we need to continue to iterate in 580 return;
592 this loop so we can deliver the SIGSEGV... */
593 if (handle_signal(signr, &info, &ka, regs, in_syscall))
594 return;
595 } 581 }
596 /* end of while(1) looping forever if we can't force a signal */
597 582
598 /* Did we come from a system call? */ 583 /* Did we come from a system call? */
599 if (in_syscall) 584 if (in_syscall)
diff --git a/arch/parisc/kernel/syscall.S b/arch/parisc/kernel/syscall.S
index 82a52b2fb13f..86742df0b194 100644
--- a/arch/parisc/kernel/syscall.S
+++ b/arch/parisc/kernel/syscall.S
@@ -156,7 +156,7 @@ linux_gateway_entry:
156 STREG %r26, TASK_PT_GR26(%r1) /* 1st argument */ 156 STREG %r26, TASK_PT_GR26(%r1) /* 1st argument */
157 STREG %r27, TASK_PT_GR27(%r1) /* user dp */ 157 STREG %r27, TASK_PT_GR27(%r1) /* user dp */
158 STREG %r28, TASK_PT_GR28(%r1) /* return value 0 */ 158 STREG %r28, TASK_PT_GR28(%r1) /* return value 0 */
159 STREG %r28, TASK_PT_ORIG_R28(%r1) /* return value 0 (saved for signals) */ 159 STREG %r0, TASK_PT_ORIG_R28(%r1) /* don't prohibit restarts */
160 STREG %r29, TASK_PT_GR29(%r1) /* return value 1 */ 160 STREG %r29, TASK_PT_GR29(%r1) /* return value 1 */
161 STREG %r31, TASK_PT_GR31(%r1) /* preserve syscall return ptr */ 161 STREG %r31, TASK_PT_GR31(%r1) /* preserve syscall return ptr */
162 162
@@ -180,9 +180,10 @@ linux_gateway_entry:
180 180
181 /* Are we being ptraced? */ 181 /* Are we being ptraced? */
182 mfctl %cr30, %r1 182 mfctl %cr30, %r1
183 LDREG TI_TASK(%r1),%r1 183 LDREG TI_FLAGS(%r1),%r1
184 ldw TASK_PTRACE(%r1), %r1 184 ldi _TIF_SYSCALL_TRACE_MASK, %r19
185 bb,<,n %r1,31,.Ltracesys 185 and,COND(=) %r1, %r19, %r0
186 b,n .Ltracesys
186 187
187 /* Note! We cannot use the syscall table that is mapped 188 /* Note! We cannot use the syscall table that is mapped
188 nearby since the gateway page is mapped execute-only. */ 189 nearby since the gateway page is mapped execute-only. */
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index df7edb887a04..78d6588b6e86 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -141,6 +141,7 @@ config PPC
141 select GENERIC_CLOCKEVENTS 141 select GENERIC_CLOCKEVENTS
142 select GENERIC_STRNCPY_FROM_USER 142 select GENERIC_STRNCPY_FROM_USER
143 select GENERIC_STRNLEN_USER 143 select GENERIC_STRNLEN_USER
144 select GENERIC_KERNEL_THREAD
144 145
145config EARLY_PRINTK 146config EARLY_PRINTK
146 bool 147 bool
diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h
index 9dc5cd1fde1a..8734b3855272 100644
--- a/arch/powerpc/include/asm/processor.h
+++ b/arch/powerpc/include/asm/processor.h
@@ -74,9 +74,6 @@ struct task_struct;
74void start_thread(struct pt_regs *regs, unsigned long fdptr, unsigned long sp); 74void start_thread(struct pt_regs *regs, unsigned long fdptr, unsigned long sp);
75void release_thread(struct task_struct *); 75void release_thread(struct task_struct *);
76 76
77/* Create a new kernel thread. */
78extern long kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
79
80/* Lazy FPU handling on uni-processor */ 77/* Lazy FPU handling on uni-processor */
81extern struct task_struct *last_task_used_math; 78extern struct task_struct *last_task_used_math;
82extern struct task_struct *last_task_used_altivec; 79extern struct task_struct *last_task_used_altivec;
diff --git a/arch/powerpc/include/asm/ptrace.h b/arch/powerpc/include/asm/ptrace.h
index 9c21ed42aba6..f76b88c367d1 100644
--- a/arch/powerpc/include/asm/ptrace.h
+++ b/arch/powerpc/include/asm/ptrace.h
@@ -125,6 +125,8 @@ extern unsigned long ptrace_get_reg(struct task_struct *task, int regno);
125extern int ptrace_put_reg(struct task_struct *task, int regno, 125extern int ptrace_put_reg(struct task_struct *task, int regno,
126 unsigned long data); 126 unsigned long data);
127 127
128#define current_pt_regs() \
129 ((struct pt_regs *)((unsigned long)current_thread_info() + THREAD_SIZE) - 1)
128/* 130/*
129 * We use the least-significant bit of the trap field to indicate 131 * We use the least-significant bit of the trap field to indicate
130 * whether we have saved the full set of registers, or only a 132 * whether we have saved the full set of registers, or only a
diff --git a/arch/powerpc/include/asm/syscalls.h b/arch/powerpc/include/asm/syscalls.h
index 4084e567d28e..329db4ec12ca 100644
--- a/arch/powerpc/include/asm/syscalls.h
+++ b/arch/powerpc/include/asm/syscalls.h
@@ -17,9 +17,6 @@ asmlinkage unsigned long sys_mmap(unsigned long addr, size_t len,
17asmlinkage unsigned long sys_mmap2(unsigned long addr, size_t len, 17asmlinkage unsigned long sys_mmap2(unsigned long addr, size_t len,
18 unsigned long prot, unsigned long flags, 18 unsigned long prot, unsigned long flags,
19 unsigned long fd, unsigned long pgoff); 19 unsigned long fd, unsigned long pgoff);
20asmlinkage int sys_execve(unsigned long a0, unsigned long a1,
21 unsigned long a2, unsigned long a3, unsigned long a4,
22 unsigned long a5, struct pt_regs *regs);
23asmlinkage int sys_clone(unsigned long clone_flags, unsigned long usp, 20asmlinkage int sys_clone(unsigned long clone_flags, unsigned long usp,
24 int __user *parent_tidp, void __user *child_threadptr, 21 int __user *parent_tidp, void __user *child_threadptr,
25 int __user *child_tidp, int p6, struct pt_regs *regs); 22 int __user *child_tidp, int p6, struct pt_regs *regs);
diff --git a/arch/powerpc/include/asm/thread_info.h b/arch/powerpc/include/asm/thread_info.h
index 8ceea14d6fe4..406b7b9a1341 100644
--- a/arch/powerpc/include/asm/thread_info.h
+++ b/arch/powerpc/include/asm/thread_info.h
@@ -182,6 +182,8 @@ static inline bool test_thread_local_flags(unsigned int flags)
182#define is_32bit_task() (1) 182#define is_32bit_task() (1)
183#endif 183#endif
184 184
185#define tsk_is_polling(t) test_tsk_thread_flag(t, TIF_POLLING_NRFLAG)
186
185#endif /* !__ASSEMBLY__ */ 187#endif /* !__ASSEMBLY__ */
186 188
187#endif /* __KERNEL__ */ 189#endif /* __KERNEL__ */
diff --git a/arch/powerpc/include/asm/unistd.h b/arch/powerpc/include/asm/unistd.h
index c683fa350add..2533752af30f 100644
--- a/arch/powerpc/include/asm/unistd.h
+++ b/arch/powerpc/include/asm/unistd.h
@@ -421,6 +421,8 @@
421#define __ARCH_WANT_SYS_NEWFSTATAT 421#define __ARCH_WANT_SYS_NEWFSTATAT
422#define __ARCH_WANT_COMPAT_SYS_SENDFILE 422#define __ARCH_WANT_COMPAT_SYS_SENDFILE
423#endif 423#endif
424#define __ARCH_WANT_SYS_EXECVE
425#define __ARCH_WANT_KERNEL_EXECVE
424 426
425/* 427/*
426 * "Conditional" syscalls 428 * "Conditional" syscalls
diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S
index af37528da49f..9499385676e7 100644
--- a/arch/powerpc/kernel/entry_32.S
+++ b/arch/powerpc/kernel/entry_32.S
@@ -435,6 +435,22 @@ ret_from_fork:
435 li r3,0 435 li r3,0
436 b ret_from_syscall 436 b ret_from_syscall
437 437
438 .globl ret_from_kernel_thread
439ret_from_kernel_thread:
440 REST_NVGPRS(r1)
441 bl schedule_tail
442 mtlr r14
443 mr r3,r15
444 PPC440EP_ERR42
445 blrl
446 li r3,0
447 b do_exit # no return
448
449 .globl __ret_from_kernel_execve
450__ret_from_kernel_execve:
451 addi r1,r3,-STACK_FRAME_OVERHEAD
452 b ret_from_syscall
453
438/* Traced system call support */ 454/* Traced system call support */
439syscall_dotrace: 455syscall_dotrace:
440 SAVE_NVGPRS(r1) 456 SAVE_NVGPRS(r1)
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S
index 0e931aaffca2..56e0ff0878b5 100644
--- a/arch/powerpc/kernel/entry_64.S
+++ b/arch/powerpc/kernel/entry_64.S
@@ -370,6 +370,22 @@ _GLOBAL(ret_from_fork)
370 li r3,0 370 li r3,0
371 b syscall_exit 371 b syscall_exit
372 372
373_GLOBAL(ret_from_kernel_thread)
374 bl .schedule_tail
375 REST_NVGPRS(r1)
376 REST_GPR(2,r1)
377 mtlr r14
378 mr r3,r15
379 blrl
380 li r3,0
381 b .do_exit # no return
382
383_GLOBAL(__ret_from_kernel_execve)
384 addi r1,r3,-STACK_FRAME_OVERHEAD
385 li r10,1
386 std r10,SOFTE(r1)
387 b syscall_exit
388
373 .section ".toc","aw" 389 .section ".toc","aw"
374DSCR_DEFAULT: 390DSCR_DEFAULT:
375 .tc dscr_default[TC],dscr_default 391 .tc dscr_default[TC],dscr_default
diff --git a/arch/powerpc/kernel/misc.S b/arch/powerpc/kernel/misc.S
index ba16874fe294..7ce26d45777e 100644
--- a/arch/powerpc/kernel/misc.S
+++ b/arch/powerpc/kernel/misc.S
@@ -54,13 +54,6 @@ _GLOBAL(add_reloc_offset)
54 .align 3 54 .align 3
552: PPC_LONG 1b 552: PPC_LONG 1b
56 56
57_GLOBAL(kernel_execve)
58 li r0,__NR_execve
59 sc
60 bnslr
61 neg r3,r3
62 blr
63
64_GLOBAL(setjmp) 57_GLOBAL(setjmp)
65 mflr r0 58 mflr r0
66 PPC_STL r0,0(r3) 59 PPC_STL r0,0(r3)
diff --git a/arch/powerpc/kernel/misc_32.S b/arch/powerpc/kernel/misc_32.S
index 407e293aad2f..19e096bd0e73 100644
--- a/arch/powerpc/kernel/misc_32.S
+++ b/arch/powerpc/kernel/misc_32.S
@@ -663,39 +663,6 @@ _GLOBAL(abs)
663 sub r3,r3,r4 663 sub r3,r3,r4
664 blr 664 blr
665 665
666/*
667 * Create a kernel thread
668 * kernel_thread(fn, arg, flags)
669 */
670_GLOBAL(kernel_thread)
671 stwu r1,-16(r1)
672 stw r30,8(r1)
673 stw r31,12(r1)
674 mr r30,r3 /* function */
675 mr r31,r4 /* argument */
676 ori r3,r5,CLONE_VM /* flags */
677 oris r3,r3,CLONE_UNTRACED>>16
678 li r4,0 /* new sp (unused) */
679 li r0,__NR_clone
680 sc
681 bns+ 1f /* did system call indicate error? */
682 neg r3,r3 /* if so, make return code negative */
6831: cmpwi 0,r3,0 /* parent or child? */
684 bne 2f /* return if parent */
685 li r0,0 /* make top-level stack frame */
686 stwu r0,-16(r1)
687 mtlr r30 /* fn addr in lr */
688 mr r3,r31 /* load arg and call fn */
689 PPC440EP_ERR42
690 blrl
691 li r0,__NR_exit /* exit if function returns */
692 li r3,0
693 sc
6942: lwz r30,8(r1)
695 lwz r31,12(r1)
696 addi r1,r1,16
697 blr
698
699#ifdef CONFIG_SMP 666#ifdef CONFIG_SMP
700_GLOBAL(start_secondary_resume) 667_GLOBAL(start_secondary_resume)
701 /* Reset stack */ 668 /* Reset stack */
diff --git a/arch/powerpc/kernel/misc_64.S b/arch/powerpc/kernel/misc_64.S
index 565b78625a32..5cfa8008693b 100644
--- a/arch/powerpc/kernel/misc_64.S
+++ b/arch/powerpc/kernel/misc_64.S
@@ -407,40 +407,6 @@ _GLOBAL(scom970_write)
407 407
408 408
409/* 409/*
410 * Create a kernel thread
411 * kernel_thread(fn, arg, flags)
412 */
413_GLOBAL(kernel_thread)
414 std r29,-24(r1)
415 std r30,-16(r1)
416 stdu r1,-STACK_FRAME_OVERHEAD(r1)
417 mr r29,r3
418 mr r30,r4
419 ori r3,r5,CLONE_VM /* flags */
420 oris r3,r3,(CLONE_UNTRACED>>16)
421 li r4,0 /* new sp (unused) */
422 li r0,__NR_clone
423 sc
424 bns+ 1f /* did system call indicate error? */
425 neg r3,r3 /* if so, make return code negative */
4261: cmpdi 0,r3,0 /* parent or child? */
427 bne 2f /* return if parent */
428 li r0,0
429 stdu r0,-STACK_FRAME_OVERHEAD(r1)
430 ld r2,8(r29)
431 ld r29,0(r29)
432 mtlr r29 /* fn addr in lr */
433 mr r3,r30 /* load arg and call fn */
434 blrl
435 li r0,__NR_exit /* exit after child exits */
436 li r3,0
437 sc
4382: addi r1,r1,STACK_FRAME_OVERHEAD
439 ld r29,-24(r1)
440 ld r30,-16(r1)
441 blr
442
443/*
444 * disable_kernel_fp() 410 * disable_kernel_fp()
445 * Disable the FPU. 411 * Disable the FPU.
446 */ 412 */
diff --git a/arch/powerpc/kernel/ppc_ksyms.c b/arch/powerpc/kernel/ppc_ksyms.c
index 3e4031581c65..19e4288d8486 100644
--- a/arch/powerpc/kernel/ppc_ksyms.c
+++ b/arch/powerpc/kernel/ppc_ksyms.c
@@ -94,7 +94,6 @@ EXPORT_SYMBOL(pci_dram_offset);
94#endif /* CONFIG_PCI */ 94#endif /* CONFIG_PCI */
95 95
96EXPORT_SYMBOL(start_thread); 96EXPORT_SYMBOL(start_thread);
97EXPORT_SYMBOL(kernel_thread);
98 97
99EXPORT_SYMBOL(giveup_fpu); 98EXPORT_SYMBOL(giveup_fpu);
100#ifdef CONFIG_ALTIVEC 99#ifdef CONFIG_ALTIVEC
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
index d5ad666efd8b..ba48233500f6 100644
--- a/arch/powerpc/kernel/process.c
+++ b/arch/powerpc/kernel/process.c
@@ -733,30 +733,39 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
733extern unsigned long dscr_default; /* defined in arch/powerpc/kernel/sysfs.c */ 733extern unsigned long dscr_default; /* defined in arch/powerpc/kernel/sysfs.c */
734 734
735int copy_thread(unsigned long clone_flags, unsigned long usp, 735int copy_thread(unsigned long clone_flags, unsigned long usp,
736 unsigned long unused, struct task_struct *p, 736 unsigned long arg, struct task_struct *p,
737 struct pt_regs *regs) 737 struct pt_regs *regs)
738{ 738{
739 struct pt_regs *childregs, *kregs; 739 struct pt_regs *childregs, *kregs;
740 extern void ret_from_fork(void); 740 extern void ret_from_fork(void);
741 extern void ret_from_kernel_thread(void);
742 void (*f)(void);
741 unsigned long sp = (unsigned long)task_stack_page(p) + THREAD_SIZE; 743 unsigned long sp = (unsigned long)task_stack_page(p) + THREAD_SIZE;
742 744
743 CHECK_FULL_REGS(regs);
744 /* Copy registers */ 745 /* Copy registers */
745 sp -= sizeof(struct pt_regs); 746 sp -= sizeof(struct pt_regs);
746 childregs = (struct pt_regs *) sp; 747 childregs = (struct pt_regs *) sp;
747 *childregs = *regs; 748 if (!regs) {
748 if ((childregs->msr & MSR_PR) == 0) {
749 /* for kernel thread, set `current' and stackptr in new task */ 749 /* for kernel thread, set `current' and stackptr in new task */
750 memset(childregs, 0, sizeof(struct pt_regs));
750 childregs->gpr[1] = sp + sizeof(struct pt_regs); 751 childregs->gpr[1] = sp + sizeof(struct pt_regs);
751#ifdef CONFIG_PPC32 752#ifdef CONFIG_PPC64
752 childregs->gpr[2] = (unsigned long) p; 753 childregs->gpr[14] = *(unsigned long *)usp;
753#else 754 childregs->gpr[2] = ((unsigned long *)usp)[1],
754 clear_tsk_thread_flag(p, TIF_32BIT); 755 clear_tsk_thread_flag(p, TIF_32BIT);
756#else
757 childregs->gpr[14] = usp; /* function */
758 childregs->gpr[2] = (unsigned long) p;
755#endif 759#endif
760 childregs->gpr[15] = arg;
756 p->thread.regs = NULL; /* no user register state */ 761 p->thread.regs = NULL; /* no user register state */
762 f = ret_from_kernel_thread;
757 } else { 763 } else {
764 CHECK_FULL_REGS(regs);
765 *childregs = *regs;
758 childregs->gpr[1] = usp; 766 childregs->gpr[1] = usp;
759 p->thread.regs = childregs; 767 p->thread.regs = childregs;
768 childregs->gpr[3] = 0; /* Result from fork() */
760 if (clone_flags & CLONE_SETTLS) { 769 if (clone_flags & CLONE_SETTLS) {
761#ifdef CONFIG_PPC64 770#ifdef CONFIG_PPC64
762 if (!is_32bit_task()) 771 if (!is_32bit_task())
@@ -765,8 +774,9 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
765#endif 774#endif
766 childregs->gpr[2] = childregs->gpr[6]; 775 childregs->gpr[2] = childregs->gpr[6];
767 } 776 }
777
778 f = ret_from_fork;
768 } 779 }
769 childregs->gpr[3] = 0; /* Result from fork() */
770 sp -= STACK_FRAME_OVERHEAD; 780 sp -= STACK_FRAME_OVERHEAD;
771 781
772 /* 782 /*
@@ -805,19 +815,17 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
805 p->thread.dscr = current->thread.dscr; 815 p->thread.dscr = current->thread.dscr;
806 } 816 }
807#endif 817#endif
808
809 /* 818 /*
810 * The PPC64 ABI makes use of a TOC to contain function 819 * The PPC64 ABI makes use of a TOC to contain function
811 * pointers. The function (ret_from_except) is actually a pointer 820 * pointers. The function (ret_from_except) is actually a pointer
812 * to the TOC entry. The first entry is a pointer to the actual 821 * to the TOC entry. The first entry is a pointer to the actual
813 * function. 822 * function.
814 */ 823 */
815#ifdef CONFIG_PPC64 824#ifdef CONFIG_PPC64
816 kregs->nip = *((unsigned long *)ret_from_fork); 825 kregs->nip = *((unsigned long *)f);
817#else 826#else
818 kregs->nip = (unsigned long)ret_from_fork; 827 kregs->nip = (unsigned long)f;
819#endif 828#endif
820
821 return 0; 829 return 0;
822} 830}
823 831
@@ -1055,26 +1063,13 @@ int sys_vfork(unsigned long p1, unsigned long p2, unsigned long p3,
1055 regs, 0, NULL, NULL); 1063 regs, 0, NULL, NULL);
1056} 1064}
1057 1065
1058int sys_execve(unsigned long a0, unsigned long a1, unsigned long a2, 1066void __ret_from_kernel_execve(struct pt_regs *normal)
1059 unsigned long a3, unsigned long a4, unsigned long a5, 1067__noreturn;
1060 struct pt_regs *regs) 1068
1069void ret_from_kernel_execve(struct pt_regs *normal)
1061{ 1070{
1062 int error; 1071 set_thread_flag(TIF_RESTOREALL);
1063 char *filename; 1072 __ret_from_kernel_execve(normal);
1064
1065 filename = getname((const char __user *) a0);
1066 error = PTR_ERR(filename);
1067 if (IS_ERR(filename))
1068 goto out;
1069 flush_fp_to_thread(current);
1070 flush_altivec_to_thread(current);
1071 flush_spe_to_thread(current);
1072 error = do_execve(filename,
1073 (const char __user *const __user *) a1,
1074 (const char __user *const __user *) a2, regs);
1075 putname(filename);
1076out:
1077 return error;
1078} 1073}
1079 1074
1080static inline int valid_irq_stack(unsigned long sp, struct task_struct *p, 1075static inline int valid_irq_stack(unsigned long sp, struct task_struct *p,
diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c
index 8b4c049aee20..804e323c139d 100644
--- a/arch/powerpc/kernel/signal_32.c
+++ b/arch/powerpc/kernel/signal_32.c
@@ -35,7 +35,6 @@
35#include <linux/stddef.h> 35#include <linux/stddef.h>
36#include <linux/tty.h> 36#include <linux/tty.h>
37#include <linux/binfmts.h> 37#include <linux/binfmts.h>
38#include <linux/freezer.h>
39#endif 38#endif
40 39
41#include <asm/uaccess.h> 40#include <asm/uaccess.h>
diff --git a/arch/powerpc/kernel/sys_ppc32.c b/arch/powerpc/kernel/sys_ppc32.c
index abd1112da54f..9c2ed90ece8f 100644
--- a/arch/powerpc/kernel/sys_ppc32.c
+++ b/arch/powerpc/kernel/sys_ppc32.c
@@ -156,28 +156,6 @@ asmlinkage long compat_sys_sendfile64_wrapper(u32 out_fd, u32 in_fd,
156 (off_t __user *)offset, count); 156 (off_t __user *)offset, count);
157} 157}
158 158
159long compat_sys_execve(unsigned long a0, unsigned long a1, unsigned long a2,
160 unsigned long a3, unsigned long a4, unsigned long a5,
161 struct pt_regs *regs)
162{
163 int error;
164 char * filename;
165
166 filename = getname((char __user *) a0);
167 error = PTR_ERR(filename);
168 if (IS_ERR(filename))
169 goto out;
170 flush_fp_to_thread(current);
171 flush_altivec_to_thread(current);
172
173 error = compat_do_execve(filename, compat_ptr(a1), compat_ptr(a2), regs);
174
175 putname(filename);
176
177out:
178 return error;
179}
180
181/* Note: it is necessary to treat option as an unsigned int, 159/* Note: it is necessary to treat option as an unsigned int,
182 * with the corresponding cast to a signed int to insure that the 160 * with the corresponding cast to a signed int to insure that the
183 * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode) 161 * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
diff --git a/arch/s390/include/asm/thread_info.h b/arch/s390/include/asm/thread_info.h
index bb08e2afc5de..9e2cfe0349c3 100644
--- a/arch/s390/include/asm/thread_info.h
+++ b/arch/s390/include/asm/thread_info.h
@@ -91,8 +91,6 @@ static inline struct thread_info *current_thread_info(void)
91#define TIF_SYSCALL_AUDIT 9 /* syscall auditing active */ 91#define TIF_SYSCALL_AUDIT 9 /* syscall auditing active */
92#define TIF_SECCOMP 10 /* secure computing */ 92#define TIF_SECCOMP 10 /* secure computing */
93#define TIF_SYSCALL_TRACEPOINT 11 /* syscall tracepoint instrumentation */ 93#define TIF_SYSCALL_TRACEPOINT 11 /* syscall tracepoint instrumentation */
94#define TIF_POLLING_NRFLAG 16 /* true if poll_idle() is polling
95 TIF_NEED_RESCHED */
96#define TIF_31BIT 17 /* 32bit process */ 94#define TIF_31BIT 17 /* 32bit process */
97#define TIF_MEMDIE 18 /* is terminating due to OOM killer */ 95#define TIF_MEMDIE 18 /* is terminating due to OOM killer */
98#define TIF_RESTORE_SIGMASK 19 /* restore signal mask in do_signal() */ 96#define TIF_RESTORE_SIGMASK 19 /* restore signal mask in do_signal() */
@@ -100,7 +98,6 @@ static inline struct thread_info *current_thread_info(void)
100 98
101#define _TIF_SYSCALL (1<<TIF_SYSCALL) 99#define _TIF_SYSCALL (1<<TIF_SYSCALL)
102#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME) 100#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME)
103#define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK)
104#define _TIF_SIGPENDING (1<<TIF_SIGPENDING) 101#define _TIF_SIGPENDING (1<<TIF_SIGPENDING)
105#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) 102#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED)
106#define _TIF_PER_TRAP (1<<TIF_PER_TRAP) 103#define _TIF_PER_TRAP (1<<TIF_PER_TRAP)
@@ -109,7 +106,6 @@ static inline struct thread_info *current_thread_info(void)
109#define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT) 106#define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT)
110#define _TIF_SECCOMP (1<<TIF_SECCOMP) 107#define _TIF_SECCOMP (1<<TIF_SECCOMP)
111#define _TIF_SYSCALL_TRACEPOINT (1<<TIF_SYSCALL_TRACEPOINT) 108#define _TIF_SYSCALL_TRACEPOINT (1<<TIF_SYSCALL_TRACEPOINT)
112#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG)
113#define _TIF_31BIT (1<<TIF_31BIT) 109#define _TIF_31BIT (1<<TIF_31BIT)
114#define _TIF_SINGLE_STEP (1<<TIF_SINGLE_STEP) 110#define _TIF_SINGLE_STEP (1<<TIF_SINGLE_STEP)
115 111
diff --git a/arch/score/include/asm/thread_info.h b/arch/score/include/asm/thread_info.h
index a18006e97f1c..1425cc034872 100644
--- a/arch/score/include/asm/thread_info.h
+++ b/arch/score/include/asm/thread_info.h
@@ -86,16 +86,12 @@ register struct thread_info *__current_thread_info __asm__("r28");
86#define TIF_NEED_RESCHED 2 /* rescheduling necessary */ 86#define TIF_NEED_RESCHED 2 /* rescheduling necessary */
87#define TIF_NOTIFY_RESUME 5 /* callback before returning to user */ 87#define TIF_NOTIFY_RESUME 5 /* callback before returning to user */
88#define TIF_RESTORE_SIGMASK 9 /* restore signal mask in do_signal() */ 88#define TIF_RESTORE_SIGMASK 9 /* restore signal mask in do_signal() */
89#define TIF_POLLING_NRFLAG 17 /* true if poll_idle() is polling
90 TIF_NEED_RESCHED */
91#define TIF_MEMDIE 18 /* is terminating due to OOM killer */ 89#define TIF_MEMDIE 18 /* is terminating due to OOM killer */
92 90
93#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) 91#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)
94#define _TIF_SIGPENDING (1<<TIF_SIGPENDING) 92#define _TIF_SIGPENDING (1<<TIF_SIGPENDING)
95#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) 93#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED)
96#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME) 94#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME)
97#define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK)
98#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG)
99 95
100#define _TIF_WORK_MASK (0x0000ffff) 96#define _TIF_WORK_MASK (0x0000ffff)
101 97
diff --git a/arch/score/kernel/signal.c b/arch/score/kernel/signal.c
index e382c52ca0d9..c268bbf8b410 100644
--- a/arch/score/kernel/signal.c
+++ b/arch/score/kernel/signal.c
@@ -174,6 +174,7 @@ score_rt_sigreturn(struct pt_regs *regs)
174 /* It is more difficult to avoid calling this function than to 174 /* It is more difficult to avoid calling this function than to
175 call it and ignore errors. */ 175 call it and ignore errors. */
176 do_sigaltstack((stack_t __user *)&st, NULL, regs->regs[0]); 176 do_sigaltstack((stack_t __user *)&st, NULL, regs->regs[0]);
177 regs->is_syscall = 0;
177 178
178 __asm__ __volatile__( 179 __asm__ __volatile__(
179 "mv\tr0, %0\n\t" 180 "mv\tr0, %0\n\t"
diff --git a/arch/sh/include/asm/thread_info.h b/arch/sh/include/asm/thread_info.h
index bc13b57cdc83..7d5ac4e48485 100644
--- a/arch/sh/include/asm/thread_info.h
+++ b/arch/sh/include/asm/thread_info.h
@@ -206,6 +206,9 @@ static inline bool test_and_clear_restore_sigmask(void)
206 ti->status &= ~TS_RESTORE_SIGMASK; 206 ti->status &= ~TS_RESTORE_SIGMASK;
207 return true; 207 return true;
208} 208}
209
210#define tsk_is_polling(t) test_tsk_thread_flag(t, TIF_POLLING_NRFLAG)
211
209#endif /* !__ASSEMBLY__ */ 212#endif /* !__ASSEMBLY__ */
210 213
211#endif /* __KERNEL__ */ 214#endif /* __KERNEL__ */
diff --git a/arch/sh/kernel/signal_32.c b/arch/sh/kernel/signal_32.c
index d6b7b6154f87..2f1f65356c0c 100644
--- a/arch/sh/kernel/signal_32.c
+++ b/arch/sh/kernel/signal_32.c
@@ -22,7 +22,6 @@
22#include <linux/elf.h> 22#include <linux/elf.h>
23#include <linux/personality.h> 23#include <linux/personality.h>
24#include <linux/binfmts.h> 24#include <linux/binfmts.h>
25#include <linux/freezer.h>
26#include <linux/io.h> 25#include <linux/io.h>
27#include <linux/tracehook.h> 26#include <linux/tracehook.h>
28#include <asm/ucontext.h> 27#include <asm/ucontext.h>
diff --git a/arch/sh/kernel/signal_64.c b/arch/sh/kernel/signal_64.c
index 6b5b3dfe886b..23853814bd17 100644
--- a/arch/sh/kernel/signal_64.c
+++ b/arch/sh/kernel/signal_64.c
@@ -18,7 +18,6 @@
18#include <linux/errno.h> 18#include <linux/errno.h>
19#include <linux/wait.h> 19#include <linux/wait.h>
20#include <linux/personality.h> 20#include <linux/personality.h>
21#include <linux/freezer.h>
22#include <linux/ptrace.h> 21#include <linux/ptrace.h>
23#include <linux/unistd.h> 22#include <linux/unistd.h>
24#include <linux/stddef.h> 23#include <linux/stddef.h>
diff --git a/arch/sparc/include/asm/thread_info_32.h b/arch/sparc/include/asm/thread_info_32.h
index e6cd224506a9..25849ae3e900 100644
--- a/arch/sparc/include/asm/thread_info_32.h
+++ b/arch/sparc/include/asm/thread_info_32.h
@@ -126,13 +126,14 @@ register struct thread_info *current_thread_info_reg asm("g6");
126#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME) 126#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME)
127#define _TIF_SIGPENDING (1<<TIF_SIGPENDING) 127#define _TIF_SIGPENDING (1<<TIF_SIGPENDING)
128#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) 128#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED)
129#define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK)
130#define _TIF_USEDFPU (1<<TIF_USEDFPU) 129#define _TIF_USEDFPU (1<<TIF_USEDFPU)
131#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) 130#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG)
132 131
133#define _TIF_DO_NOTIFY_RESUME_MASK (_TIF_NOTIFY_RESUME | \ 132#define _TIF_DO_NOTIFY_RESUME_MASK (_TIF_NOTIFY_RESUME | \
134 _TIF_SIGPENDING) 133 _TIF_SIGPENDING)
135 134
135#define tsk_is_polling(t) test_tsk_thread_flag(t, TIF_POLLING_NRFLAG)
136
136#endif /* __KERNEL__ */ 137#endif /* __KERNEL__ */
137 138
138#endif /* _ASM_THREAD_INFO_H */ 139#endif /* _ASM_THREAD_INFO_H */
diff --git a/arch/sparc/include/asm/thread_info_64.h b/arch/sparc/include/asm/thread_info_64.h
index cfa8c38fb9c8..4e2276631081 100644
--- a/arch/sparc/include/asm/thread_info_64.h
+++ b/arch/sparc/include/asm/thread_info_64.h
@@ -256,6 +256,9 @@ static inline bool test_and_clear_restore_sigmask(void)
256 ti->status &= ~TS_RESTORE_SIGMASK; 256 ti->status &= ~TS_RESTORE_SIGMASK;
257 return true; 257 return true;
258} 258}
259
260#define tsk_is_polling(t) test_tsk_thread_flag(t, TIF_POLLING_NRFLAG)
261
259#endif /* !__ASSEMBLY__ */ 262#endif /* !__ASSEMBLY__ */
260 263
261#endif /* __KERNEL__ */ 264#endif /* __KERNEL__ */
diff --git a/arch/tile/kernel/compat_signal.c b/arch/tile/kernel/compat_signal.c
index 7bc0859a9f5e..08b4fe1717bb 100644
--- a/arch/tile/kernel/compat_signal.c
+++ b/arch/tile/kernel/compat_signal.c
@@ -354,15 +354,6 @@ int compat_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
354 regs->regs[1] = ptr_to_compat_reg(&frame->info); 354 regs->regs[1] = ptr_to_compat_reg(&frame->info);
355 regs->regs[2] = ptr_to_compat_reg(&frame->uc); 355 regs->regs[2] = ptr_to_compat_reg(&frame->uc);
356 regs->flags |= PT_FLAGS_CALLER_SAVES; 356 regs->flags |= PT_FLAGS_CALLER_SAVES;
357
358 /*
359 * Notify any tracer that was single-stepping it.
360 * The tracer may want to single-step inside the
361 * handler too.
362 */
363 if (test_thread_flag(TIF_SINGLESTEP))
364 ptrace_notify(SIGTRAP);
365
366 return 0; 357 return 0;
367 358
368give_sigsegv: 359give_sigsegv:
diff --git a/arch/tile/kernel/signal.c b/arch/tile/kernel/signal.c
index e29b0553211d..67efb656d104 100644
--- a/arch/tile/kernel/signal.c
+++ b/arch/tile/kernel/signal.c
@@ -219,15 +219,6 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
219 regs->regs[1] = (unsigned long) &frame->info; 219 regs->regs[1] = (unsigned long) &frame->info;
220 regs->regs[2] = (unsigned long) &frame->uc; 220 regs->regs[2] = (unsigned long) &frame->uc;
221 regs->flags |= PT_FLAGS_CALLER_SAVES; 221 regs->flags |= PT_FLAGS_CALLER_SAVES;
222
223 /*
224 * Notify any tracer that was single-stepping it.
225 * The tracer may want to single-step inside the
226 * handler too.
227 */
228 if (test_thread_flag(TIF_SINGLESTEP))
229 ptrace_notify(SIGTRAP);
230
231 return 0; 222 return 0;
232 223
233give_sigsegv: 224give_sigsegv:
@@ -278,7 +269,8 @@ static void handle_signal(unsigned long sig, siginfo_t *info,
278 ret = setup_rt_frame(sig, ka, info, oldset, regs); 269 ret = setup_rt_frame(sig, ka, info, oldset, regs);
279 if (ret) 270 if (ret)
280 return; 271 return;
281 signal_delivered(sig, info, ka, regs, 0); 272 signal_delivered(sig, info, ka, regs,
273 test_thread_flag(TIF_SINGLESTEP));
282} 274}
283 275
284/* 276/*
diff --git a/arch/um/include/asm/thread_info.h b/arch/um/include/asm/thread_info.h
index c04e5ab68f56..2c8eeb2df8b4 100644
--- a/arch/um/include/asm/thread_info.h
+++ b/arch/um/include/asm/thread_info.h
@@ -65,8 +65,6 @@ static inline struct thread_info *current_thread_info(void)
65#define TIF_SYSCALL_TRACE 0 /* syscall trace active */ 65#define TIF_SYSCALL_TRACE 0 /* syscall trace active */
66#define TIF_SIGPENDING 1 /* signal pending */ 66#define TIF_SIGPENDING 1 /* signal pending */
67#define TIF_NEED_RESCHED 2 /* rescheduling necessary */ 67#define TIF_NEED_RESCHED 2 /* rescheduling necessary */
68#define TIF_POLLING_NRFLAG 3 /* true if poll_idle() is polling
69 * TIF_NEED_RESCHED */
70#define TIF_RESTART_BLOCK 4 68#define TIF_RESTART_BLOCK 4
71#define TIF_MEMDIE 5 /* is terminating due to OOM killer */ 69#define TIF_MEMDIE 5 /* is terminating due to OOM killer */
72#define TIF_SYSCALL_AUDIT 6 70#define TIF_SYSCALL_AUDIT 6
@@ -76,7 +74,6 @@ static inline struct thread_info *current_thread_info(void)
76#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) 74#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE)
77#define _TIF_SIGPENDING (1 << TIF_SIGPENDING) 75#define _TIF_SIGPENDING (1 << TIF_SIGPENDING)
78#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) 76#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED)
79#define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG)
80#define _TIF_MEMDIE (1 << TIF_MEMDIE) 77#define _TIF_MEMDIE (1 << TIF_MEMDIE)
81#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT) 78#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT)
82 79
diff --git a/arch/unicore32/include/asm/thread_info.h b/arch/unicore32/include/asm/thread_info.h
index 89f7557583b8..818b4a1edb5b 100644
--- a/arch/unicore32/include/asm/thread_info.h
+++ b/arch/unicore32/include/asm/thread_info.h
@@ -141,12 +141,12 @@ static inline struct thread_info *current_thread_info(void)
141#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) 141#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED)
142#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) 142#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME)
143#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) 143#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE)
144#define _TIF_RESTORE_SIGMASK (1 << TIF_RESTORE_SIGMASK)
145 144
146/* 145/*
147 * Change these and you break ASM code in entry-common.S 146 * Change these and you break ASM code in entry-common.S
148 */ 147 */
149#define _TIF_WORK_MASK 0x000000ff 148#define _TIF_WORK_MASK \
149 (_TIF_SIGPENDING | _TIF_NEED_RESCHED | _TIF_NOTIFY_RESUME)
150 150
151#endif /* __KERNEL__ */ 151#endif /* __KERNEL__ */
152#endif /* __UNICORE_THREAD_INFO_H__ */ 152#endif /* __UNICORE_THREAD_INFO_H__ */
diff --git a/arch/unicore32/kernel/entry.S b/arch/unicore32/kernel/entry.S
index 00a259f9819e..dcb87ab19ddd 100644
--- a/arch/unicore32/kernel/entry.S
+++ b/arch/unicore32/kernel/entry.S
@@ -544,8 +544,6 @@ fast_work_pending:
544work_pending: 544work_pending:
545 cand.a r1, #_TIF_NEED_RESCHED 545 cand.a r1, #_TIF_NEED_RESCHED
546 bne work_resched 546 bne work_resched
547 cand.a r1, #_TIF_SIGPENDING|_TIF_NOTIFY_RESUME
548 beq no_work_pending
549 mov r0, sp @ 'regs' 547 mov r0, sp @ 'regs'
550 mov r2, why @ 'syscall' 548 mov r2, why @ 'syscall'
551 cand.a r1, #_TIF_SIGPENDING @ delivering a signal? 549 cand.a r1, #_TIF_SIGPENDING @ delivering a signal?
diff --git a/arch/unicore32/kernel/signal.c b/arch/unicore32/kernel/signal.c
index 8adedb37720a..b8b2ffd774d6 100644
--- a/arch/unicore32/kernel/signal.c
+++ b/arch/unicore32/kernel/signal.c
@@ -12,7 +12,6 @@
12#include <linux/errno.h> 12#include <linux/errno.h>
13#include <linux/signal.h> 13#include <linux/signal.h>
14#include <linux/personality.h> 14#include <linux/personality.h>
15#include <linux/freezer.h>
16#include <linux/uaccess.h> 15#include <linux/uaccess.h>
17#include <linux/tracehook.h> 16#include <linux/tracehook.h>
18#include <linux/elf.h> 17#include <linux/elf.h>
diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S
index 8f9ed1afde8f..2c6340796fe9 100644
--- a/arch/x86/kernel/entry_32.S
+++ b/arch/x86/kernel/entry_32.S
@@ -622,6 +622,10 @@ work_notifysig: # deal with pending signals and
622 movl %esp, %eax 622 movl %esp, %eax
623 jne work_notifysig_v86 # returning to kernel-space or 623 jne work_notifysig_v86 # returning to kernel-space or
624 # vm86-space 624 # vm86-space
6251:
626#else
627 movl %esp, %eax
628#endif
625 TRACE_IRQS_ON 629 TRACE_IRQS_ON
626 ENABLE_INTERRUPTS(CLBR_NONE) 630 ENABLE_INTERRUPTS(CLBR_NONE)
627 movb PT_CS(%esp), %bl 631 movb PT_CS(%esp), %bl
@@ -632,24 +636,15 @@ work_notifysig: # deal with pending signals and
632 call do_notify_resume 636 call do_notify_resume
633 jmp resume_userspace 637 jmp resume_userspace
634 638
639#ifdef CONFIG_VM86
635 ALIGN 640 ALIGN
636work_notifysig_v86: 641work_notifysig_v86:
637 pushl_cfi %ecx # save ti_flags for do_notify_resume 642 pushl_cfi %ecx # save ti_flags for do_notify_resume
638 call save_v86_state # %eax contains pt_regs pointer 643 call save_v86_state # %eax contains pt_regs pointer
639 popl_cfi %ecx 644 popl_cfi %ecx
640 movl %eax, %esp 645 movl %eax, %esp
641#else 646 jmp 1b
642 movl %esp, %eax
643#endif 647#endif
644 TRACE_IRQS_ON
645 ENABLE_INTERRUPTS(CLBR_NONE)
646 movb PT_CS(%esp), %bl
647 andb $SEGMENT_RPL_MASK, %bl
648 cmpb $USER_RPL, %bl
649 jb resume_kernel
650 xorl %edx, %edx
651 call do_notify_resume
652 jmp resume_userspace
653END(work_pending) 648END(work_pending)
654 649
655 # perform syscall exit tracing 650 # perform syscall exit tracing
diff --git a/arch/xtensa/include/asm/thread_info.h b/arch/xtensa/include/asm/thread_info.h
index 81abfd5d01ac..9481004ac119 100644
--- a/arch/xtensa/include/asm/thread_info.h
+++ b/arch/xtensa/include/asm/thread_info.h
@@ -128,19 +128,14 @@ static inline struct thread_info *current_thread_info(void)
128#define TIF_SIGPENDING 1 /* signal pending */ 128#define TIF_SIGPENDING 1 /* signal pending */
129#define TIF_NEED_RESCHED 2 /* rescheduling necessary */ 129#define TIF_NEED_RESCHED 2 /* rescheduling necessary */
130#define TIF_SINGLESTEP 3 /* restore singlestep on return to user mode */ 130#define TIF_SINGLESTEP 3 /* restore singlestep on return to user mode */
131#define TIF_IRET 4 /* return with iret */
132#define TIF_MEMDIE 5 /* is terminating due to OOM killer */ 131#define TIF_MEMDIE 5 /* is terminating due to OOM killer */
133#define TIF_RESTORE_SIGMASK 6 /* restore signal mask in do_signal() */ 132#define TIF_RESTORE_SIGMASK 6 /* restore signal mask in do_signal() */
134#define TIF_NOTIFY_RESUME 7 /* callback before returning to user */ 133#define TIF_NOTIFY_RESUME 7 /* callback before returning to user */
135#define TIF_POLLING_NRFLAG 16 /* true if poll_idle() is polling TIF_NEED_RESCHED */
136 134
137#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) 135#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)
138#define _TIF_SIGPENDING (1<<TIF_SIGPENDING) 136#define _TIF_SIGPENDING (1<<TIF_SIGPENDING)
139#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) 137#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED)
140#define _TIF_SINGLESTEP (1<<TIF_SINGLESTEP) 138#define _TIF_SINGLESTEP (1<<TIF_SINGLESTEP)
141#define _TIF_IRET (1<<TIF_IRET)
142#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG)
143#define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK)
144 139
145#define _TIF_WORK_MASK 0x0000FFFE /* work to do on interrupt/exception return */ 140#define _TIF_WORK_MASK 0x0000FFFE /* work to do on interrupt/exception return */
146#define _TIF_ALLWORK_MASK 0x0000FFFF /* work to do on any return to u-space */ 141#define _TIF_ALLWORK_MASK 0x0000FFFF /* work to do on any return to u-space */
diff --git a/arch/xtensa/kernel/signal.c b/arch/xtensa/kernel/signal.c
index efe4e854b3cd..63c566f627bc 100644
--- a/arch/xtensa/kernel/signal.c
+++ b/arch/xtensa/kernel/signal.c
@@ -19,7 +19,6 @@
19#include <linux/errno.h> 19#include <linux/errno.h>
20#include <linux/ptrace.h> 20#include <linux/ptrace.h>
21#include <linux/personality.h> 21#include <linux/personality.h>
22#include <linux/freezer.h>
23#include <linux/tracehook.h> 22#include <linux/tracehook.h>
24 23
25#include <asm/ucontext.h> 24#include <asm/ucontext.h>
@@ -527,9 +526,6 @@ static void do_signal(struct pt_regs *regs)
527 526
528void do_notify_resume(struct pt_regs *regs) 527void do_notify_resume(struct pt_regs *regs)
529{ 528{
530 if (!user_mode(regs))
531 return;
532
533 if (test_thread_flag(TIF_SIGPENDING)) 529 if (test_thread_flag(TIF_SIGPENDING))
534 do_signal(regs); 530 do_signal(regs);
535 531