s390: fold execve_tail() into start_thread(), convert to generic sys_execve()
authorAl Viro <viro@zeniv.linux.org.uk>
Thu, 6 Sep 2012 19:48:11 +0000 (15:48 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Mon, 1 Oct 2012 03:03:02 +0000 (23:03 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
arch/s390/include/asm/processor.h
arch/s390/include/asm/unistd.h
arch/s390/kernel/compat_linux.c
arch/s390/kernel/compat_linux.h
arch/s390/kernel/compat_wrapper.S
arch/s390/kernel/entry.S
arch/s390/kernel/entry.h
arch/s390/kernel/entry64.S
arch/s390/kernel/process.c

index 11e4e3236937e106aba159b83e7cc6ae6167c7b0..0bc77619c3a345e747aa71700e04bba7bd87539a 100644 (file)
@@ -32,6 +32,7 @@ static inline void get_cpu_id(struct cpuid *ptr)
 extern void s390_adjust_jiffies(void);
 extern const struct seq_operations cpuinfo_op;
 extern int sysctl_ieee_emulation_warnings;
+extern void execve_tail(void);
 
 /*
  * User space process size: 2GB for 31 bit, 4TB or 8PT for 64 bit.
@@ -114,6 +115,7 @@ struct stack_frame {
        regs->psw.mask  = psw_user_bits | PSW_MASK_EA | PSW_MASK_BA;    \
        regs->psw.addr  = new_psw | PSW_ADDR_AMODE;                     \
        regs->gprs[15]  = new_stackp;                                   \
+       execve_tail();                                                  \
 } while (0)
 
 #define start_thread31(regs, new_psw, new_stackp) do {                 \
@@ -123,6 +125,7 @@ struct stack_frame {
        __tlb_flush_mm(current->mm);                                    \
        crst_table_downgrade(current->mm, 1UL << 31);                   \
        update_mm(current->mm, current);                                \
+       execve_tail();                                                  \
 } while (0)
 
 /* Forward declaration, a strange C thing */
index 6756e78f48082f1644f7a0d73cdeecaa5d193da5..9afacff38edc434d764ddb4979735ab7ead97d90 100644 (file)
 #   define __ARCH_WANT_COMPAT_SYS_TIME
 #   define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND
 # endif
+#define __ARCH_WANT_SYS_EXECVE
 
 /*
  * "Conditional" syscalls
index f606d935f4950dcbec6fca5f67b88ac70760dcda..d03d733dadfe5ba1e50a09e87c538c7da246433f 100644 (file)
@@ -420,32 +420,6 @@ sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t __user *uinfo)
        return ret;
 }
 
-/*
- * 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(const char __user *name, compat_uptr_t __user *argv,
-                            compat_uptr_t __user *envp)
-{
-       struct pt_regs *regs = task_pt_regs(current);
-       char *filename;
-       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));
-       rc = regs->gprs[2];
-out:
-       putname(filename);
-       return rc;
-}
-
 asmlinkage long sys32_pread64(unsigned int fd, char __user *ubuf,
                                size_t count, u32 poshi, u32 poslo)
 {
index 9635d759c2b9fbb107e39f326ff7b638bc353c36..5daff1d34b8e502919c62a2ad4a38a25fc216894 100644 (file)
@@ -193,8 +193,6 @@ 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(const 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 2d82cfcbce5b8cae9127aa115902fa6a2f3b5123..cf1d60f46922e1552a9533b1978b03413c6d3de3 100644 (file)
@@ -1576,7 +1576,7 @@ ENTRY(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
+       jg      compat_sys_execve       # branch to system call
 
 ENTRY(sys_fanotify_init_wrapper)
        llgfr   %r2,%r2                 # unsigned int
index 870bad6d56fc4fb7a5a9e308446148a7efec6633..6286985a103971adab9287e83df492f85f9f3c12 100644 (file)
@@ -368,8 +368,6 @@ ENTRY(kernel_execve)
        l       %r12,__LC_THREAD_INFO
        xc      __SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15)
        ssm     __LC_SVC_NEW_PSW        # reenable interrupts
-       l       %r1,BASED(.Lexecve_tail)
-       basr    %r14,%r1                # call execve_tail
        j       sysc_return
 
 /*
@@ -932,7 +930,6 @@ cleanup_idle_wait:
 .Ldo_notify_resume:    .long   do_notify_resume
 .Ldo_per_trap:         .long   do_per_trap
 .Ldo_execve:           .long   do_execve
-.Lexecve_tail:         .long   execve_tail
 .Ljump_table:          .long   pgm_check_table
 .Lschedule:            .long   schedule
 #ifdef CONFIG_PREEMPT
index a5f4dc42a5db18843e54972cfdfb28216a30daa2..d0d3f69a73463744edc3d3ec53fdd37dddd0adca 100644 (file)
@@ -58,9 +58,6 @@ long sys_fork(void);
 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(const char __user *name, const char __user *const __user *argv,
-               const char __user *const __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 349b7eeb348a9ee9b2f4aac83ae1c4be0a728a27..1f776f2edda57788d2e78fbe0ab6d8186ea36d83 100644 (file)
@@ -386,7 +386,6 @@ ENTRY(kernel_execve)
        lg      %r12,__LC_THREAD_INFO
        xc      __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15)
        ssm     __LC_SVC_NEW_PSW        # reenable interrupts
-       brasl   %r14,execve_tail
        j       sysc_return
 
 /*
index 733175373a4c6e9a95c204f30f47214d81351f73..e540251e1dd18fc3812cf16e267d9dc7a10895f0 100644 (file)
@@ -249,31 +249,6 @@ asmlinkage void execve_tail(void)
                asm volatile("sfpc %0,%0" : : "d" (0));
 }
 
-/*
- * sys_execve() executes a new program.
- */
-SYSCALL_DEFINE3(execve, const char __user *, name,
-               const char __user *const __user *, argv,
-               const char __user *const __user *, envp)
-{
-       struct pt_regs *regs = task_pt_regs(current);
-       char *filename;
-       long rc;
-
-       filename = getname(name);
-       rc = PTR_ERR(filename);
-       if (IS_ERR(filename))
-               return rc;
-       rc = do_execve(filename, argv, envp, regs);
-       if (rc)
-               goto out;
-       execve_tail();
-       rc = regs->gprs[2];
-out:
-       putname(filename);
-       return rc;
-}
-
 /*
  * fill in the FPU structure for a core dump.
  */