diff options
author | Brian Gerst <brgerst@gmail.com> | 2009-12-09 12:34:43 -0500 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2009-12-10 18:55:39 -0500 |
commit | f443ff4201dd25cd4dec183f9919ecba90c8edc2 (patch) | |
tree | 4da9d9c35e46c68b87b180285517cc6323bd5d03 /arch | |
parent | e840227c141116171c89ab1abb5cc9fee6fdb488 (diff) |
x86: Sync 32/64-bit kernel_thread
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>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/kernel/process_32.c | 5 | ||||
-rw-r--r-- | arch/x86/kernel/process_64.c | 11 |
2 files changed, 13 insertions, 3 deletions
diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c index bd874d2b6ab..f2e8b05a4f0 100644 --- a/arch/x86/kernel/process_32.c +++ b/arch/x86/kernel/process_32.c | |||
@@ -211,14 +211,17 @@ int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags) | |||
211 | regs.si = (unsigned long) fn; | 211 | regs.si = (unsigned long) fn; |
212 | regs.di = (unsigned long) arg; | 212 | regs.di = (unsigned long) arg; |
213 | 213 | ||
214 | #ifdef CONFIG_X86_32 | ||
214 | regs.ds = __USER_DS; | 215 | regs.ds = __USER_DS; |
215 | regs.es = __USER_DS; | 216 | regs.es = __USER_DS; |
216 | regs.fs = __KERNEL_PERCPU; | 217 | regs.fs = __KERNEL_PERCPU; |
217 | regs.gs = __KERNEL_STACK_CANARY; | 218 | regs.gs = __KERNEL_STACK_CANARY; |
219 | #endif | ||
220 | |||
218 | regs.orig_ax = -1; | 221 | regs.orig_ax = -1; |
219 | regs.ip = (unsigned long) kernel_thread_helper; | 222 | regs.ip = (unsigned long) kernel_thread_helper; |
220 | regs.cs = __KERNEL_CS | get_kernel_rpl(); | 223 | regs.cs = __KERNEL_CS | get_kernel_rpl(); |
221 | regs.flags = X86_EFLAGS_IF | X86_EFLAGS_SF | X86_EFLAGS_PF | 0x2; | 224 | regs.flags = X86_EFLAGS_IF | 0x2; |
222 | 225 | ||
223 | /* Ok, create the new process.. */ | 226 | /* Ok, create the new process.. */ |
224 | return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0, NULL, NULL); | 227 | return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0, NULL, NULL); |
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index 00ac66fa5c6..d49a9094f6f 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c | |||
@@ -248,10 +248,17 @@ int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags) | |||
248 | regs.si = (unsigned long) fn; | 248 | regs.si = (unsigned long) fn; |
249 | regs.di = (unsigned long) arg; | 249 | regs.di = (unsigned long) arg; |
250 | 250 | ||
251 | #ifdef CONFIG_X86_32 | ||
252 | regs.ds = __USER_DS; | ||
253 | regs.es = __USER_DS; | ||
254 | regs.fs = __KERNEL_PERCPU; | ||
255 | regs.gs = __KERNEL_STACK_CANARY; | ||
256 | #endif | ||
257 | |||
251 | regs.orig_ax = -1; | 258 | regs.orig_ax = -1; |
252 | regs.ip = (unsigned long) kernel_thread_helper; | 259 | regs.ip = (unsigned long) kernel_thread_helper; |
253 | regs.cs = __KERNEL_CS; | 260 | regs.cs = __KERNEL_CS | get_kernel_rpl(); |
254 | regs.flags = X86_EFLAGS_IF; | 261 | regs.flags = X86_EFLAGS_IF | 0x2; |
255 | 262 | ||
256 | /* Ok, create the new process.. */ | 263 | /* Ok, create the new process.. */ |
257 | return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0, NULL, NULL); | 264 | return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0, NULL, NULL); |