diff options
Diffstat (limited to 'arch/x86/kernel/process_64.c')
| -rw-r--r-- | arch/x86/kernel/process_64.c | 11 | 
1 files changed, 9 insertions, 2 deletions
| diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index 00ac66fa5c6b..d49a9094f6f3 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); | 
