2002-12-18  Ulrich Drepper  <drepper@redhat.com>

	* descr.h (struct pthread) [NEED_DL_SYSINFO]: Add sysinfo member.
	* sysdeps/i386/tls.h (tcbhead_t): Add sysinfo member.
	Define SYSINFO_OFFSEET if NEED_DL_SYSINFO is defined.
	(INIT_SYSINFO): New #define.
	(TLS_TP_INIT): Use INIT_SYSINFO.
	* sysdeps/unix/sysv/linux/libc_pthread_init.c (__libc_pthread_init):
	At test to make sure SYSINFO_OFFSET value is correct.
	* sysdeps/unix/sysv/linux/i386/dl-sysdep.h: New file.
This commit is contained in:
Ulrich Drepper 2002-12-19 07:09:42 +00:00
parent 5e28917950
commit df45b31e81
7 changed files with 96 additions and 15 deletions

View File

@ -1,3 +1,14 @@
2002-12-18 Ulrich Drepper <drepper@redhat.com>
* descr.h (struct pthread) [NEED_DL_SYSINFO]: Add sysinfo member.
* sysdeps/i386/tls.h (tcbhead_t): Add sysinfo member.
Define SYSINFO_OFFSEET if NEED_DL_SYSINFO is defined.
(INIT_SYSINFO): New #define.
(TLS_TP_INIT): Use INIT_SYSINFO.
* sysdeps/unix/sysv/linux/libc_pthread_init.c (__libc_pthread_init):
At test to make sure SYSINFO_OFFSET value is correct.
* sysdeps/unix/sysv/linux/i386/dl-sysdep.h: New file.
2002-12-18 Jakub Jelinek <jakub@redhat.com>
* sysdeps/pthread/flockfile.c (flockfile): Change into weak alias.

View File

@ -68,6 +68,9 @@ struct pthread
struct pthread *self; /* Pointer to this structure */
list_t list;
int multiple_threads;
#ifdef NEED_DL_SYSINFO
uintptr_t sysinfo;
#endif
} data;
void *__padding[16];
} header;

View File

@ -43,6 +43,7 @@ typedef struct
void *self; /* Pointer to the thread descriptor. */
list_t list;
int multiple_threads;
uintptr_t sysinfo;
} tcbhead_t;
#endif
@ -62,6 +63,11 @@ typedef struct
/* Offset of the MULTIPLE_THREADS element in tcbhead_t. */
#define MULTIPLE_THREADS_OFFSET 20
#ifdef NEED_DL_SYSINFO
/* Offset of the SYSINFO element in tcbhead_t. */
# define SYSINFO_OFFSET 24
#endif
#ifndef __ASSEMBLER__
/* Get system call information. */
@ -160,6 +166,13 @@ union user_desc_init
# define TLS_LOAD_EBX
# endif
#if defined NEED_DL_SYSINFO && defined SHARED
# define INIT_SYSINFO \
_head->sysinfo = GL(dl_sysinfo)
#else
# define INIT_SYSINFO
#endif
/* Code to initially initialize the thread pointer. This might need
special attention since 'errno' is not yet available and if the
operation can cause a failure 'errno' must not be touched. */
@ -172,6 +185,8 @@ union user_desc_init
_head->tcb = _thrdescr; \
/* For now the thread descriptor is at the same address. */ \
_head->self = _thrdescr; \
/* New syscall handling support. */ \
INIT_SYSINFO; \
\
/* The 'entry_number' field. Let the kernel pick a value. */ \
if (secondcall) \

View File

@ -0,0 +1,53 @@
/* System-specific settings for dynamic linker code. Generic version.
Copyright (C) 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#ifndef _DL_SYSDEP_H
#define _DL_SYSDEP_H 1
/* This macro must be defined to either 0 or 1.
If 1, then an errno global variable hidden in ld.so will work right with
all the errno-using libc code compiled for ld.so, and there is never a
need to share the errno location with libc. This is appropriate only if
all the libc functions that ld.so uses are called without PLT and always
get the versions linked into ld.so rather than the libc ones. */
#define RTLD_PRIVATE_ERRNO 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. */
#define NEED_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_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 */

View File

@ -20,6 +20,7 @@
#include <unistd.h>
#include <list.h>
#include "fork.h"
#include <dl-sysdep.h>
#include <tls.h>
#include <string.h>
#include <pthreadP.h>
@ -62,4 +63,12 @@ __libc_pthread_init (ptr, reclaim, functions)
str_n_len ("*** MULTIPLE_THREADS_OFFSET out of date\n"));
_exit (1);
}
#ifdef SYSINFO_OFFSET
if (offsetof (struct pthread, header.data.sysinfo) != SYSINFO_OFFSET)
{
__libc_write (STDERR_FILENO,
str_n_len ("*** SYSINFO_OFFSET out of date\n"));
_exit (1);
}
#endif
}

View File

@ -34,14 +34,9 @@ weak_alias (__curbrk, ___brk_addr)
int
__brk (void *addr)
{
void *__unbounded newbrk, *__unbounded scratch;
void *__unbounded newbrk;
asm ("movl %%ebx, %1\n\t" /* Save %ebx in scratch register. */
"movl %3, %%ebx\n\t" /* Put ADDR in %ebx to be syscall arg. */
ENTER_KERNEL "\n\t" /* Perform the system call. */
"movl %1, %%ebx" /* Restore %ebx from scratch register. */
: "=a" (newbrk), "=r" (scratch)
: "0" (SYS_ify (brk)), "g" (__ptrvalue (addr)));
newbrk = INLINE_SYSCALL (brk, 1, __ptrvalue (addr));
__curbrk = newbrk;

View File

@ -131,14 +131,9 @@ __libc_sigaction (int sig, const struct sigaction *act, struct sigaction *oact)
k_newact.sa_restorer = &restore;
}
asm volatile ("pushl %%ebx\n\t"
"movl %2, %%ebx\n\t"
ENTER_KERNEL_STR "\n\t"
"popl %%ebx"
: "=a" (result)
: "0" (SYS_ify (sigaction)), "mr" (sig),
"c" (act ? __ptrvalue (&k_newact) : 0),
"d" (oact ? __ptrvalue (&k_oldact) : 0));
result = INTERNAL_SYCALL (sigaction, 3, sig,
act ? __ptrvalue (&k_newact) : 0,
oact ? __ptrvalue (&k_oldact) : 0);
if (result < 0)
{