sparc64: switch to generic kernel_execve()
authorAl Viro <viro@zeniv.linux.org.uk>
Wed, 26 Sep 2012 23:28:00 +0000 (19:28 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sun, 14 Oct 2012 23:26:53 +0000 (19:26 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
arch/sparc/Kconfig
arch/sparc/kernel/sys_sparc_64.c
arch/sparc/kernel/syscalls.S

index ab8bd62b8dbe7ef981362cc12414eab25d722295..e47eb324d77a3fdf36074d82750351c971aa9c01 100644 (file)
@@ -75,6 +75,7 @@ config SPARC64
        select HAVE_C_RECORDMCOUNT
        select NO_BOOTMEM
        select GENERIC_KERNEL_THREAD
+       select GENERIC_KERNEL_EXECVE
 
 config ARCH_DEFCONFIG
        string
index 11c6c9603e71f03995a3c17fcdf2f28957d7fa43..adfe60ece05f5e2c7b5fa810ed29a9041f44ad87 100644 (file)
@@ -729,25 +729,3 @@ SYSCALL_DEFINE5(rt_sigaction, int, sig, const struct sigaction __user *, act,
 
        return ret;
 }
-
-/*
- * 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,
-                 const char *const argv[],
-                 const char *const envp[])
-{
-       long __res;
-       register long __g1 __asm__ ("g1") = __NR_execve;
-       register long __o0 __asm__ ("o0") = (long)(filename);
-       register long __o1 __asm__ ("o1") = (long)(argv);
-       register long __o2 __asm__ ("o2") = (long)(envp);
-       asm volatile ("t 0x6d\n\t"
-                     "sub %%g0, %%o0, %0\n\t"
-                     "movcc %%xcc, %%o0, %0\n\t"
-                     : "=r" (__res), "=&r" (__o0)
-                     : "1" (__o0), "r" (__o1), "r" (__o2), "r" (__g1)
-                     : "cc");
-       return __res;
-}
index 624f34162c38a39c886628e6770afff626d909dd..f72c12433869c641d1c2787a33b477e7eb118972 100644 (file)
@@ -115,13 +115,13 @@ ret_from_syscall:
        call    schedule_tail
         mov    %g7, %o0
        ldx     [%sp + PTREGS_OFF + PT_V9_I0], %o0
-       brnz,a,pt       %o0, ret_sys_call
+       brnz,pt %o0, ret_sys_call
         ldx    [%g6 + TI_FLAGS], %l0
-       ldx     [%sp + PTREGS_OFF + PT_V9_G1], %l0
-       call    %l0
+       ldx     [%sp + PTREGS_OFF + PT_V9_G1], %l1
+       call    %l1
         ldx    [%sp + PTREGS_OFF + PT_V9_G2], %o0
-       call    do_exit ! will not return
-        mov    0,%o0
+       ba,pt   %xcc, ret_sys_call
+        mov    0, %o0
 
        .globl  sparc_exit
        .type   sparc_exit,#function