diff options
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | elf/ldconfig.c | 14 | ||||
-rw-r--r-- | sysdeps/generic/dl-sysdep.c | 23 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/i386/system.c | 2 |
4 files changed, 41 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog index 526a4fc470..6cbb3498eb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,15 @@ +2002-12-20 Ulrich Drepper <drepper@redhat.com> + + * sysdeps/generic/dl-sysdep.c (_dl_important_hwcaps): For TLS + builds add "tls" in the search path. + * elf/ldconfig.c (is_hwcap_platform): Also recognize "tls". + (path_hwcap): Recognize "tls". + 2002-12-19 Ulrich Drepper <drepper@redhat.com> + * sysdeps/unix/sysv/linux/i386/system.c (cancel_handler): Use + __waitpid instead of waitpid. + * sysdeps/unix/sysv/linux/i386/_exit.S: Use ENTER_KERNEL instead of int $0x80. * sysdeps/unix/sysv/linux/i386/getcontext.S: Likewise. diff --git a/elf/ldconfig.c b/elf/ldconfig.c index 7e813d46d4..1b501e66a6 100644 --- a/elf/ldconfig.c +++ b/elf/ldconfig.c @@ -158,6 +158,11 @@ is_hwcap_platform (const char *name) if (hwcap_idx != -1) return 1; +#ifdef USE_TLS + if (strcmp (name, "tls") == 0) + return 1; +#endif + return 0; } @@ -190,7 +195,14 @@ path_hwcap (const char *path) { h = _dl_string_platform (ptr + 1); if (h == (uint64_t) -1) - break; + { +#ifdef USE_TLS + if (strcmp (ptr + 1, "tls") == 0) + h = 63; + else +#endif + break; + } } hwcap += 1ULL << h; diff --git a/sysdeps/generic/dl-sysdep.c b/sysdeps/generic/dl-sysdep.c index fbe5ad49e7..2a47a320da 100644 --- a/sysdeps/generic/dl-sysdep.c +++ b/sysdeps/generic/dl-sysdep.c @@ -37,6 +37,7 @@ #include <dl-procinfo.h> #include <dl-osinfo.h> #include <hp-timing.h> +#include <tls.h> extern char **_environ attribute_hidden; extern void _end attribute_hidden; @@ -291,17 +292,17 @@ _dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz, if ((masked & (1UL << n)) != 0) ++cnt; +#ifdef USE_TLS + /* For TLS enabled builds always add 'tls'. */ + ++cnt; +#else if (cnt == 0) { /* If we have platform name and no important capability we only have the base directory to search. */ result = (struct r_strlenpair *) malloc (sizeof (*result)); if (result == NULL) - { - no_memory: - INTUSE(_dl_signal_error) (ENOMEM, NULL, NULL, - N_("cannot create capability list")); - } + goto no_memory; result[0].str = (char *) result; /* Does not really matter. */ result[0].len = 0; @@ -309,6 +310,7 @@ _dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz, *sz = 1; return result; } +#endif /* Create temporary data structure to generate result table. */ temp = (struct r_strlenpair *) alloca (cnt * sizeof (*temp)); @@ -327,6 +329,11 @@ _dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz, temp[m].len = platform_len; ++m; } +#ifdef USE_TLS + temp[m].str = "tls"; + temp[m].len = 3; + ++m; +#endif assert (m == cnt); /* Determine the total size of all strings together. */ @@ -344,7 +351,11 @@ _dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz, *sz = 1 << cnt; result = (struct r_strlenpair *) malloc (*sz * sizeof (*result) + total); if (result == NULL) - goto no_memory; + { + no_memory: + INTUSE(_dl_signal_error) (ENOMEM, NULL, NULL, + N_("cannot create capability list")); + } if (cnt == 1) { diff --git a/sysdeps/unix/sysv/linux/i386/system.c b/sysdeps/unix/sysv/linux/i386/system.c index aa33471fa4..c7287e473e 100644 --- a/sysdeps/unix/sysv/linux/i386/system.c +++ b/sysdeps/unix/sysv/linux/i386/system.c @@ -56,7 +56,7 @@ cancel_handler (void *arg) { __kill (SIGKILL, *(pid_t *) arg); - TEMP_FAILURE_RETRY (waitpid (*(pid_t *) arg, NULL, 0)); + TEMP_FAILURE_RETRY (__waitpid (*(pid_t *) arg, NULL, 0)); DO_LOCK (); |