* 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.
This commit is contained in:
Richard Henderson 2004-01-16 05:23:05 +00:00
parent 33f0a6c75e
commit ba6838329c
3 changed files with 37 additions and 53 deletions

View File

@ -1,3 +1,14 @@
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.
2004-01-14 Ulrich Drepper <drepper@redhat.com> 2004-01-14 Ulrich Drepper <drepper@redhat.com>
* init.c (pthread_funtions): Make array const. * init.c (pthread_funtions): Make array const.

View File

@ -57,93 +57,67 @@ typedef union dtv
/* Get the thread descriptor definition. */ /* Get the thread descriptor definition. */
# include <nptl/descr.h> # 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 typedef struct
{ {
dtv_t *dtv; dtv_t *dtv;
void *private;
} tcbhead_t; } tcbhead_t;
/* This is the size of the initial TCB. */ /* 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. */ /* 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. */ /* This is the size of the TCB. */
# define TLS_TCB_SIZE 0 # define TLS_TCB_SIZE sizeof (tcbhead_t)
/* Alignment requirements for the TCB. */
# define TLS_TCB_ALIGN __alignof__ (struct pthread)
/* This is the size we need before TCB. */ /* This is the size we need before TCB. */
# define TLS_PRE_TCB_SIZE \ # define TLS_PRE_TCB_SIZE sizeof (struct pthread)
(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 /* Alignment requirements for the TCB. */
TCB + 0x7000 (per the ABI). This implies that TCB address is # define TLS_TCB_ALIGN 16
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
/* Install the dtv pointer. The pointer passed is to the element with /* Install the dtv pointer. The pointer passed is to the element with
index -1 which contain the length. */ index -1 which contain the length. */
# define INSTALL_DTV(tcbp, dtvp) \ # define INSTALL_DTV(tcbp, dtvp) \
((tcbhead_t *) (tcbp))[-1].dtv = dtvp + 1 (((tcbhead_t *) (tcbp))->dtv = (dtvp) + 1)
/* Install new dtv for current thread. */ /* 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. */ /* 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 /* Code to initially initialize the thread pointer. This might need
special attention since 'errno' is not yet available and if the special attention since 'errno' is not yet available and if the
operation can cause a failure 'errno' must not be touched. */ operation can cause a failure 'errno' must not be touched. */
# define TLS_INIT_TP(tcbp, secondcall) \ # 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. */ /* Return the address of the dtv for the current thread. */
# define THREAD_DTV() \ # 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. */ /* Return the thread descriptor for the current thread. */
# define THREAD_SELF \ # define THREAD_SELF \
((struct pthread *) (__builtin_thread_pointer () \ ((struct pthread *)__builtin_thread_pointer () - 1)
- TLS_TCB_OFFSET - TLS_PRE_TCB_SIZE))
/* Magic for libthread_db to know how to do THREAD_SELF. */ /* Magic for libthread_db to know how to do THREAD_SELF. */
# define DB_THREAD_SELF \ # define DB_THREAD_SELF \
REGISTER (64, 64, 32 * 8, - TLS_TCB_OFFSET - TLS_PRE_TCB_SIZE) REGISTER (64, 64, 32 * 8, -sizeof (struct pthread))
/* Identifier for the current thread. THREAD_SELF is usable but /* Access to data in the thread descriptor is easy. */
sometimes more expensive than necessary as in this case. */ #define THREAD_GETMEM(descr, member) \
# define THREAD_ID (__builtin_thread_pointer ()) descr->member
#define THREAD_GETMEM_NC(descr, member, idx) \
/* Read member of the thread descriptor directly. */ descr->member[idx]
# define THREAD_GETMEM(descr, member) ((void)(descr), (THREAD_SELF)->member) #define THREAD_SETMEM(descr, member, value) \
descr->member = (value)
/* Same as THREAD_GETMEM, but the member offset can be non-constant. */ #define THREAD_SETMEM_NC(descr, member, idx, value) \
# define THREAD_GETMEM_NC(descr, member, idx) \ descr->member[idx] = (value)
((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
#endif /* __ASSEMBLER__ */ #endif /* __ASSEMBLER__ */

View File

@ -17,8 +17,7 @@
02111-1307 USA. */ 02111-1307 USA. */
/* Value passed to 'clone' for initialization of the thread register. */ /* Value passed to 'clone' for initialization of the thread register. */
#define TLS_VALUE ((void *) (pd) \ #define TLS_VALUE (pd + 1)
+ TLS_TCB_OFFSET + TLS_PRE_TCB_SIZE)
/* Get the real implementation. */ /* Get the real implementation. */
#include <nptl/sysdeps/pthread/createthread.c> #include <nptl/sysdeps/pthread/createthread.c>