diff options
Diffstat (limited to 'sysdeps/unix/sysv/linux/sparc/sparc32/clone.S')
-rw-r--r-- | sysdeps/unix/sysv/linux/sparc/sparc32/clone.S | 46 |
1 files changed, 17 insertions, 29 deletions
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S b/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S index f91fc4f629..66cdbf3ca7 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S @@ -24,7 +24,6 @@ #include <asm/errno.h> #include <asm/unistd.h> #include <tcb-offsets.h> -#include <sysdep.h> #define CLONE_VM 0x00000100 #define CLONE_THREAD 0x00010000 @@ -33,26 +32,19 @@ pid_t *ptid, void *tls, pid_t *ctid); */ .text -ENTRY (__clone) + .align 4 + .globl __clone + .type __clone,@function + +__clone: save %sp,-96,%sp - cfi_def_cfa_register(%fp) - cfi_window_save - cfi_register(%o7, %i7) /* sanity check arguments */ - orcc %i0,%g0,%g2 + tst %i0 be .Lerror orcc %i1,%g0,%o1 be .Lerror mov %i2,%o0 - - /* The child_stack is the top of the stack, allocate one - whole stack frame from that as this is what the kernel - expects. */ - sub %o1, 96, %o1 - mov %i3, %g3 - mov %i2, %g4 - /* ptid */ mov %i4,%o2 /* tls */ @@ -67,43 +59,39 @@ ENTRY (__clone) tst %o1 bne __thread_start nop - jmpl %i7 + 8, %g0 + ret restore %o0,%g0,%o0 .Lerror: call __errno_location or %g0,EINVAL,%i0 st %i0,[%o0] - jmpl %i7 + 8, %g0 + ret restore %g0,-1,%o0 -END(__clone) + + .size __clone, .-__clone .type __thread_start,@function -__thread_start: - cfi_startproc +__thread_start: #ifdef RESET_PID sethi %hi(CLONE_THREAD), %l0 - andcc %g4, %l0, %g0 + andcc %i2, %l0, %g0 bne 1f - andcc %g4, CLONE_VM, %g0 + andcc %i2, CLONE_VM, %g0 bne,a 2f mov -1,%o0 set __NR_getpid,%g1 ta 0x10 -2: - st %o0,[%g7 + PID] +2: st %o0,[%g7 + PID] st %o0,[%g7 + TID] 1: #endif - mov %g0, %fp /* terminate backtrace */ - call %g2 - mov %g3,%o0 + call %i0 + mov %i3,%o0 call _exit,0 nop - cfi_endproc - .size __thread_start, .-__thread_start -weak_alias (__clone, clone) +weak_alias(__clone, clone) |