Signed-off-by: Michael Walle <mich...@walle.cc>
---
 arch/lm32/kernel/process.c  |   29 --------------------------
 arch/lm32/kernel/sys_lm32.c |   47 ++++++++++++++++++++++++++++--------------
 2 files changed, 31 insertions(+), 45 deletions(-)

diff --git a/arch/lm32/kernel/process.c b/arch/lm32/kernel/process.c
index 73b29c0..65b7478 100644
--- a/arch/lm32/kernel/process.c
+++ b/arch/lm32/kernel/process.c
@@ -161,29 +161,6 @@ void flush_thread(void)
        set_fs(USER_DS);
 }
 
-
-/*
- * sys_execve() executes a new program.
- */
-asmlinkage int sys_execve(const char __user *name,
-                         const char __user *const __user *argv,
-                         const char __user *const __user *envp, struct 
pt_regs* regs)
-{
-       int error;
-       char * filename;
-
-       lock_kernel();
-       filename = getname(name);
-       error = PTR_ERR(filename);
-       if (IS_ERR(filename))
-               goto out;
-       error = do_execve(filename, argv, envp, regs);
-       putname(filename);
-out:
-       unlock_kernel();
-       return error;
-}
-
 /* no stack unwinding */
 unsigned long get_wchan(struct task_struct *p)
 {
@@ -283,18 +260,12 @@ int copy_thread(unsigned long clone_flags,
 /* start userspace thread */
 void start_thread(struct pt_regs * regs, unsigned long pc, unsigned long usp)
 {
-       unsigned long *stack;
-
        set_fs(USER_DS);
 
        memset(regs, 0, sizeof(regs));
 
-       stack = (unsigned long *)usp;
        /* -4 because we will add 4 later in ret_from_syscall */
        regs->ea = pc - 4;
-       regs->r1 = stack[0];
-       regs->r2 = stack[1];
-       regs->r3 = stack[2];
 #ifdef CONFIG_BINFMT_ELF_FDPIC
        regs->r7 = current->mm->context.exec_fdpic_loadmap;
 #endif
diff --git a/arch/lm32/kernel/sys_lm32.c b/arch/lm32/kernel/sys_lm32.c
index 2316e8a..430e76a 100644
--- a/arch/lm32/kernel/sys_lm32.c
+++ b/arch/lm32/kernel/sys_lm32.c
@@ -56,30 +56,45 @@ sys_mmap(unsigned long addr, unsigned long len, unsigned 
long prot,
        return sys_mmap_pgoff(addr, len, prot, flags, fd, offset >> PAGE_SHIFT);
 }
 
+asmlinkage int lm32_execve(const char __user *ufilename,
+                           const char __user *const __user *uargv,
+                           const char __user *const __user *uenvp,
+                           struct pt_regs *regs)
+{
+       int error;
+       char *filename;
+
+       filename = getname(ufilename);
+       error = PTR_ERR(filename);
+       if (IS_ERR(filename))
+               goto out;
+
+       error = do_execve(filename, uargv, uenvp, regs);
+       putname(filename);
+out:
+       return error;
+}
+
 int kernel_execve(const char *filename, const char *const argv[], const char 
*const envp[])
 {
-    register unsigned int  r_syscall   asm("r8") = __NR_execve; 
-    register long          r_a          asm("r1") = (unsigned long)filename; 
-    register long          r_b          asm("r2") = (unsigned long)argv; 
-    register long          r_c          asm("r3") = (unsigned long)envp; 
-             long          __res; 
-
-    asm volatile ( "scall\n" 
-                  "mv %0, r1\n" 
-                  : "=r"(__res) 
-                  : "r"(r_syscall), 
-                    "r"(r_a), "r"(r_b), "r"(r_c) );
-
-    if(__res >=(unsigned long) -4095) {
-      __res = (unsigned long) -1;
+    register unsigned long _r8 asm("r8") = __NR_execve; 
+    register unsigned long _r1 asm("r1") = (unsigned long)filename; 
+    register unsigned long _r2 asm("r2") = (unsigned long)argv; 
+    register unsigned long _r3 asm("r3") = (unsigned long)envp; 
+
+       __asm__ __volatile__ ("scall\n"
+                       : "=r"(_r1)
+                       : "r"(_r8),
+                         "0"(_r1), "r"(_r2), "r"(_r3) );
+
+    if(_r1 >=(unsigned long) -4095) {
+      _r1 = (unsigned long) -1;
     }
-    return (long) __res;
+
+    return (int) _r1;
 }
 EXPORT_SYMBOL(kernel_execve);
 
-
-extern asmlinkage int sys_execve(char *name, char **argv, char **envp, struct 
pt_regs* regs);
-
 asmlinkage int sys_lm32_vfork(struct pt_regs *regs, unsigned long 
ra_in_syscall)
 {
        int ret;
-- 
1.7.2.3

_______________________________________________
http://lists.milkymist.org/listinfo.cgi/devel-milkymist.org
IRC: #milkymist@Freenode
Twitter: www.twitter.com/milkymistvj
Ideas? http://milkymist.uservoice.com

Reply via email to