This is the mail archive of the libc-alpha@sources.redhat.com mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[alpha] fix nptl


Ho hum.  When I implemented the binutils support, I matched the ia64 abi.
Then Alan came along with a slightly better abi for powerpc.  It had been
my intention to go back and adjust binutils to match, but I never did.
But in the meantime I'd copied the ppc macros into tls.h.  And of course
in the meantime I'd forgotten about the issue entirely.  Curiously, this
mismatch doesn't result in total non-function, as I would have expected...

As for the abi, there has now been two binutils releases and at least one
glibc release (which does work with linuxthreads) with the ia64 settings,
so I think it's now too late to change.  Ah well, it's only a matter of
losing 28k addressability with the 16-bit relocations.

With this, the only nptl failures involve cancelation.  I think unwinding
is still broke somehow, but getting a debugger to show me exactly how has
been something of a challenge...


r~


        * sysdeps/alpha/tls.h (tcbhead_t): Add private.
        (TLS_INIT_TCB_SIZE, TLS_INIT_TCB_ALIGN, TLS_TCB_SIZE,
        TLS_PRE_TCB_SIZE, TLS_TCB_ALIGN, INSTALL_DTV, INSTALL_NEW_DTV,
        GET_DTV, THREAD_DTV, THREAD_SELF, DB_THREAD_SELF): Match ia64.
        (TLS_TCB_OFFSET, THREAD_ID, NO_TLS_OFFSET): Remove.
        (THREAD_GETMEM, THREAD_GETMEM_NC): Simplify.
        (THREAD_SETMEM, THREAD_SETMEM_NC): Likewise.
        * sysdeps/unix/sysv/linux/alpha/createthread.c (TLS_VALUE): Match ia64.

Index: nptl/sysdeps/alpha/tls.h
===================================================================
RCS file: /cvs/glibc/libc/nptl/sysdeps/alpha/tls.h,v
retrieving revision 1.3
diff -c -p -d -u -r1.3 tls.h
--- nptl/sysdeps/alpha/tls.h	6 Jan 2004 10:31:07 -0000	1.3
+++ nptl/sysdeps/alpha/tls.h	16 Jan 2004 05:18:46 -0000
@@ -57,93 +57,67 @@ typedef union dtv
 /* Get the thread descriptor definition.  */
 # include <nptl/descr.h>
 
-/* This layout is actually wholly private and not affected by the ABI.
-   Nor does it overlap the pthread data structure, so we need nothing
-   extra here at all.  */
 typedef struct
 {
   dtv_t *dtv;
+  void *private;
 } tcbhead_t;
 
 /* This is the size of the initial TCB.  */
-# define TLS_INIT_TCB_SIZE	0
+# define TLS_INIT_TCB_SIZE	sizeof (tcbhead_t)
 
 /* Alignment requirements for the initial TCB.  */
-# define TLS_INIT_TCB_ALIGN	__alignof__ (struct pthread)
+# define TLS_INIT_TCB_ALIGN	16
 
 /* This is the size of the TCB.  */
-# define TLS_TCB_SIZE		0
-
-/* Alignment requirements for the TCB.  */
-# define TLS_TCB_ALIGN		__alignof__ (struct pthread)
+# define TLS_TCB_SIZE		sizeof (tcbhead_t)
 
 /* This is the size we need before TCB.  */
-# define TLS_PRE_TCB_SIZE \
-  (sizeof (struct pthread)						      \
-   + ((sizeof (tcbhead_t) + TLS_TCB_ALIGN - 1) & ~(TLS_TCB_ALIGN - 1)))
+# define TLS_PRE_TCB_SIZE	sizeof (struct pthread)
 
-/* The following assumes that TP (R2 or R13) points to the end of the
-   TCB + 0x7000 (per the ABI).  This implies that TCB address is
-   TP - 0x7000.  As we define TLS_DTV_AT_TP we can
-   assume that the pthread struct is allocated immediately ahead of the
-   TCB.  This implies that the pthread_descr address is
-   TP - (TLS_PRE_TCB_SIZE + 0x7000).  */
-/* ??? PPC uses offset 0x7000; seems like a good idea for alpha too,
-   but binutils not yet changed to match.  */
-# define TLS_TCB_OFFSET	0
+/* Alignment requirements for the TCB.  */
+# define TLS_TCB_ALIGN		16
 
 /* Install the dtv pointer.  The pointer passed is to the element with
    index -1 which contain the length.  */
 # define INSTALL_DTV(tcbp, dtvp) \
-  ((tcbhead_t *) (tcbp))[-1].dtv = dtvp + 1
+  (((tcbhead_t *) (tcbp))->dtv = (dtvp) + 1)
 
 /* Install new dtv for current thread.  */
-# define INSTALL_NEW_DTV(dtv) (THREAD_DTV() = (dtv))
+# define INSTALL_NEW_DTV(dtv) \
+  (THREAD_DTV() = (dtv))
 
 /* Return dtv of given thread descriptor.  */
-# define GET_DTV(tcbp)	(((tcbhead_t *) (tcbp))[-1].dtv)
+# define GET_DTV(tcbp) \
+  (((tcbhead_t *) (tcbp))->dtv)
 
 /* Code to initially initialize the thread pointer.  This might need
    special attention since 'errno' is not yet available and if the
    operation can cause a failure 'errno' must not be touched.  */
 # define TLS_INIT_TP(tcbp, secondcall) \
-  (__builtin_set_thread_pointer ((void *) (tcbp) + TLS_TCB_OFFSET), NULL)
+  (__builtin_set_thread_pointer ((void *)(tcbp)), NULL)
 
 /* Return the address of the dtv for the current thread.  */
 # define THREAD_DTV() \
-     (((tcbhead_t *) (__builtin_thread_pointer () - TLS_TCB_OFFSET))[-1].dtv)
+  (((tcbhead_t *) __builtin_thread_pointer ())->dtv)
 
 /* Return the thread descriptor for the current thread.  */
 # define THREAD_SELF \
-    ((struct pthread *) (__builtin_thread_pointer () \
-			 - TLS_TCB_OFFSET - TLS_PRE_TCB_SIZE))
+ ((struct pthread *)__builtin_thread_pointer () - 1)
 
 /* Magic for libthread_db to know how to do THREAD_SELF.  */
 # define DB_THREAD_SELF \
-  REGISTER (64, 64, 32 * 8, - TLS_TCB_OFFSET - TLS_PRE_TCB_SIZE)
-
-/* Identifier for the current thread.  THREAD_SELF is usable but
-   sometimes more expensive than necessary as in this case.  */
-# define THREAD_ID (__builtin_thread_pointer ())
-
-/* Read member of the thread descriptor directly.  */
-# define THREAD_GETMEM(descr, member) ((void)(descr), (THREAD_SELF)->member)
-
-/* Same as THREAD_GETMEM, but the member offset can be non-constant.  */
-# define THREAD_GETMEM_NC(descr, member, idx) \
-    ((void)(descr), (THREAD_SELF)->member[idx])
-
-/* Set member of the thread descriptor directly.  */
-# define THREAD_SETMEM(descr, member, value) \
-    ((void)(descr), (THREAD_SELF)->member = (value))
-
-/* Same as THREAD_SETMEM, but the member offset can be non-constant.  */
-# define THREAD_SETMEM_NC(descr, member, idx, value) \
-    ((void)(descr), (THREAD_SELF)->member[idx] = (value))
+  REGISTER (64, 64, 32 * 8, -sizeof (struct pthread))
 
-/* l_tls_offset == 0 is perfectly valid on PPC, so we have to use some
-   different value to mean unset l_tls_offset.  */
-# define NO_TLS_OFFSET		-1
+/* Access to data in the thread descriptor is easy.  */
+#define THREAD_GETMEM(descr, member) \
+  descr->member
+#define THREAD_GETMEM_NC(descr, member, idx) \
+  descr->member[idx]
+#define THREAD_SETMEM(descr, member, value) \
+  descr->member = (value)
+#define THREAD_SETMEM_NC(descr, member, idx, value) \
+  descr->member[idx] = (value)
 
 #endif /* __ASSEMBLER__ */
 
Index: nptl/sysdeps/unix/sysv/linux/alpha/createthread.c
===================================================================
RCS file: /cvs/glibc/libc/nptl/sysdeps/unix/sysv/linux/alpha/createthread.c,v
retrieving revision 1.1
diff -c -p -d -u -r1.1 createthread.c
--- nptl/sysdeps/unix/sysv/linux/alpha/createthread.c	1 Jul 2003 20:20:36 -0000	1.1
+++ nptl/sysdeps/unix/sysv/linux/alpha/createthread.c	16 Jan 2004 05:18:46 -0000
@@ -17,8 +17,7 @@
    02111-1307 USA.  */
 
 /* Value passed to 'clone' for initialization of the thread register.  */
-#define TLS_VALUE ((void *) (pd) \
-		   + TLS_TCB_OFFSET + TLS_PRE_TCB_SIZE)
+#define TLS_VALUE (pd + 1)
 
 /* Get the real implementation.	 */
 #include <nptl/sysdeps/pthread/createthread.c>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]