diff options
Diffstat (limited to 'nptl')
-rw-r--r-- | nptl/ChangeLog | 26 | ||||
-rw-r--r-- | nptl/Makefile | 4 | ||||
-rw-r--r-- | nptl/descr.h | 2 | ||||
-rw-r--r-- | nptl/sysdeps/i386/tls.h | 6 | ||||
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/i386/dl-sysdep.h | 26 | ||||
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/i386/i686/dl-sysdep.h | 5 | ||||
-rw-r--r-- | nptl/tst-cancel4.c | 6 |
7 files changed, 64 insertions, 11 deletions
diff --git a/nptl/ChangeLog b/nptl/ChangeLog index fdfcf7c580..e9beee6d68 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,3 +1,29 @@ +2002-12-28 Ulrich Drepper <drepper@redhat.com> + + * descr.h (struct pthread): Move header.data.list to the back of the + struct. + * sysdeps/i386/tls.h (tcbhead_t): Move list to the back of the struct. + (MULTIPLE_THREADS_OFFSET): Adjust offset. + (SYSINFO_OFFSEET): Likewise. + +2002-12-27 Jakub Jelinek <jakub@redhat.com> + + * sysdeps/unix/sysv/linux/i386/i686/dl-sysdep.h (USE_DL_SYSINFO): + Define. + (DL_SYSINFO_DEFAULT): Cast to uintptr_t to avoid warnings. + * sysdeps/unix/sysv/linux/i386/dl-sysdep.h (NEED_DL_SYSINFO, + DL_SYSINFO_DEFAULT, DL_SYSINFO_IMPLEMENTATION): Define. + (USE_DL_SYSINFO): Undef. + +2002-12-22 Jakub Jelinek <jakub@redhat.com> + + * Makefile (tests-reverse): Use $(objpfx)../libc.so instead of + $(common-objpfx)libc.so. + * tst-cancel4.c (tf_write, tf_writev): Increase buf sizes so that + it is bigger than pipe buffer size even on arches with bigger + page size. + (tf_usleep): Cast usleep argument to useconds_t to avoid warnings. + 2002-12-25 Ulrich Drepper <drepper@redhat.com> * sysdeps/unix/sysv/linux/i386/i486/lowlevelsem.S: Implement diff --git a/nptl/Makefile b/nptl/Makefile index 33b5e9adea..198f2b3a1f 100644 --- a/nptl/Makefile +++ b/nptl/Makefile @@ -217,8 +217,10 @@ $(addprefix $(objpfx), \ $(tests) $(test-srcs))): $(objpfx)libpthread.so \ $(objpfx)libpthread_nonshared.a $(objpfx)tst-unload: $(common-objpfx)dlfcn/libdl.so +# $(objpfx)../libc.so is used instead of $(common-objpfx)libc.so, +# since otherwise libpthread.so comes before libc.so when linking. $(addprefix $(objpfx), $(tests-reverse)): \ - $(common-objpfx)libc.so $(objpfx)libpthread.so \ + $(objpfx)../libc.so $(objpfx)libpthread.so \ $(objpfx)libpthread_nonshared.a $(addprefix $(objpfx),$(tests-static)): $(objpfx)libpthread.a else diff --git a/nptl/descr.h b/nptl/descr.h index 734d339813..883078be69 100644 --- a/nptl/descr.h +++ b/nptl/descr.h @@ -66,11 +66,11 @@ struct pthread the address of this thread descriptor. */ union dtv *dtvp; struct pthread *self; /* Pointer to this structure */ - list_t list; int multiple_threads; #ifdef NEED_DL_SYSINFO uintptr_t sysinfo; #endif + list_t list; } data; void *__padding[16]; } header; diff --git a/nptl/sysdeps/i386/tls.h b/nptl/sysdeps/i386/tls.h index 984094c00e..4f8ddb2d28 100644 --- a/nptl/sysdeps/i386/tls.h +++ b/nptl/sysdeps/i386/tls.h @@ -42,9 +42,9 @@ typedef struct thread descriptor used by libpthread. */ dtv_t *dtv; void *self; /* Pointer to the thread descriptor. */ - list_t list; int multiple_threads; uintptr_t sysinfo; + list_t list; } tcbhead_t; #endif @@ -62,11 +62,11 @@ typedef struct #define STACK_ALIGN 16 /* Offset of the MULTIPLE_THREADS element in tcbhead_t. */ -#define MULTIPLE_THREADS_OFFSET 20 +#define MULTIPLE_THREADS_OFFSET 12 #ifdef NEED_DL_SYSINFO /* Offset of the SYSINFO element in tcbhead_t. */ -# define SYSINFO_OFFSET 24 +# define SYSINFO_OFFSET 16 #endif diff --git a/nptl/sysdeps/unix/sysv/linux/i386/dl-sysdep.h b/nptl/sysdeps/unix/sysv/linux/i386/dl-sysdep.h index 0eb5f32ac3..5e59962a48 100644 --- a/nptl/sysdeps/unix/sysv/linux/i386/dl-sysdep.h +++ b/nptl/sysdeps/unix/sysv/linux/i386/dl-sysdep.h @@ -1,4 +1,4 @@ -/* System-specific settings for dynamic linker code. Generic version. +/* System-specific settings for dynamic linker code. IA-32 version. Copyright (C) 2002 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -42,4 +42,28 @@ #define RTLD_CORRECT_DYNAMIC_WEAK 1 + +/* Traditionally system calls have been made using int $0x80. A + second method was introduced which, if possible, will use the + sysenter/syscall instructions. To signal the presence and where to + find the code the kernel passes an AT_SYSINFO value in the + auxiliary vector to the application. + sysenter/syscall is not useful on i386 through i586, but the dynamic + linker and dl code in libc.a has to be able to load i686 compiled + libraries. */ +#define NEED_DL_SYSINFO 1 +#undef USE_DL_SYSINFO + +#if defined NEED_DL_SYSINFO && !defined __ASSEMBLER__ +extern void _dl_sysinfo_int80 (void) attribute_hidden; +# define DL_SYSINFO_DEFAULT (uintptr_t) _dl_sysinfo_int80 +# define DL_SYSINFO_IMPLEMENTATION \ + asm (".type _dl_sysinfo_int80,@function\n\t" \ + ".hidden _dl_sysinfo_int80\n" \ + "_dl_sysinfo_int80:\n\t" \ + "int $0x80;\n\t" \ + "ret;\n\t" \ + ".size _dl_sysinfo_int80,.-_dl_sysinfo_int80"); +#endif + #endif /* dl-sysdep.h */ diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i686/dl-sysdep.h b/nptl/sysdeps/unix/sysv/linux/i386/i686/dl-sysdep.h index f0d4ac7a88..d7328fe219 100644 --- a/nptl/sysdeps/unix/sysv/linux/i386/i686/dl-sysdep.h +++ b/nptl/sysdeps/unix/sysv/linux/i386/i686/dl-sysdep.h @@ -1,4 +1,4 @@ -/* System-specific settings for dynamic linker code. Generic version. +/* System-specific settings for dynamic linker code. IA-32 version. Copyright (C) 2002 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -49,10 +49,11 @@ find the code the kernel passes an AT_SYSINFO value in the auxiliary vector to the application. */ #define NEED_DL_SYSINFO 1 +#define USE_DL_SYSINFO 1 #if defined NEED_DL_SYSINFO && !defined __ASSEMBLER__ extern void _dl_sysinfo_int80 (void) attribute_hidden; -# define DL_SYSINFO_DEFAULT _dl_sysinfo_int80 +# define DL_SYSINFO_DEFAULT (uintptr_t) _dl_sysinfo_int80 # define DL_SYSINFO_IMPLEMENTATION \ asm (".type _dl_sysinfo_int80,@function\n\t" \ ".hidden _dl_sysinfo_int80\n" \ diff --git a/nptl/tst-cancel4.c b/nptl/tst-cancel4.c index 371f2f7f26..7ab7bd60da 100644 --- a/nptl/tst-cancel4.c +++ b/nptl/tst-cancel4.c @@ -113,7 +113,7 @@ tf_write (void *arg) exit (1); } - char buf[10000]; + char buf[100000]; memset (buf, '\0', sizeof (buf)); ssize_t s = write (fds[1], buf, sizeof (buf)); @@ -133,7 +133,7 @@ tf_writev (void *arg) exit (1); } - char buf[10000]; + char buf[100000]; memset (buf, '\0', sizeof (buf)); struct iovec iov[1] = { [0] = { .iov_base = buf, .iov_len = sizeof (buf) } }; ssize_t s = writev (fds[1], iov, 1); @@ -172,7 +172,7 @@ tf_usleep (void *arg) exit (1); } - usleep (ULONG_MAX); + usleep ((useconds_t) ULONG_MAX); printf ("%s: usleep returns\n", __FUNCTION__); |