alpha: introduce ret_from_kernel_execve(), switch to generic kernel_execve()
authorAl Viro <viro@zeniv.linux.org.uk>
Fri, 1 Jun 2012 02:22:52 +0000 (22:22 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Mon, 1 Oct 2012 02:53:31 +0000 (22:53 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
arch/alpha/include/asm/unistd.h
arch/alpha/kernel/entry.S
arch/alpha/kernel/process.c

index 7826e227e4d09003ffb230c1596143f74539d607..3cb6c1188984f0e9de8816d420a9a9e55fe1f93d 100644 (file)
 #define __ARCH_WANT_SYS_SIGPENDING
 #define __ARCH_WANT_SYS_RT_SIGSUSPEND
 #define __ARCH_WANT_SYS_EXECVE
+#define __ARCH_WANT_KERNEL_EXECVE
 
 /* "Conditional" syscalls.  What we want is
 
index 421dccf273eb5c323607c4204064608795274b11..7e43e1156d10c98c4d360f238255e7f573ec6924 100644 (file)
@@ -626,6 +626,19 @@ ret_from_kernel_thread:
        jmp     $31, sys_exit
 .end ret_from_kernel_thread
 
+       .globl  ret_from_kernel_execve
+       .align  4
+       .ent    ret_from_kernel_execve
+ret_from_kernel_execve:
+       mov     $16, $sp
+       /* Avoid the HAE being gratuitously wrong, to avoid restoring it.  */
+       ldq     $2, alpha_mv+HAE_CACHE
+       stq     $2, 152($sp)            /* HAE */
+       mov     $31, $19                /* to disable syscall restarts */
+       br      $31, ret_to_user
+
+.end   ret_from_kernel_execve
+
 \f
 /*
  * Special system calls.  Most of these are special in that they either
index 6b33ecdbc534b4f3324b430344bfab2ad003de37..f47d764eaa11f8f387ced58725fb8000e99bda39 100644 (file)
@@ -435,22 +435,3 @@ get_wchan(struct task_struct *p)
        }
        return pc;
 }
-
-int kernel_execve(const char *path, const char *const argv[], const char *const envp[])
-{
-       /* Avoid the HAE being gratuitously wrong, which would cause us
-          to do the whole turn off interrupts thing and restore it.  */
-       struct pt_regs regs = {.hae = alpha_mv.hae_cache};
-       int err = do_execve(path, argv, envp, &regs);
-       if (!err) {
-               struct pt_regs *p = current_pt_regs();
-               /* copy regs to normal position and off to userland we go... */
-               *p = regs;
-               __asm__ __volatile__ (
-                       "mov    %0, $sp;"
-                       "br     $31, ret_from_sys_call"
-                       : : "r"(p));
-       }
-       return err;
-}
-EXPORT_SYMBOL(kernel_execve);