aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2003-04-12 20:32:01 +0000
committerUlrich Drepper <drepper@redhat.com>2003-04-12 20:32:01 +0000
commit177d1ad3ac9aab9b8ae7e7f70c2c66b6bdb876ee (patch)
tree14a7365c1e51d7195303a37d0b8fc17677a5b831
parent68107ec092e7cc3fcd1f56edf9da8085cffed00d (diff)
downloadglibc-177d1ad3ac9aab9b8ae7e7f70c2c66b6bdb876ee.tar
glibc-177d1ad3ac9aab9b8ae7e7f70c2c66b6bdb876ee.tar.gz
glibc-177d1ad3ac9aab9b8ae7e7f70c2c66b6bdb876ee.tar.bz2
glibc-177d1ad3ac9aab9b8ae7e7f70c2c66b6bdb876ee.zip
Update.
2003-04-12 Ulrich Drepper <drepper@redhat.com> * sysdeps/x86_64/tls.h (THREAD_SETMEM): Word around compiler bug which mishandles loading of global object addresses in PIC. (THREAD_SETMEM_NC): Likewise.
-rw-r--r--nptl/Banner2
-rw-r--r--nptl/ChangeLog6
-rw-r--r--nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h8
-rw-r--r--nptl/sysdeps/x86_64/tls.h17
-rw-r--r--sysdeps/generic/dl-tls.c2
-rw-r--r--sysdeps/unix/sysv/linux/kernel-features.h5
6 files changed, 30 insertions, 10 deletions
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 <drepper@redhat.com>
+
+ * 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 <drepper@redhat.com>
* 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