Merge master.kernel.org:/pub/scm/linux/kernel/git/herbert/crypto-2.6
[linux-drm-fsl-dcu.git] / arch / s390 / kernel / process.c
index 5acfac654f9d7867463e4378b6e7e955bdc5b9ad..eb43c3b31269c64fe7da6f04f8a99bc53c82d2b2 100644 (file)
@@ -22,7 +22,6 @@
 #include <linux/kernel.h>
 #include <linux/mm.h>
 #include <linux/smp.h>
-#include <linux/smp_lock.h>
 #include <linux/stddef.h>
 #include <linux/unistd.h>
 #include <linux/ptrace.h>
@@ -280,24 +279,26 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long new_stackp,
         return 0;
 }
 
-asmlinkage long sys_fork(struct pt_regs regs)
+asmlinkage long sys_fork(void)
 {
-       return do_fork(SIGCHLD, regs.gprs[15], &regs, 0, NULL, NULL);
+       struct pt_regs *regs = task_pt_regs(current);
+       return do_fork(SIGCHLD, regs->gprs[15], regs, 0, NULL, NULL);
 }
 
-asmlinkage long sys_clone(struct pt_regs regs)
+asmlinkage long sys_clone(void)
 {
-        unsigned long clone_flags;
-        unsigned long newsp;
+       struct pt_regs *regs = task_pt_regs(current);
+       unsigned long clone_flags;
+       unsigned long newsp;
        int __user *parent_tidptr, *child_tidptr;
 
-        clone_flags = regs.gprs[3];
-        newsp = regs.orig_gpr2;
-       parent_tidptr = (int __user *) regs.gprs[4];
-       child_tidptr = (int __user *) regs.gprs[5];
-        if (!newsp)
-                newsp = regs.gprs[15];
-        return do_fork(clone_flags, newsp, &regs, 0,
+       clone_flags = regs->gprs[3];
+       newsp = regs->orig_gpr2;
+       parent_tidptr = (int __user *) regs->gprs[4];
+       child_tidptr = (int __user *) regs->gprs[5];
+       if (!newsp)
+               newsp = regs->gprs[15];
+       return do_fork(clone_flags, newsp, regs, 0,
                       parent_tidptr, child_tidptr);
 }
 
@@ -311,40 +312,52 @@ asmlinkage long sys_clone(struct pt_regs regs)
  * do not have enough call-clobbered registers to hold all
  * the information you need.
  */
-asmlinkage long sys_vfork(struct pt_regs regs)
+asmlinkage long sys_vfork(void)
 {
+       struct pt_regs *regs = task_pt_regs(current);
        return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD,
-                      regs.gprs[15], &regs, 0, NULL, NULL);
+                      regs->gprs[15], regs, 0, NULL, NULL);
+}
+
+asmlinkage void execve_tail(void)
+{
+       task_lock(current);
+       current->ptrace &= ~PT_DTRACE;
+       task_unlock(current);
+       current->thread.fp_regs.fpc = 0;
+       if (MACHINE_HAS_IEEE)
+               asm volatile("sfpc %0,%0" : : "d" (0));
 }
 
 /*
  * sys_execve() executes a new program.
  */
-asmlinkage long sys_execve(struct pt_regs regs)
+asmlinkage long sys_execve(void)
 {
-        int error;
-        char * filename;
-
-        filename = getname((char __user *) regs.orig_gpr2);
-        error = PTR_ERR(filename);
-        if (IS_ERR(filename))
-                goto out;
-        error = do_execve(filename, (char __user * __user *) regs.gprs[3],
-                         (char __user * __user *) regs.gprs[4], &regs);
-       if (error == 0) {
-               task_lock(current);
-               current->ptrace &= ~PT_DTRACE;
-               task_unlock(current);
-               current->thread.fp_regs.fpc = 0;
-               if (MACHINE_HAS_IEEE)
-                       asm volatile("sfpc %0,%0" : : "d" (0));
+       struct pt_regs *regs = task_pt_regs(current);
+       char *filename;
+       unsigned long result;
+       int rc;
+
+       filename = getname((char __user *) regs->orig_gpr2);
+       if (IS_ERR(filename)) {
+               result = PTR_ERR(filename);
+               goto out;
        }
-        putname(filename);
+       rc = do_execve(filename, (char __user * __user *) regs->gprs[3],
+                      (char __user * __user *) regs->gprs[4], regs);
+       if (rc) {
+               result = rc;
+               goto out_putname;
+       }
+       execve_tail();
+       result = regs->gprs[2];
+out_putname:
+       putname(filename);
 out:
-        return error;
+       return result;
 }
 
-
 /*
  * fill in the FPU structure for a core dump.
  */