diff options
-rw-r--r-- | arch/x86/kernel/process.c | 35 | ||||
-rw-r--r-- | arch/x86/kernel/process_32.c | 36 | ||||
-rw-r--r-- | arch/x86/kernel/process_64.c | 36 |
3 files changed, 35 insertions, 72 deletions
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index f3c1a6b3a65e..8705ccedd447 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c | |||
@@ -243,6 +243,41 @@ sys_clone(unsigned long clone_flags, unsigned long newsp, | |||
243 | return do_fork(clone_flags, newsp, regs, 0, parent_tid, child_tid); | 243 | return do_fork(clone_flags, newsp, regs, 0, parent_tid, child_tid); |
244 | } | 244 | } |
245 | 245 | ||
246 | /* | ||
247 | * This gets run with %si containing the | ||
248 | * function to call, and %di containing | ||
249 | * the "args". | ||
250 | */ | ||
251 | extern void kernel_thread_helper(void); | ||
252 | |||
253 | /* | ||
254 | * Create a kernel thread | ||
255 | */ | ||
256 | int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags) | ||
257 | { | ||
258 | struct pt_regs regs; | ||
259 | |||
260 | memset(®s, 0, sizeof(regs)); | ||
261 | |||
262 | regs.si = (unsigned long) fn; | ||
263 | regs.di = (unsigned long) arg; | ||
264 | |||
265 | #ifdef CONFIG_X86_32 | ||
266 | regs.ds = __USER_DS; | ||
267 | regs.es = __USER_DS; | ||
268 | regs.fs = __KERNEL_PERCPU; | ||
269 | regs.gs = __KERNEL_STACK_CANARY; | ||
270 | #endif | ||
271 | |||
272 | regs.orig_ax = -1; | ||
273 | regs.ip = (unsigned long) kernel_thread_helper; | ||
274 | regs.cs = __KERNEL_CS | get_kernel_rpl(); | ||
275 | regs.flags = X86_EFLAGS_IF | 0x2; | ||
276 | |||
277 | /* Ok, create the new process.. */ | ||
278 | return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0, NULL, NULL); | ||
279 | } | ||
280 | EXPORT_SYMBOL(kernel_thread); | ||
246 | 281 | ||
247 | /* | 282 | /* |
248 | * sys_execve() executes a new program. | 283 | * sys_execve() executes a new program. |
diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c index f2e8b05a4f02..ccf234266a2e 100644 --- a/arch/x86/kernel/process_32.c +++ b/arch/x86/kernel/process_32.c | |||
@@ -192,42 +192,6 @@ void show_regs(struct pt_regs *regs) | |||
192 | show_trace(NULL, regs, ®s->sp, regs->bp); | 192 | show_trace(NULL, regs, ®s->sp, regs->bp); |
193 | } | 193 | } |
194 | 194 | ||
195 | /* | ||
196 | * This gets run with %si containing the | ||
197 | * function to call, and %di containing | ||
198 | * the "args". | ||
199 | */ | ||
200 | extern void kernel_thread_helper(void); | ||
201 | |||
202 | /* | ||
203 | * Create a kernel thread | ||
204 | */ | ||
205 | int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags) | ||
206 | { | ||
207 | struct pt_regs regs; | ||
208 | |||
209 | memset(®s, 0, sizeof(regs)); | ||
210 | |||
211 | regs.si = (unsigned long) fn; | ||
212 | regs.di = (unsigned long) arg; | ||
213 | |||
214 | #ifdef CONFIG_X86_32 | ||
215 | regs.ds = __USER_DS; | ||
216 | regs.es = __USER_DS; | ||
217 | regs.fs = __KERNEL_PERCPU; | ||
218 | regs.gs = __KERNEL_STACK_CANARY; | ||
219 | #endif | ||
220 | |||
221 | regs.orig_ax = -1; | ||
222 | regs.ip = (unsigned long) kernel_thread_helper; | ||
223 | regs.cs = __KERNEL_CS | get_kernel_rpl(); | ||
224 | regs.flags = X86_EFLAGS_IF | 0x2; | ||
225 | |||
226 | /* Ok, create the new process.. */ | ||
227 | return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0, NULL, NULL); | ||
228 | } | ||
229 | EXPORT_SYMBOL(kernel_thread); | ||
230 | |||
231 | void release_thread(struct task_struct *dead_task) | 195 | void release_thread(struct task_struct *dead_task) |
232 | { | 196 | { |
233 | BUG_ON(dead_task->mm); | 197 | BUG_ON(dead_task->mm); |
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) { |