From cbc53df0fa0726c6267978250c1f53bf9517bf39 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Fri, 17 Dec 2004 10:11:44 +0000 Subject: * 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 * 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. --- ChangeLog | 6 +++++ nptl/ChangeLog | 5 +++++ nptl/sysdeps/alpha/tcb-offsets.sym | 1 + nptl/sysdeps/unix/sysv/linux/alpha/clone.S | 2 ++ sysdeps/unix/sysv/linux/alpha/clone.S | 35 ++++++++++++++++++++++++++++-- 5 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 nptl/sysdeps/unix/sysv/linux/alpha/clone.S diff --git a/ChangeLog b/ChangeLog index 8849ecd9c0..d8ff129cc9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2004-12-17 Richard Henderson + + * 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 * sysdeps/sparc/sparc64/fpu/libm-test-ulps: Update. diff --git a/nptl/ChangeLog b/nptl/ChangeLog index 11858c38a6..0a6b1a4c92 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,3 +1,8 @@ +2004-12-17 Richard Henderson + + * sysdeps/unix/sysv/linux/alpha/clone.S: New file. + * sysdeps/alpha/tcb-offsets.sym (TID_OFFSET): New. + 2004-12-16 Ulrich Drepper * sysdeps/unix/sysv/linux/powerpc/powerpc64/bits/local_lim.h: New file. diff --git a/nptl/sysdeps/alpha/tcb-offsets.sym b/nptl/sysdeps/alpha/tcb-offsets.sym index ebd84f35e5..c21a791040 100644 --- a/nptl/sysdeps/alpha/tcb-offsets.sym +++ b/nptl/sysdeps/alpha/tcb-offsets.sym @@ -11,3 +11,4 @@ MULTIPLE_THREADS_OFFSET thread_offsetof (header.multiple_threads) PID_OFFSET thread_offsetof (pid) +TID_OFFSET thread_offsetof (tid) diff --git a/nptl/sysdeps/unix/sysv/linux/alpha/clone.S b/nptl/sysdeps/unix/sysv/linux/alpha/clone.S new file mode 100644 index 0000000000..eea1cbeed1 --- /dev/null +++ b/nptl/sysdeps/unix/sysv/linux/alpha/clone.S @@ -0,0 +1,2 @@ +#define RESET_PID +#include diff --git a/sysdeps/unix/sysv/linux/alpha/clone.S b/sysdeps/unix/sysv/linux/alpha/clone.S index b4766ec457..1c450d1737 100644 --- a/sysdeps/unix/sysv/linux/alpha/clone.S +++ b/sysdeps/unix/sysv/linux/alpha/clone.S @@ -24,6 +24,9 @@ #define _ERRNO_H 1 #include +#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) -- cgit v1.2.3