diff options
author | Jakub Jelinek <jakub@redhat.com> | 2007-07-12 18:26:36 +0000 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2007-07-12 18:26:36 +0000 |
commit | 0ecb606cb6cf65de1d9fc8a919bceb4be476c602 (patch) | |
tree | 2ea1f8305970753e4a657acb2ccc15ca3eec8e2c /sysdeps/unix/sysv/linux/sparc/sparc32/clone.S | |
parent | 7d58530341304d403a6626d7f7a1913165fe2f32 (diff) | |
download | glibc-0ecb606cb6cf65de1d9fc8a919bceb4be476c602.tar glibc-0ecb606cb6cf65de1d9fc8a919bceb4be476c602.tar.gz glibc-0ecb606cb6cf65de1d9fc8a919bceb4be476c602.tar.bz2 glibc-0ecb606cb6cf65de1d9fc8a919bceb4be476c602.zip |
2.5-18.1
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, 29 insertions, 17 deletions
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S b/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S index 66cdbf3ca7..f91fc4f629 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S @@ -24,6 +24,7 @@ #include <asm/errno.h> #include <asm/unistd.h> #include <tcb-offsets.h> +#include <sysdep.h> #define CLONE_VM 0x00000100 #define CLONE_THREAD 0x00010000 @@ -32,19 +33,26 @@ pid_t *ptid, void *tls, pid_t *ctid); */ .text - .align 4 - .globl __clone - .type __clone,@function - -__clone: +ENTRY (__clone) save %sp,-96,%sp + cfi_def_cfa_register(%fp) + cfi_window_save + cfi_register(%o7, %i7) /* sanity check arguments */ - tst %i0 + orcc %i0,%g0,%g2 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 */ @@ -59,39 +67,43 @@ __clone: tst %o1 bne __thread_start nop - ret + jmpl %i7 + 8, %g0 restore %o0,%g0,%o0 .Lerror: call __errno_location or %g0,EINVAL,%i0 st %i0,[%o0] - ret + jmpl %i7 + 8, %g0 restore %g0,-1,%o0 - - .size __clone, .-__clone +END(__clone) .type __thread_start,@function - __thread_start: + cfi_startproc + #ifdef RESET_PID sethi %hi(CLONE_THREAD), %l0 - andcc %i2, %l0, %g0 + andcc %g4, %l0, %g0 bne 1f - andcc %i2, CLONE_VM, %g0 + andcc %g4, 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 - call %i0 - mov %i3,%o0 + mov %g0, %fp /* terminate backtrace */ + call %g2 + mov %g3,%o0 call _exit,0 nop + cfi_endproc + .size __thread_start, .-__thread_start -weak_alias(__clone, clone) +weak_alias (__clone, clone) |