diff --git a/nptl/Banner b/nptl/Banner index 288d93dbf8..28d8ef6ef1 100644 --- a/nptl/Banner +++ b/nptl/Banner @@ -1 +1 @@ -NPTL 0.34 by Ulrich Drepper +NPTL 0.35 by Ulrich Drepper diff --git a/nptl/ChangeLog b/nptl/ChangeLog index d40118b42d..d6aa004c42 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,3 +1,9 @@ +2003-04-12 Ulrich Drepper + + * sysdeps/x86_64/tls.h (THREAD_SETMEM): Word around compiler bug + which mishandles loading of global object addresses in PIC. + (THREAD_SETMEM_NC): Likewise. + 2003-04-11 Ulrich Drepper * pthread.h: Define new data structure for cleanup buffer. Declare diff --git a/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h b/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h index b7009d753f..09a294b458 100644 --- a/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h +++ b/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h @@ -105,7 +105,7 @@ cancellation state value is saved. */ # define EH_FRAME_0(name) \ .byte 4; \ - .long L(PUSHSTATE)-name; \ + .long L(PUSHSTATE)-L(name##START); \ .byte 14; \ .uleb128 8; \ .byte 4; \ @@ -122,7 +122,7 @@ also to save the content of the %ebx register. */ # define EH_FRAME_3(name) \ .byte 4; \ - .long L(PUSHBX1)-name; \ + .long L(PUSHBX1)-L(name##START); \ .byte 14; \ .uleb128 8; \ .byte 4; \ @@ -149,7 +149,7 @@ /* With four parameters the syscall wrappers have to save %ebx and %esi. */ # define EH_FRAME_4(name) \ .byte 4; \ - .long L(PUSHSI1)-name; \ + .long L(PUSHSI1)-L(name##START); \ .byte 14; \ .uleb128 8; \ .byte 4; \ @@ -193,7 +193,7 @@ and %edi. */ # define EH_FRAME_5(name) \ .byte 4; \ - .long L(PUSHDI1)-name; \ + .long L(PUSHDI1)-L(name##START); \ .byte 14; \ .uleb128 8; \ .byte 4; \ diff --git a/nptl/sysdeps/x86_64/tls.h b/nptl/sysdeps/x86_64/tls.h index dec1b5d1b7..975d20f3fa 100644 --- a/nptl/sysdeps/x86_64/tls.h +++ b/nptl/sysdeps/x86_64/tls.h @@ -204,6 +204,15 @@ typedef struct __value; }) +/* Loading addresses of objects on x86-64 needs to be treated special + when generating PIC code. */ +#ifdef __pic__ +# define IMM_MODE "nr" +#else +# define IMM_MODE "ir" +#endif + + /* Same as THREAD_SETMEM, but the member offset can be non-constant. */ # define THREAD_SETMEM(descr, member, value) \ ({ if (sizeof (descr->member) == 1) \ @@ -212,7 +221,7 @@ typedef struct "i" (offsetof (struct pthread, member))); \ else if (sizeof (descr->member) == 4) \ asm volatile ("movl %0,%%fs:%P1" : \ - : "ir" (value), \ + : IMM_MODE (value), \ "i" (offsetof (struct pthread, member))); \ else \ { \ @@ -222,7 +231,7 @@ typedef struct abort (); \ \ asm volatile ("movq %q0,%%fs:%P1" : \ - : "ir" ((unsigned long int) value), \ + : IMM_MODE ((unsigned long int) value), \ "i" (offsetof (struct pthread, member))); \ }}) @@ -236,7 +245,7 @@ typedef struct "r" (idx)); \ else if (sizeof (descr->member[0]) == 4) \ asm volatile ("movl %0,%%fs:%P1(,%q2,4)" : \ - : "ir" (value), \ + : IMM_MODE (value), \ "i" (offsetof (struct pthread, member[0])), \ "r" (idx)); \ else \ @@ -247,7 +256,7 @@ typedef struct abort (); \ \ asm volatile ("movq %q0,%%fs:%P1(,%q2,8)" : \ - : "r" ((unsigned long int) value), \ + : IMM_MODE ((unsigned long int) value), \ "i" (offsetof (struct pthread, member[0])), \ "r" (idx)); \ }}) diff --git a/sysdeps/generic/dl-tls.c b/sysdeps/generic/dl-tls.c index 19cf0aa072..746d9a20bc 100644 --- a/sysdeps/generic/dl-tls.c +++ b/sysdeps/generic/dl-tls.c @@ -370,7 +370,7 @@ _dl_allocate_tls_init (void *result) assert (map->l_tls_modid == cnt); assert (map->l_tls_blocksize >= map->l_tls_initimage_size); # if TLS_TCB_AT_TP - assert (map->l_tls_offset >= map->l_tls_blocksize); + assert ((size_t) map->l_tls_offset >= map->l_tls_blocksize); dest = (char *) result - map->l_tls_offset; # elif TLS_DTV_AT_TP dest = (char *) result + map->l_tls_offset; diff --git a/sysdeps/unix/sysv/linux/kernel-features.h b/sysdeps/unix/sysv/linux/kernel-features.h index 168715e665..56b68ffb5a 100644 --- a/sysdeps/unix/sysv/linux/kernel-features.h +++ b/sysdeps/unix/sysv/linux/kernel-features.h @@ -289,3 +289,8 @@ # define __ASSUME_NETLINK_SUPPORT 1 #endif +/* For x86, support for the sysenter instruction was available in + 2.5.53. */ +#if __LINUX_KERNEL_VERSION >= 132405 && defined __i386__ +# define __ASSUME_VSYSCALL 1 +#endif