diff options
Diffstat (limited to 'arch/x86/kernel/process_64.c')
| -rw-r--r-- | arch/x86/kernel/process_64.c | 36 | 
1 files changed, 0 insertions, 36 deletions
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index d49a9094f6f3..1a362c5bec37 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c  | |||
| @@ -229,42 +229,6 @@ void show_regs(struct pt_regs *regs) | |||
| 229 | show_trace(NULL, regs, (void *)(regs + 1), regs->bp); | 229 | show_trace(NULL, regs, (void *)(regs + 1), regs->bp); | 
| 230 | } | 230 | } | 
| 231 | 231 | ||
| 232 | /* | ||
| 233 | * This gets run with %si containing the | ||
| 234 | * function to call, and %di containing | ||
| 235 | * the "args". | ||
| 236 | */ | ||
| 237 | extern void kernel_thread_helper(void); | ||
| 238 | |||
| 239 | /* | ||
| 240 | * Create a kernel thread | ||
| 241 | */ | ||
| 242 | int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags) | ||
| 243 | { | ||
| 244 | struct pt_regs regs; | ||
| 245 | |||
| 246 | memset(®s, 0, sizeof(regs)); | ||
| 247 | |||
| 248 | regs.si = (unsigned long) fn; | ||
| 249 | regs.di = (unsigned long) arg; | ||
| 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 | |||
| 258 | regs.orig_ax = -1; | ||
| 259 | regs.ip = (unsigned long) kernel_thread_helper; | ||
| 260 | regs.cs = __KERNEL_CS | get_kernel_rpl(); | ||
| 261 | regs.flags = X86_EFLAGS_IF | 0x2; | ||
| 262 | |||
| 263 | /* Ok, create the new process.. */ | ||
| 264 | return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0, NULL, NULL); | ||
| 265 | } | ||
| 266 | EXPORT_SYMBOL(kernel_thread); | ||
| 267 | |||
| 268 | void release_thread(struct task_struct *dead_task) | 232 | void release_thread(struct task_struct *dead_task) | 
| 269 | { | 233 | { | 
| 270 | if (dead_task->mm) { | 234 | if (dead_task->mm) { | 
