From 253eb3a0acfae12863c40ef6c6b0128d5b0dc02b Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Thu, 7 Jul 2005 06:10:18 +0000 Subject: [PATCH] * elf/stackguard-macros.h (STACK_CHK_GUARD): Fix s390/s390x definition. Reported by Ulrich Weigand . * elf/stackguard-macros.h (STACK_CHK_GUARD): Add ia64 definition. --- ChangeLog | 7 +++++ elf/stackguard-macros.h | 7 +++-- nptl/ChangeLog | 13 ++++++++++ nptl/descr.h | 7 +++++ nptl/sysdeps/ia64/tcb-offsets.sym | 6 ++--- nptl/sysdeps/ia64/tls.h | 26 +++++++++++++++---- .../unix/sysv/linux/ia64/createthread.c | 4 +-- 7 files changed, 58 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index adcb3fa913..6cb6930279 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2005-07-05 Jakub Jelinek + + * elf/stackguard-macros.h (STACK_CHK_GUARD): Fix s390/s390x definition. + Reported by Ulrich Weigand . + + * elf/stackguard-macros.h (STACK_CHK_GUARD): Add ia64 definition. + 2005-07-06 Ulrich Drepper * elf/dl-error.c (_dl_signal_error): When testing for executable diff --git a/elf/stackguard-macros.h b/elf/stackguard-macros.h index 0fbf4d2c0b..97db8bc22a 100644 --- a/elf/stackguard-macros.h +++ b/elf/stackguard-macros.h @@ -20,10 +20,13 @@ ({ uintptr_t x; asm ("ld [%%g7+0x14], %0" : "=r" (x)); x; }) #elif defined __s390x__ # define STACK_CHK_GUARD \ - ({ uintptr_t x; asm ("ear %0,%a0; sllg %0,%0,32; ear %0,%a1; lg %0,0x28(%0)" : "=r" (x)); x; }) + ({ uintptr_t x; asm ("ear %0,%%a0; sllg %0,%0,32; ear %0,%%a1; lg %0,0x28(%0)" : "=a" (x)); x; }) #elif defined __s390__ # define STACK_CHK_GUARD \ - ({ uintptr_t x; asm ("ear %0,%%a0; l %0,0x14(%0)" : "=r" (x)); x; }) + ({ uintptr_t x; asm ("ear %0,%%a0; l %0,0x14(%0)" : "=a" (x)); x; }) +#elif defined __ia64__ +# define STACK_CHK_GUARD \ + ({ uintptr_t x; asm ("adds %0 = -8, r13;; ld8 %0 = [%0]" : "=r" (x)); x; }) #else extern uintptr_t __stack_chk_guard; # define STACK_CHK_GUARD __stack_chk_guard diff --git a/nptl/ChangeLog b/nptl/ChangeLog index e578b24a64..6124338ad0 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,3 +1,16 @@ +2005-07-05 Jakub Jelinek + + * descr.h (PTHREAD_STRUCT_END_PADDING): Define. + * sysdeps/ia64/tls.h (TLS_PRE_TCB_SIZE): If PTHREAD_STRUCT_END_PADDING + is smaller than 8 bytes, increase TLS_PRE_TCB_SIZE by 16 bytes. + (THREAD_SYSINFO, THREAD_SELF, DB_THREAD_SELF): Don't assume + TLS_PRE_TCB_SIZE is sizeof (struct pthread). + (THREAD_SET_STACK_GUARD, THREAD_COPY_STACK_GUARD): Define. + * sysdeps/ia64/tcb-offsets.sym (PID, TID, MULTIPLE_THREADS_OFFSET): + Use TLS_PRE_TCB_SIZE instead of sizeof (struct pthread). + * sysdeps/unix/sysv/linux/ia64/createthread.c (TLS_VALUE): Don't + assume TLS_PRE_TCB_SIZE is sizeof (struct pthread). + 2005-06-25 Jakub Jelinek * sysdeps/i386/tls.h (tcbhead_t): Add stack_guard field. diff --git a/nptl/descr.h b/nptl/descr.h index 454bb2a547..77251d5e45 100644 --- a/nptl/descr.h +++ b/nptl/descr.h @@ -254,6 +254,13 @@ struct pthread /* Resolver state. */ struct __res_state res; + + /* If you add fields after the res field above, please adjust + the following macro. */ +#define PTHREAD_STRUCT_END_PADDING \ + (sizeof (struct pthread) - offsetof (struct pthread, res) \ + - sizeof (((struct pthread *) 0)->res)) + } __attribute ((aligned (TCB_ALIGNMENT))); diff --git a/nptl/sysdeps/ia64/tcb-offsets.sym b/nptl/sysdeps/ia64/tcb-offsets.sym index f5108e0a9e..3bc367082d 100644 --- a/nptl/sysdeps/ia64/tcb-offsets.sym +++ b/nptl/sysdeps/ia64/tcb-offsets.sym @@ -1,7 +1,7 @@ #include #include -PID offsetof (struct pthread, pid) - sizeof (struct pthread) -TID offsetof (struct pthread, tid) - sizeof (struct pthread) -MULTIPLE_THREADS_OFFSET offsetof (struct pthread, header.multiple_threads) - sizeof (struct pthread) +PID offsetof (struct pthread, pid) - TLS_PRE_TCB_SIZE +TID offsetof (struct pthread, tid) - TLS_PRE_TCB_SIZE +MULTIPLE_THREADS_OFFSET offsetof (struct pthread, header.multiple_threads) - TLS_PRE_TCB_SIZE SYSINFO_OFFSET offsetof (tcbhead_t, private) diff --git a/nptl/sysdeps/ia64/tls.h b/nptl/sysdeps/ia64/tls.h index a435f966ca..e3ad0681d6 100644 --- a/nptl/sysdeps/ia64/tls.h +++ b/nptl/sysdeps/ia64/tls.h @@ -80,8 +80,15 @@ register struct pthread *__thread_self __asm__("r13"); /* This is the size of the TCB. */ # define TLS_TCB_SIZE sizeof (tcbhead_t) -/* This is the size we need before TCB. */ -# define TLS_PRE_TCB_SIZE sizeof (struct pthread) +/* This is the size we need before TCB. + If there is not any room for uintptr_t stack_guard in struct pthread's + final padding, we need to put struct pthread 16 byte slower. */ +# define TLS_PRE_TCB_SIZE \ + (sizeof (struct pthread) \ + + (PTHREAD_STRUCT_END_PADDING < sizeof (uintptr_t) \ + ? ((sizeof (uintptr_t) + __alignof__ (struct pthread) - 1)\ + & ~(__alignof__ (struct pthread) - 1)) \ + : 0)) /* Alignment requirements for the TCB. */ # define TLS_TCB_ALIGN __alignof__ (struct pthread) @@ -106,7 +113,8 @@ register struct pthread *__thread_self __asm__("r13"); (((tcbhead_t *) (descr))->dtv) #define THREAD_SELF_SYSINFO (((tcbhead_t *) __thread_self)->private) -#define THREAD_SYSINFO(pd) (((tcbhead_t *) ((pd) + 1))->private) +#define THREAD_SYSINFO(pd) \ + (((tcbhead_t *) ((char *) (pd) + TLS_PRE_TCB_SIZE))->private) #if defined NEED_DL_SYSINFO # define INIT_SYSINFO THREAD_SELF_SYSINFO = (void *) GLRO(dl_sysinfo) @@ -125,10 +133,11 @@ register struct pthread *__thread_self __asm__("r13"); (((tcbhead_t *)__thread_self)->dtv) /* Return the thread descriptor for the current thread. */ -# define THREAD_SELF (__thread_self - 1) +# define THREAD_SELF \ + ((struct pthread *) ((char *) __thread_self - TLS_PRE_TCB_SIZE)) /* Magic for libthread_db to know how to do THREAD_SELF. */ -# define DB_THREAD_SELF REGISTER (64, 64, 13 * 8, -sizeof (struct pthread)) +# define DB_THREAD_SELF REGISTER (64, 64, 13 * 8, -TLS_PRE_TCB_SIZE) /* Access to data in the thread descriptor is easy. */ #define THREAD_GETMEM(descr, member) \ @@ -140,6 +149,13 @@ register struct pthread *__thread_self __asm__("r13"); #define THREAD_SETMEM_NC(descr, member, idx, value) \ descr->member[idx] = (value) +/* Set the stack guard field in TCB head. */ +#define THREAD_SET_STACK_GUARD(value) \ + (((uintptr_t *) __thread_self)[-1] = (value)) +#define THREAD_COPY_STACK_GUARD(descr) \ + (((uintptr_t *) ((char *) (descr) + TLS_PRE_TCB_SIZE))[-1] \ + = ((uintptr_t *) __thread_self)[-1]) + #endif /* __ASSEMBLER__ */ #endif /* tls.h */ diff --git a/nptl/sysdeps/unix/sysv/linux/ia64/createthread.c b/nptl/sysdeps/unix/sysv/linux/ia64/createthread.c index 8ac06e8101..cd5f8137d5 100644 --- a/nptl/sysdeps/unix/sysv/linux/ia64/createthread.c +++ b/nptl/sysdeps/unix/sysv/linux/ia64/createthread.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. +/* Copyright (C) 2003, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Jakub Jelinek . @@ -18,7 +18,7 @@ 02111-1307 USA. */ /* Value passed to 'clone' for initialization of the thread register. */ -#define TLS_VALUE (pd + 1) +#define TLS_VALUE ((char *) pd + TLS_PRE_TCB_SIZE) #define ARCH_CLONE __clone2