arm: introduce ret_from_kernel_execve(), switch to generic kernel_execve()
authorAl Viro <viro@zeniv.linux.org.uk>
Thu, 2 Aug 2012 07:46:39 +0000 (11:46 +0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Mon, 1 Oct 2012 02:21:36 +0000 (22:21 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
arch/arm/include/asm/unistd.h
arch/arm/kernel/entry-common.S
arch/arm/kernel/sys_arm.c

index 0cab47d4a83ff97a23c7a9d2975cfb855a687e3e..2c9b7a87e64b1597f4a568b4f2429714360dae27 100644 (file)
 #define __ARCH_WANT_OLD_READDIR
 #define __ARCH_WANT_SYS_SOCKETCALL
 #endif
+#define __ARCH_WANT_KERNEL_EXECVE
 
 /*
  * "Conditional" syscalls
index 9a48b7a577e72d80a8c25b95dfa6f6b75997a94a..4a6e46a9a3d7ab1d608f8f6bbd071df2c6eaf460 100644 (file)
@@ -103,6 +103,18 @@ ENTRY(ret_from_kernel_thread)
  UNWIND(.fnend)
 ENDPROC(ret_from_kernel_thread)
 
+/*
+ * turn a kernel thread into userland process
+ * use: ret_from_kernel_execve(struct pt_regs *normal)
+ */
+ENTRY(ret_from_kernel_execve)
+       mov     why, #0                 @ not a syscall
+       str     why, [r0, #S_R0]        @ ... and we want 0 in ->ARM_r0 as well
+       get_thread_info tsk             @ thread structure
+       mov     sp, r0                  @ stack pointer just under pt_regs
+       b       ret_slow_syscall
+ENDPROC(ret_from_kernel_execve)
+
        .equ NR_syscalls,0
 #define CALL(x) .equ NR_syscalls,NR_syscalls+1
 #include "calls.S"
index 3ba62e3cd1a23e6d7350512c8e9846222bbcbcb4..c8e729efc1872cc3c5921334bca3531f9a68b7b6 100644 (file)
@@ -79,48 +79,6 @@ out:
        return error;
 }
 
-int kernel_execve(const char *filename,
-                 const char *const argv[],
-                 const char *const envp[])
-{
-       struct pt_regs regs;
-       int ret;
-
-       memset(&regs, 0, sizeof(struct pt_regs));
-       ret = do_execve(filename,
-                       (const char __user *const __user *)argv,
-                       (const char __user *const __user *)envp, &regs);
-       if (ret < 0)
-               goto out;
-
-       /*
-        * Save argc to the register structure for userspace.
-        */
-       regs.ARM_r0 = ret;
-
-       /*
-        * We were successful.  We won't be returning to our caller, but
-        * instead to user space by manipulating the kernel stack.
-        */
-       asm(    "add    r0, %0, %1\n\t"
-               "mov    r1, %2\n\t"
-               "mov    r2, %3\n\t"
-               "bl     memmove\n\t"    /* copy regs to top of stack */
-               "mov    r8, #0\n\t"     /* not a syscall */
-               "mov    r9, %0\n\t"     /* thread structure */
-               "mov    sp, r0\n\t"     /* reposition stack pointer */
-               "b      ret_to_user"
-               :
-               : "r" (current_thread_info()),
-                 "Ir" (THREAD_START_SP - sizeof(regs)),
-                 "r" (&regs),
-                 "Ir" (sizeof(regs))
-               : "r0", "r1", "r2", "r3", "r8", "r9", "ip", "lr", "memory");
-
- out:
-       return ret;
-}
-
 /*
  * Since loff_t is a 64 bit type we avoid a lot of ABI hassle
  * with a different argument ordering.