From 1f9d7c2739c9442d07c5578920824abb4a3bf509 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Wed, 15 Dec 2004 07:04:50 +0000 Subject: [PATCH] Update. 2004-12-14 Ulrich Drepper * sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S: Add support for pid caching in nptl. --- ChangeLog | 5 ++++ nptl/ChangeLog | 8 +++++ nptl/sysdeps/powerpc/tcb-offsets.sym | 1 + .../unix/sysv/linux/powerpc/powerpc64/clone.S | 3 ++ .../unix/sysv/linux/powerpc/powerpc64/clone.S | 30 +++++++++++++++++-- 5 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S diff --git a/ChangeLog b/ChangeLog index 176a08920d..35a3ac1e7c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2004-12-14 Ulrich Drepper + + * sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S: Add support + for pid caching in nptl. + 2004-10-18 Maciej W. Rozycki * sysdeps/unix/sysv/linux/mips/bits/socket.h (__cmsg_nxthdr): Use diff --git a/nptl/ChangeLog b/nptl/ChangeLog index f779bd4968..e44a856c13 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,3 +1,11 @@ +2004-12-14 Ulrich Drepper + + * sysdeps/powerpc/tcb-offsets.sym: Add TID. + * sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S: New file. + + * tst-getpid1.c: If child crashes, report this first. Print which + signal. + 2004-12-09 Ulrich Drepper * init.c (__pthread_initialize_minimal_internal): Also unblock diff --git a/nptl/sysdeps/powerpc/tcb-offsets.sym b/nptl/sysdeps/powerpc/tcb-offsets.sym index fddd466f08..a9701fb5b7 100644 --- a/nptl/sysdeps/powerpc/tcb-offsets.sym +++ b/nptl/sysdeps/powerpc/tcb-offsets.sym @@ -12,3 +12,4 @@ MULTIPLE_THREADS_OFFSET thread_offsetof (header.multiple_threads) #endif PID thread_offsetof (pid) +TID thread_offsetof (tid) diff --git a/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S b/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S new file mode 100644 index 0000000000..f87adf4737 --- /dev/null +++ b/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S @@ -0,0 +1,3 @@ +#define RESET_PID +#include +#include diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S b/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S index 71e9a84e60..be069c90c8 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S @@ -23,6 +23,9 @@ #include #include +#define CLONE_VM 0x00000100 +#define CLONE_THREAD 0x00010000 + /* This is the only really unusual system call in PPC linux, but not because of any weirdness in the system call itself; because of all the freaky stuff we have to do to make the call useful. */ @@ -45,10 +48,13 @@ ENTRY (BP_SYM (__clone)) beq- cr0,L(badargs) /* Set up stack frame for parent. */ - stdu r1,-80(r1) + stdu r1,-88(r1) std r29,56(r1) std r30,64(r1) std r31,72(r1) +#ifdef RESET_PID + std r28,80(r1) +#endif /* Set up stack frame for child. */ clrrdi r4,r4,4 @@ -58,6 +64,9 @@ ENTRY (BP_SYM (__clone)) /* Save fn, args, stack across syscall. */ mr r29,r3 /* Function in r29. */ mr r30,r4 /* Stack pointer in r30. */ +#ifdef RESET_PID + mr r28,r5 /* Flags in r28. */ +#endif mr r31,r6 /* Argument in r31. */ /* 'flags' argument is first parameter to clone syscall. (The other @@ -81,6 +90,20 @@ ENTRY (BP_SYM (__clone)) it adds a race condition if a signal is sent to a thread just after it is created (in the previous three instructions). */ mr r1,r30 + +#ifdef RESET_PID + andis. r0,r28,1 /* This is & CLONE_THREAD */ + bne+ r0,L(oldpid) + andi. r0,r28,CLONE_VM + li r3,-1 + bne- r0,L(nomoregetpid) + DO_CALL(SYS_ify(getpid)) +L(nomoregetpid): + stw r3,TID(r13) + stw r3,PID(r13) +L(oldpid): +#endif + /* Call procedure. */ ld r0,0(r29) ld r2,8(r29) @@ -96,10 +119,13 @@ ENTRY (BP_SYM (__clone)) L(parent): /* Parent. Restore registers & return. */ +#ifdef RESET_PID + ld r28,88(r1) +#endif ld r31,72(r1) ld r30,64(r1) ld r29,56(r1) - addi r1,r1,80 + addi r1,r1,88 bnslr+ b JUMPTARGET(__syscall_error) -- 2.43.5