summaryrefslogtreecommitdiff
path: root/arch/i386/kernel/process.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@g5.osdl.org>2006-10-05 15:51:43 -0700
committerLinus Torvalds <torvalds@g5.osdl.org>2006-10-05 15:54:07 -0700
commite03508b43fd93410c1abda2eeabe021de8461f95 (patch)
tree4e06ae2ce0e6a0c5c93a8ad79322ff53a11fc874 /arch/i386/kernel/process.c
parentd7a297baa6edea94167163bed808c6a8933bd5aa (diff)
parent88271e9e43e65537c6390af3718a60c45c787e8f (diff)
Merge branch 'for-linus' of git://one.firstfloor.org/home/andi/git/linux-2.6
* 'for-linus' of git://one.firstfloor.org/home/andi/git/linux-2.6: [PATCH] i386: fix rwsem build bug on CONFIG_M386=y [PATCH] x86-64: Annotate interrupt frame backlink in interrupt handlers [PATCH] x86-64: Fix FPU corruption [PATCH] x86: Terminate the kernel stacks for the unwinder [PATCH] i386: Fix PCI BIOS config space access [PATCH] x86-64: Calgary IOMMU: print PCI bus numbers in hex [PATCH] x86-64: Calgary IOMMU: Update Jon's contact info [PATCH] x86-64: Calgary IOMMU: Fix off by one when calculating register space location [PATCH] x86-64: Calgary IOMMU: deobfuscate calgary_init [PATCH] i386: Update defconfig [PATCH] x86-64: Update defconfig [ Manually skipped commits that incorrectly ignored AC in kernel space. The alignment fault is defined to only happen for CPL3 anyway - Linus ]
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 dad02a960e03..b0a07801d9df 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);