diff options
author | Richard Henderson <rth@redhat.com> | 2004-01-16 05:23:05 +0000 |
---|---|---|
committer | Richard Henderson <rth@redhat.com> | 2004-01-16 05:23:05 +0000 |
commit | ba6838329c3e249ec3d5b6fea5d79eb281526662 (patch) | |
tree | 99755aaf7196002e678441bde0b95f7019d9d609 /nptl/sysdeps | |
parent | 33f0a6c75ee574bd376da63c6e88de98989d3373 (diff) | |
download | glibc-ba6838329c3e249ec3d5b6fea5d79eb281526662.tar.gz glibc-ba6838329c3e249ec3d5b6fea5d79eb281526662.tar.xz glibc-ba6838329c3e249ec3d5b6fea5d79eb281526662.zip |
* 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.
2004-01-15 Richard Henderson <rth@redhat.com> * 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.
Diffstat (limited to 'nptl/sysdeps')
-rw-r--r-- | nptl/sysdeps/alpha/tls.h | 80 | ||||
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/alpha/createthread.c | 3 |
2 files changed, 28 insertions, 55 deletions
diff --git a/nptl/sysdeps/alpha/tls.h b/nptl/sysdeps/alpha/tls.h index f947fcf648..bc6630953f 100644 --- a/nptl/sysdeps/alpha/tls.h +++ b/nptl/sysdeps/alpha/tls.h @@ -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))) - -/* 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 +# define TLS_PRE_TCB_SIZE sizeof (struct pthread) + +/* 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)) - -/* 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 + REGISTER (64, 64, 32 * 8, -sizeof (struct pthread)) + +/* 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__ */ diff --git a/nptl/sysdeps/unix/sysv/linux/alpha/createthread.c b/nptl/sysdeps/unix/sysv/linux/alpha/createthread.c index b29c57b52a..6a51e73da6 100644 --- a/nptl/sysdeps/unix/sysv/linux/alpha/createthread.c +++ b/nptl/sysdeps/unix/sysv/linux/alpha/createthread.c @@ -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> |