aboutsummaryrefslogtreecommitdiff
path: root/arch/i386/kernel/process.c
diff options
context:
space:
mode:
authorJeff Garzik <jeff@garzik.org>2006-10-05 21:03:43 -0400
committerJeff Garzik <jeff@garzik.org>2006-10-05 21:03:43 -0400
commit4ad99f15c6a3cadf36928c399459ea4fdb3d49f9 (patch)
treed0536e4da737900fa27b235f175a3d179d692200 /arch/i386/kernel/process.c
parent46767aeba58ca9357a2309765201bad38d8f5e9b (diff)
parent44aefd2706bb6f5b65ba2c38cd89e7609e2b43d3 (diff)
Merge branch 'master' into upstream-fixes
Diffstat (limited to 'arch/i386/kernel/process.c')
-rw-r--r--arch/i386/kernel/process.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/arch/i386/kernel/process.c b/arch/i386/kernel/process.c
index dad02a960e0..b0a07801d9d 100644
--- a/arch/i386/kernel/process.c
+++ b/arch/i386/kernel/process.c
@@ -328,6 +328,7 @@ extern void kernel_thread_helper(void);
int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
{
struct pt_regs regs;
+ int err;
memset(&regs, 0, sizeof(regs));
@@ -342,7 +343,10 @@ int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
regs.eflags = X86_EFLAGS_IF | X86_EFLAGS_SF | X86_EFLAGS_PF | 0x2;
/* Ok, create the new process.. */
- return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, &regs, 0, NULL, NULL);
+ err = do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, &regs, 0, NULL, NULL);
+ if (err == 0) /* terminate kernel stack */
+ task_pt_regs(current)->eip = 0;
+ return err;
}
EXPORT_SYMBOL(kernel_thread);