diff options
Diffstat (limited to 'nptl/sysdeps')
-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 |
3 files changed, 31 insertions, 6 deletions
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" \ |