]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
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>
Thu, 6 Sep 2012 17:57:24 +0000 (13:57 -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 61ff145cab6ec849ded0335e33500cd22bc8d5ae..c89dff82375e03d86ac7d3cb9f9a8848059fa2dc 100644 (file)
@@ -663,6 +663,31 @@ kernel_thread:
        br      ret_to_kernel
 .end kernel_thread
 
+       .globl  ret_from_kernel_execve
+       .align  4
+       .ent    ret_from_kernel_execve
+ret_from_kernel_execve:
+       /*
+        * copy regs to normal position and off to userland we go...
+        * note that we are not guaranteed that we are deep enough
+        * in stack for current_pt_regs() not to overlap our stack
+        * frame; memcpy() would not be safe and we _must_ do
+        * everything starting from that memmove() in assembler.
+        * And we can't mangle $sp until after the call of memmove()
+        * either...
+        */
+       lda     $18, SIZEOF_PT_REGS
+       bsr     $26, memmove            !samegp
+
+       /* Take that over as our new stack frame and visit userland!  */
+       mov     $0, $sp
+       /* Avoid the HAE being gratuitously wrong, to avoid restoring it.  */
+       ldq     $2, alpha_mv+HAE_CACHE
+       stq     $2, 152($sp)            /* HAE */
+       br      $31, ret_to_user
+
+.end   ret_from_kernel_execve
+
 \f
 /*
  * Special system calls.  Most of these are special in that they either
index 145473909199d71106916eff579648d500312d0e..948094543b8accca79b1133d9bc96c4554960f8f 100644 (file)
@@ -434,22 +434,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);