parisc: switch to generic fork/vfork/clone
[deliverable/linux.git] / arch / parisc / kernel / process.c
index 38db36f64307a9bafa8db66db12e8403fc873f97..9753ecf49a06364ab2efa8e6fc32784461c4d52b 100644 (file)
@@ -202,46 +202,10 @@ int dump_task_fpu (struct task_struct *tsk, elf_fpregset_t *r)
        return 1;
 }
 
-/* Note that "fork()" is implemented in terms of clone, with
-   parameters (SIGCHLD, regs->gr[30], regs). */
-int
-sys_clone(unsigned long clone_flags, unsigned long usp,
-         struct pt_regs *regs)
-{
-       /* Arugments from userspace are:
-          r26 = Clone flags.
-          r25 = Child stack.
-          r24 = parent_tidptr.
-          r23 = Is the TLS storage descriptor 
-          r22 = child_tidptr 
-          
-          However, these last 3 args are only examined
-          if the proper flags are set. */
-       int __user *parent_tidptr = (int __user *)regs->gr[24];
-       int __user *child_tidptr  = (int __user *)regs->gr[22];
-
-       /* usp must be word aligned.  This also prevents users from
-        * passing in the value 1 (which is the signal for a special
-        * return for a kernel thread) */
-       usp = ALIGN(usp, 4);
-
-       /* A zero value for usp means use the current stack */
-       if (usp == 0)
-         usp = regs->gr[30];
-
-       return do_fork(clone_flags, usp, regs, 0, parent_tidptr, child_tidptr);
-}
-
-int
-sys_vfork(struct pt_regs *regs)
-{
-       return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->gr[30], regs, 0, NULL, NULL);
-}
-
 int
 copy_thread(unsigned long clone_flags, unsigned long usp,
            unsigned long arg,
-           struct task_struct *p, struct pt_regs *pregs)
+           struct task_struct *p, struct pt_regs *unused)
 {
        struct pt_regs * cregs = &(p->thread.regs);
        void *stack = task_stack_page(p);
@@ -278,7 +242,14 @@ copy_thread(unsigned long clone_flags, unsigned long usp,
                cregs->gr[25] = arg;
        } else {
                /* user thread */
-               cregs->gr[30] = usp;
+               /* usp must be word aligned.  This also prevents users from
+                * passing in the value 1 (which is the signal for a special
+                * return for a kernel thread) */
+               if (usp) {
+                       usp = ALIGN(usp, 4);
+                       if (likely(usp))
+                               cregs->gr[30] = usp;
+               }
                cregs->ksp = (unsigned long)stack + THREAD_SZ_ALGN + FRAME_SIZE;
                if (personality(p->personality) == PER_HPUX) {
 #ifdef CONFIG_HPUX
@@ -291,7 +262,7 @@ copy_thread(unsigned long clone_flags, unsigned long usp,
                }
                /* Setup thread TLS area from the 4th parameter in clone */
                if (clone_flags & CLONE_SETTLS)
-                       cregs->cr27 = pregs->gr[23];
+                       cregs->cr27 = cregs->gr[23];
        }
 
        return 0;
This page took 0.027519 seconds and 5 git commands to generate.