2006-09-15 Carlos O'Donell <carlos@systemhalted.org>
authorCarlos O'Donell <carlos@systemhalted.org>
Sat, 16 Sep 2006 00:46:19 +0000 (00:46 +0000)
committerCarlos O'Donell <carlos@systemhalted.org>
Sat, 16 Sep 2006 00:46:19 +0000 (00:46 +0000)
* sysdeps/hppa/nptl/tcb-offsets.sym: Define TID_THREAD_OFFSET.
* sysdeps/unix/sysv/linux/hppa/clone.S: Handle RESET_PID, and
restore r19 before call to _exit.
* sysdeps/unix/sysv/linux/hppa/nptl/clone.S: New file.

ChangeLog.hppa
sysdeps/hppa/nptl/tcb-offsets.sym
sysdeps/unix/sysv/linux/hppa/clone.S
sysdeps/unix/sysv/linux/hppa/nptl/clone.S [new file with mode: 0644]

index 7b1adeb..8d3132f 100644 (file)
@@ -1,3 +1,10 @@
+2006-09-15  Carlos O'Donell  <carlos@systemhalted.org>
+
+       * sysdeps/hppa/nptl/tcb-offsets.sym: Define TID_THREAD_OFFSET.
+       * sysdeps/unix/sysv/linux/hppa/clone.S: Handle RESET_PID, and 
+       restore r19 before call to _exit.
+       * sysdeps/unix/sysv/linux/hppa/nptl/clone.S: New file.
+
 2006-09-13  Carlos O'Donell  <carlos@systemhalted.org>
 
        * sysdeps/hppa/dl-machine.h (RTLD_START): Comment the use of 
index 1c8aef4..f3cc826 100644 (file)
@@ -15,4 +15,5 @@ MUTEX_FUTEX           offsetof (pthread_mutex_t, __data.__lock)
 -- preceeds the thread pointer (which points to the dtv).
 #define thread_offsetof(mem)    (unsigned int)(offsetof(struct pthread, mem) - sizeof(struct pthread))
 PID_THREAD_OFFSET              thread_offsetof (pid)
+TID_THREAD_OFFSET              thread_offsetof (tid)
 MULTIPLE_THREADS_THREAD_OFFSET thread_offsetof (header.multiple_threads)
index 2319895..6cb74b0 100644 (file)
         .text
 ENTRY(__clone)
        /* Prologue */
-       stwm    %r3, 64(%sp)
+       stwm    %r4, 64(%sp)
        stw     %sp, -4(%sp)
+#ifdef PIC
        stw     %r19, -32(%sp)
+#endif
 
        /* Sanity check arguments.  */
        comib,=,n  0, %arg0, .LerrorSanity        /* no NULL function pointers */
        comib,=,n  0, %arg1, .LerrorSanity        /* no NULL stack pointers */
 
-       /* Save the fn ptr and arg on the new stack.  */
+       /* Save the function pointer, arg, and flags on the new stack.  */
        stwm    %r26, 64(%r25)
        stw     %r23, -60(%r25)
+       stw     %r24, -56(%r25)
        /* Clone arguments are (int flags, void * child_stack) */
        copy    %r24, %r26              /* flags are first */
        /* User stack pointer is in the correct register already */
@@ -85,7 +88,7 @@ ENTRY(__clone)
 
        /* Save the PIC register. */
 #ifdef PIC
-       copy    %r19, %r3               /* parent */
+       copy    %r19, %r4               /* parent */
 #endif
 
        /* Do the system call */
@@ -96,6 +99,11 @@ ENTRY(__clone)
        comclr,>>= %r1, %ret0, %r0      /* Note: unsigned compare. */
        b,n     .LerrorRest
 
+       /* Restore the PIC register.  */
+#ifdef PIC
+       copy    %r4, %r19               /* parent */ 
+#endif
+
        comib,=,n 0, %ret0, .LthreadStart
 
        /* Successful return from the parent
@@ -104,32 +112,46 @@ ENTRY(__clone)
 
        ldw     -84(%sp), %rp
        bv      %r0(%rp)
-       ldwm    -64(%sp), %r3
+       ldwm    -64(%sp), %r4
 
 .LerrorRest:
-       /* Restore the PIC register on error */
-#ifdef PIC
-       copy    %r3, %r19               /* parent */ 
-#endif
        /* Something bad happened -- no child created */
        bl      __syscall_error, %rp
        sub     %r0, %ret0, %arg0
        ldw     -84(%sp), %rp
        /* Return after setting errno, ret0 is set to -1 by __syscall_error. */
        bv      %r0(%rp)
-       ldwm    -64(%sp), %r3
+       ldwm    -64(%sp), %r4
 
 .LerrorSanity:
        /* Sanity checks failed, return -1, and set errno to EINVAL. */
        bl      __syscall_error, %rp
        ldi     EINVAL, %arg0
-       /* Lazy, don't restore r19 */
        ldw     -84(%sp), %rp
        bv      %r0(%rp)
-       ldwm    -64(%sp), %r3
+       ldwm    -64(%sp), %r4
 
 .LthreadStart:
-
+#ifdef RESET_PID
+# define CLONE_VM_BIT          23      /* 0x00000100  */
+# define CLONE_THREAD_BIT      15      /* 0x00010000  */
+       /* Load original clone flags. 
+          If CLONE_THREAD was passed, don't reset the PID/TID.
+          If CLONE_VM was passed, we need to store -1 to PID/TID.
+          If CLONE_VM and CLONE_THREAD were not set store the result
+          of getpid to PID/TID.  */
+       ldw     -56(%sp), %r26
+       bb,<,n  %r26, CLONE_THREAD_BIT, 1f
+       bb,<    %r26, CLONE_VM_BIT, 2f 
+       ldi     -1, %ret0
+       ble     0x100(%sr2, %r0)
+       ldi     __NR_getpid, %r20
+2:
+       mfctl   %cr27, %r26
+       stw     %ret0, PID_THREAD_OFFSET(%r26)
+       stw     %ret0, TID_THREAD_OFFSET(%r26)
+1:
+#endif
        /* Load up the arguments.  */
        ldw     -60(%sp), %arg0
        ldw     -64(%sp), %r22
@@ -137,13 +159,20 @@ ENTRY(__clone)
        /* $$dyncall fixes childs PIC register */
 
        /* Call the user's function */
+#ifdef PIC
+       copy    %r19, %r4
+#endif
        bl      $$dyncall, %r31
        copy    %r31, %rp
-
+#ifdef PIC
+       copy    %r4, %r19
+#endif
+       /* The call to _exit needs saved r19.  */
        bl      _exit, %rp
        copy    %ret0, %arg0
 
-       /* We should not return from _exit. */
+       /* We should not return from _exit.
+           We do not restore r4, or the stack state.  */
        iitlbp  %r0, (%sr0, %r0)
 
 PSEUDO_END(__clone)
diff --git a/sysdeps/unix/sysv/linux/hppa/nptl/clone.S b/sysdeps/unix/sysv/linux/hppa/nptl/clone.S
new file mode 100644 (file)
index 0000000..23750b3
--- /dev/null
@@ -0,0 +1,3 @@
+#define RESET_PID
+#include <tcb-offsets.h>
+#include "../clone.S"