]> bbs.cooldavid.org Git - net-next-2.6.git/commitdiff
[S390] Convert sys_execve to function with parameters.
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Tue, 22 Sep 2009 20:58:42 +0000 (22:58 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Tue, 22 Sep 2009 20:58:43 +0000 (22:58 +0200)
Use function parameters instead of accessing the pt_regs structure
to get the parameters.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/kernel/compat_linux.c
arch/s390/kernel/compat_linux.h
arch/s390/kernel/compat_wrapper.S
arch/s390/kernel/entry.h
arch/s390/kernel/process.c
arch/s390/kernel/syscalls.S

index f741cd49111a2fabc68d39a5ae0881407a2794bf..05cf446e60b2f6a7c44373ae441570f17bd3403f 100644 (file)
@@ -443,31 +443,26 @@ sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t __user *uinfo)
  * sys32_execve() executes a new program after the asm stub has set
  * things up for us.  This should basically do what I want it to.
  */
-asmlinkage long sys32_execve(void)
+asmlinkage long sys32_execve(char __user *name, compat_uptr_t __user *argv,
+                            compat_uptr_t __user *envp)
 {
        struct pt_regs *regs = task_pt_regs(current);
        char *filename;
-       unsigned long result;
-       int rc;
-
-       filename = getname(compat_ptr(regs->orig_gpr2));
-       if (IS_ERR(filename)) {
-               result = PTR_ERR(filename);
-                goto out;
-       }
-       rc = compat_do_execve(filename, compat_ptr(regs->gprs[3]),
-                             compat_ptr(regs->gprs[4]), regs);
-       if (rc) {
-               result = rc;
-               goto out_putname;
-       }
+       long rc;
+
+       filename = getname(name);
+       rc = PTR_ERR(filename);
+       if (IS_ERR(filename))
+               return rc;
+       rc = compat_do_execve(filename, argv, envp, regs);
+       if (rc)
+               goto out;
        current->thread.fp_regs.fpc=0;
        asm volatile("sfpc %0,0" : : "d" (0));
-       result = regs->gprs[2];
-out_putname:
-        putname(filename);
+       rc = regs->gprs[2];
 out:
-       return result;
+       putname(filename);
+       return rc;
 }
 
 
index 7cceb67ff8a249e0fd200028ef22a384188e237f..c07f9ca05ade397082959750babd146f495a0a39 100644 (file)
@@ -198,7 +198,8 @@ long sys32_rt_sigprocmask(int how, compat_sigset_t __user *set,
                          compat_sigset_t __user *oset, size_t sigsetsize);
 long sys32_rt_sigpending(compat_sigset_t __user *set, size_t sigsetsize);
 long sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t __user *uinfo);
-long sys32_execve(void);
+long sys32_execve(char __user *name, compat_uptr_t __user *argv,
+                 compat_uptr_t __user *envp);
 long sys32_init_module(void __user *umod, unsigned long len,
                       const char __user *uargs);
 long sys32_delete_module(const char __user *name_user, unsigned int flags);
index 28f8440d2ec3be58d796d9d56c646a024483e5ec..8a6a7969c6233254d7cc9f32c79b521ecba17fe2 100644 (file)
@@ -1848,3 +1848,10 @@ sys_clone_wrapper:
        llgtr   %r4,%r4                 # int *
        llgtr   %r5,%r5                 # int *
        jg      sys_clone               # branch to system call
+
+       .globl  sys32_execve_wrapper
+sys32_execve_wrapper:
+       llgtr   %r2,%r2                 # char *
+       llgtr   %r3,%r3                 # compat_uptr_t *
+       llgtr   %r4,%r4                 # compat_uptr_t *
+       jg      sys32_execve            # branch to system call
index 91fd78839c57dfd57c20cf2380d31ad051dea4d4..e1e5e767ab56d1499e46aed54f420f218d7fa3aa 100644 (file)
@@ -46,7 +46,8 @@ long sys_clone(unsigned long newsp, unsigned long clone_flags,
               int __user *parent_tidptr, int __user *child_tidptr);
 long sys_vfork(void);
 void execve_tail(void);
-long sys_execve(void);
+long sys_execve(char __user *name, char __user * __user *argv,
+               char __user * __user *envp);
 long sys_sigsuspend(int history0, int history1, old_sigset_t mask);
 long sys_sigaction(int sig, const struct old_sigaction __user *act,
                   struct old_sigaction __user *oact);
index 189d978f76d63b7fefd0883a28eb7bca594e9970..59fe6ecc6ed33389fed8947f996b2a9cd5c39e6f 100644 (file)
@@ -32,6 +32,7 @@
 #include <linux/elfcore.h>
 #include <linux/kernel_stat.h>
 #include <linux/syscalls.h>
+#include <linux/compat.h>
 #include <asm/compat.h>
 #include <asm/uaccess.h>
 #include <asm/pgtable.h>
@@ -268,30 +269,25 @@ asmlinkage void execve_tail(void)
 /*
  * sys_execve() executes a new program.
  */
-SYSCALL_DEFINE0(execve)
+SYSCALL_DEFINE3(execve, char __user *, name, char __user * __user *, argv,
+               char __user * __user *, envp)
 {
        struct pt_regs *regs = task_pt_regs(current);
        char *filename;
-       unsigned long result;
-       int rc;
+       long rc;
 
-       filename = getname((char __user *) regs->orig_gpr2);
-       if (IS_ERR(filename)) {
-               result = PTR_ERR(filename);
+       filename = getname(name);
+       rc = PTR_ERR(filename);
+       if (IS_ERR(filename))
+               return rc;
+       rc = do_execve(filename, argv, envp, regs);
+       if (rc)
                goto out;
-       }
-       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);
+       rc = regs->gprs[2];
 out:
-       return result;
+       putname(filename);
+       return rc;
 }
 
 /*
index ff79d58e0eb393d8a89f76bff4271384b5f94001..062dd8f92377991a40490610908644e0cbfc6262 100644 (file)
@@ -19,7 +19,7 @@ SYSCALL(sys_restart_syscall,sys_restart_syscall,sys_restart_syscall)
 SYSCALL(sys_creat,sys_creat,sys32_creat_wrapper)
 SYSCALL(sys_link,sys_link,sys32_link_wrapper)
 SYSCALL(sys_unlink,sys_unlink,sys32_unlink_wrapper)            /* 10 */
-SYSCALL(sys_execve,sys_execve,sys32_execve)
+SYSCALL(sys_execve,sys_execve,sys32_execve_wrapper)
 SYSCALL(sys_chdir,sys_chdir,sys32_chdir_wrapper)
 SYSCALL(sys_time,sys_ni_syscall,sys32_time_wrapper)            /* old time syscall */
 SYSCALL(sys_mknod,sys_mknod,sys32_mknod_wrapper)