x86: Sync 32/64-bit kernel_thread
authorBrian Gerst <brgerst@gmail.com>
Wed, 9 Dec 2009 17:34:43 +0000 (12:34 -0500)
committerH. Peter Anvin <hpa@zytor.com>
Thu, 10 Dec 2009 23:55:39 +0000 (15:55 -0800)
Signed-off-by: Brian Gerst <brgerst@gmail.com>
LKML-Reference: <1260380084-3707-5-git-send-email-brgerst@gmail.com>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
arch/x86/kernel/process_32.c
arch/x86/kernel/process_64.c

index bd874d2b6ab13372507e135393927247129b202b..f2e8b05a4f025d22ab1969800dcda5e08a0172e9 100644 (file)
@@ -211,14 +211,17 @@ int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags)
        regs.si = (unsigned long) fn;
        regs.di = (unsigned long) arg;
 
+#ifdef CONFIG_X86_32
        regs.ds = __USER_DS;
        regs.es = __USER_DS;
        regs.fs = __KERNEL_PERCPU;
        regs.gs = __KERNEL_STACK_CANARY;
+#endif
+
        regs.orig_ax = -1;
        regs.ip = (unsigned long) kernel_thread_helper;
        regs.cs = __KERNEL_CS | get_kernel_rpl();
-       regs.flags = X86_EFLAGS_IF | X86_EFLAGS_SF | X86_EFLAGS_PF | 0x2;
+       regs.flags = X86_EFLAGS_IF | 0x2;
 
        /* Ok, create the new process.. */
        return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, &regs, 0, NULL, NULL);
index 00ac66fa5c6b2820c58d6db9bc4872d2c4b90169..d49a9094f6f34a30dcea3404f9a5659f66e65e7b 100644 (file)
@@ -248,10 +248,17 @@ int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags)
        regs.si = (unsigned long) fn;
        regs.di = (unsigned long) arg;
 
+#ifdef CONFIG_X86_32
+       regs.ds = __USER_DS;
+       regs.es = __USER_DS;
+       regs.fs = __KERNEL_PERCPU;
+       regs.gs = __KERNEL_STACK_CANARY;
+#endif
+
        regs.orig_ax = -1;
        regs.ip = (unsigned long) kernel_thread_helper;
-       regs.cs = __KERNEL_CS;
-       regs.flags = X86_EFLAGS_IF;
+       regs.cs = __KERNEL_CS | get_kernel_rpl();
+       regs.flags = X86_EFLAGS_IF | 0x2;
 
        /* Ok, create the new process.. */
        return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, &regs, 0, NULL, NULL);