diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2012-09-10 16:44:54 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2012-09-30 22:53:31 -0400 |
commit | 7076aada1040de4ed79a5977dbabdb5e5ea5e249 (patch) | |
tree | dfcf480d21cd714a1cc42f38417c427d06526f5a /arch/x86/kernel/process.c | |
parent | 44f4b56b54d2ab5d06c1726f2cde8ca15c8fac47 (diff) |
x86: split ret_from_fork
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'arch/x86/kernel/process.c')
-rw-r--r-- | arch/x86/kernel/process.c | 38 |
1 files changed, 0 insertions, 38 deletions
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index 7162e9c1f598..6947ec968bf8 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c | |||
@@ -299,44 +299,6 @@ sys_clone(unsigned long clone_flags, unsigned long newsp, | |||
299 | } | 299 | } |
300 | 300 | ||
301 | /* | 301 | /* |
302 | * This gets run with %si containing the | ||
303 | * function to call, and %di containing | ||
304 | * the "args". | ||
305 | */ | ||
306 | extern void kernel_thread_helper(void); | ||
307 | |||
308 | /* | ||
309 | * Create a kernel thread | ||
310 | */ | ||
311 | int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags) | ||
312 | { | ||
313 | struct pt_regs regs; | ||
314 | |||
315 | memset(®s, 0, sizeof(regs)); | ||
316 | |||
317 | regs.si = (unsigned long) fn; | ||
318 | regs.di = (unsigned long) arg; | ||
319 | |||
320 | #ifdef CONFIG_X86_32 | ||
321 | regs.ds = __USER_DS; | ||
322 | regs.es = __USER_DS; | ||
323 | regs.fs = __KERNEL_PERCPU; | ||
324 | regs.gs = __KERNEL_STACK_CANARY; | ||
325 | #else | ||
326 | regs.ss = __KERNEL_DS; | ||
327 | #endif | ||
328 | |||
329 | regs.orig_ax = -1; | ||
330 | regs.ip = (unsigned long) kernel_thread_helper; | ||
331 | regs.cs = __KERNEL_CS | get_kernel_rpl(); | ||
332 | regs.flags = X86_EFLAGS_IF | X86_EFLAGS_BIT1; | ||
333 | |||
334 | /* Ok, create the new process.. */ | ||
335 | return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0, NULL, NULL); | ||
336 | } | ||
337 | EXPORT_SYMBOL(kernel_thread); | ||
338 | |||
339 | /* | ||
340 | * sys_execve() executes a new program. | 302 | * sys_execve() executes a new program. |
341 | */ | 303 | */ |
342 | long sys_execve(const char __user *name, | 304 | long sys_execve(const char __user *name, |