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