mirror of
https://sourceware.org/git/glibc.git
synced 2025-01-03 00:10:10 +00:00
* sysdeps/unix/sysv/linux/alpha/clone.S (__clone): Add support for NPTL where the PID is stored at userlevel and needs to be reset when CLONE_THREAD is not used. nptl/ * sysdeps/unix/sysv/linux/alpha/clone.S: New file. * sysdeps/alpha/tcb-offsets.sym (TID_OFFSET): New.
2004-12-17 Richard Henderson <rth@redhat.com> * sysdeps/unix/sysv/linux/alpha/clone.S (__clone): Add support for NPTL where the PID is stored at userlevel and needs to be reset when CLONE_THREAD is not used.
This commit is contained in:
parent
9b7adbb732
commit
cbc53df0fa
@ -1,3 +1,9 @@
|
||||
2004-12-17 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* sysdeps/unix/sysv/linux/alpha/clone.S (__clone): Add support
|
||||
for NPTL where the PID is stored at userlevel and needs to be
|
||||
reset when CLONE_THREAD is not used.
|
||||
|
||||
2004-12-17 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* sysdeps/sparc/sparc64/fpu/libm-test-ulps: Update.
|
||||
|
@ -1,3 +1,8 @@
|
||||
2004-12-17 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* sysdeps/unix/sysv/linux/alpha/clone.S: New file.
|
||||
* sysdeps/alpha/tcb-offsets.sym (TID_OFFSET): New.
|
||||
|
||||
2004-12-16 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* sysdeps/unix/sysv/linux/powerpc/powerpc64/bits/local_lim.h: New file.
|
||||
|
@ -11,3 +11,4 @@
|
||||
|
||||
MULTIPLE_THREADS_OFFSET thread_offsetof (header.multiple_threads)
|
||||
PID_OFFSET thread_offsetof (pid)
|
||||
TID_OFFSET thread_offsetof (tid)
|
||||
|
2
nptl/sysdeps/unix/sysv/linux/alpha/clone.S
Normal file
2
nptl/sysdeps/unix/sysv/linux/alpha/clone.S
Normal file
@ -0,0 +1,2 @@
|
||||
#define RESET_PID
|
||||
#include <sysdeps/unix/sysv/linux/alpha/clone.S>
|
@ -24,6 +24,9 @@
|
||||
#define _ERRNO_H 1
|
||||
#include <bits/errno.h>
|
||||
|
||||
#define CLONE_VM 0x00000100
|
||||
#define CLONE_THREAD 0x00010000
|
||||
|
||||
/* int clone(int (*fn)(void *arg), void *child_stack, int flags,
|
||||
void *arg, pid_t *ptid, void *tls, pid_t *ctid);
|
||||
|
||||
@ -51,9 +54,12 @@ ENTRY(__clone)
|
||||
beq a1,$error /* no NULL stack pointers */
|
||||
|
||||
/* Save the fn ptr and arg on the new stack. */
|
||||
subq a1,16,a1
|
||||
subq a1,32,a1
|
||||
stq a0,0(a1)
|
||||
stq a3,8(a1)
|
||||
#ifdef RESET_PID
|
||||
stq a2,16(a1)
|
||||
#endif
|
||||
|
||||
/* The syscall is of the form clone(flags, usp, ptid, ctid, tls).
|
||||
Shift the flags, ptid, ctid, tls arguments into place; the
|
||||
@ -93,10 +99,19 @@ thread_start:
|
||||
mov 0, fp
|
||||
.prologue 0
|
||||
|
||||
#ifdef RESET_PID
|
||||
/* Check and see if we need to reset the PID. */
|
||||
ldq t0,16(sp)
|
||||
lda t1,CLONE_THREAD
|
||||
and t0,t1,t2
|
||||
beq t2,2f
|
||||
1:
|
||||
#endif
|
||||
|
||||
/* Load up the arguments. */
|
||||
ldq pv,0(sp)
|
||||
ldq a0,8(sp)
|
||||
addq sp,16,sp
|
||||
addq sp,32,sp
|
||||
|
||||
/* Call the user's function. */
|
||||
jsr ra,(pv)
|
||||
@ -113,6 +128,22 @@ thread_start:
|
||||
/* Die horribly. */
|
||||
halt
|
||||
|
||||
#ifdef RESET_PID
|
||||
2:
|
||||
rduniq
|
||||
lda t1, CLONE_VM
|
||||
mov v0, s0
|
||||
lda v0, -1
|
||||
and t0, t1, t2
|
||||
bne t2, 3f
|
||||
lda v0, __NR_getxpid
|
||||
callsys
|
||||
3:
|
||||
stl v0, PID_OFFSET(s0)
|
||||
stl v0, TID_OFFSET(s0)
|
||||
br 1b
|
||||
#endif
|
||||
|
||||
.end thread_start
|
||||
|
||||
weak_alias(__clone, clone)
|
||||
|
Loading…
Reference in New Issue
Block a user