On Sun, Aug 27, 2006 at 11:47:37PM +0200, Arnd Bergmann wrote:

> This adds the new kernel_execve function on all architectures
> that were using _syscall3() to implement execve.
> 
> The implementation uses code from the _syscall3 macros provided
> in the unistd.h header file. I don't have cross-compilers for
> any of these architectures, so the patch is untested with the
> exception of i386.
> 
> Most architectures can probably implement this in a nicer way
> in assembly or by combining it with the sys_execve implementation
> itself, but this should do it for now.
> 
> Signed-off-by: Arnd Bergmann <[EMAIL PROTECTED]>

Two bugs in your MIPS version of kernel_execve(); the inline asm which
was copying from _syscall3 macro was still using the #stringify
operation.  It also didn't get the result return in case of errors
right - $a3 = 1 indicates an error in which case $v0 will contain the
positive error number.

Signed-off-by: Ralf Baechle <[EMAIL PROTECTED]>

diff --git a/arch/mips/kernel/syscall.c b/arch/mips/kernel/syscall.c
index 0721314..b73b26c 100644
--- a/arch/mips/kernel/syscall.c
+++ b/arch/mips/kernel/syscall.c
@@ -399,3 +399,32 @@ asmlinkage void bad_stack(void)
 {
        do_exit(SIGSEGV);
 }
+
+/*
+ * Do a system call from kernel instead of calling sys_execve so we
+ * end up with proper pt_regs.
+ */
+int kernel_execve(const char *filename, char *const argv[], char *const envp[])
+{
+       register unsigned long __a0 asm("$4") = (unsigned long) filename;
+       register unsigned long __a1 asm("$5") = (unsigned long) argv;
+       register unsigned long __a2 asm("$6") = (unsigned long) envp;
+       register unsigned long __a3 asm("$7");
+       unsigned long __v0;
+
+       __asm__ volatile ("                                     \n"
+       "       .set    noreorder                               \n"
+       "       li      $2, %5          # __NR_execve           \n"
+       "       syscall                                         \n"
+       "       move    %0, $2                                  \n"
+       "       .set    reorder                                 \n"
+       : "=&r" (__v0), "=r" (__a3)
+       : "r" (__a0), "r" (__a1), "r" (__a2), "i" (__NR_execve)
+       : "$2", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24",
+         "memory");
+
+       if (__a3 == 0)
+               return __v0;
+
+       return -__v0;
+}
-
To unsubscribe from this list: send the line "unsubscribe linux-arch" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to