aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/process_32.c
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2009-12-15 14:33:22 -0500
committerIngo Molnar <mingo@elte.hu>2009-12-15 14:33:28 -0500
commitab1eebe77dd08b26585860d534e07810d1cd274d (patch)
tree92b1ff0952cbdeef34922c43ff7eaac2162e77c4 /arch/x86/kernel/process_32.c
parent186a25026c44d1bfa97671110ff14dcd0c99678e (diff)
parentdf59e7bf439918f523ac29e996ec1eebbed60440 (diff)
Merge branch 'x86/asm' into x86/urgent
Merge reason: it's stable so lets push it upstream. Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/kernel/process_32.c')
-rw-r--r--arch/x86/kernel/process_32.c73
1 files changed, 0 insertions, 73 deletions
diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c
index 120b88797a75..9c517b5858f0 100644
--- a/arch/x86/kernel/process_32.c
+++ b/arch/x86/kernel/process_32.c
@@ -180,39 +180,6 @@ void show_regs(struct pt_regs *regs)
180 show_trace(NULL, regs, &regs->sp, regs->bp); 180 show_trace(NULL, regs, &regs->sp, regs->bp);
181} 181}
182 182
183/*
184 * This gets run with %bx containing the
185 * function to call, and %dx containing
186 * the "args".
187 */
188extern void kernel_thread_helper(void);
189
190/*
191 * Create a kernel thread
192 */
193int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags)
194{
195 struct pt_regs regs;
196
197 memset(&regs, 0, sizeof(regs));
198
199 regs.bx = (unsigned long) fn;
200 regs.dx = (unsigned long) arg;
201
202 regs.ds = __USER_DS;
203 regs.es = __USER_DS;
204 regs.fs = __KERNEL_PERCPU;
205 regs.gs = __KERNEL_STACK_CANARY;
206 regs.orig_ax = -1;
207 regs.ip = (unsigned long) kernel_thread_helper;
208 regs.cs = __KERNEL_CS | get_kernel_rpl();
209 regs.flags = X86_EFLAGS_IF | X86_EFLAGS_SF | X86_EFLAGS_PF | 0x2;
210
211 /* Ok, create the new process.. */
212 return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, &regs, 0, NULL, NULL);
213}
214EXPORT_SYMBOL(kernel_thread);
215
216void release_thread(struct task_struct *dead_task) 183void release_thread(struct task_struct *dead_task)
217{ 184{
218 BUG_ON(dead_task->mm); 185 BUG_ON(dead_task->mm);
@@ -424,46 +391,6 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
424 return prev_p; 391 return prev_p;
425} 392}
426 393
427int sys_clone(struct pt_regs *regs)
428{
429 unsigned long clone_flags;
430 unsigned long newsp;
431 int __user *parent_tidptr, *child_tidptr;
432
433 clone_flags = regs->bx;
434 newsp = regs->cx;
435 parent_tidptr = (int __user *)regs->dx;
436 child_tidptr = (int __user *)regs->di;
437 if (!newsp)
438 newsp = regs->sp;
439 return do_fork(clone_flags, newsp, regs, 0, parent_tidptr, child_tidptr);
440}
441
442/*
443 * sys_execve() executes a new program.
444 */
445int sys_execve(struct pt_regs *regs)
446{
447 int error;
448 char *filename;
449
450 filename = getname((char __user *) regs->bx);
451 error = PTR_ERR(filename);
452 if (IS_ERR(filename))
453 goto out;
454 error = do_execve(filename,
455 (char __user * __user *) regs->cx,
456 (char __user * __user *) regs->dx,
457 regs);
458 if (error == 0) {
459 /* Make sure we don't return using sysenter.. */
460 set_thread_flag(TIF_IRET);
461 }
462 putname(filename);
463out:
464 return error;
465}
466
467#define top_esp (THREAD_SIZE - sizeof(unsigned long)) 394#define top_esp (THREAD_SIZE - sizeof(unsigned long))
468#define top_ebp (THREAD_SIZE - 2*sizeof(unsigned long)) 395#define top_ebp (THREAD_SIZE - 2*sizeof(unsigned long))
469 396