mirror of
https://sourceware.org/git/glibc.git
synced 2025-01-03 08:11:08 +00:00
Update.
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:
parent
5e28917950
commit
df45b31e81
@ -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>
|
2002-12-18 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
* sysdeps/pthread/flockfile.c (flockfile): Change into weak alias.
|
* sysdeps/pthread/flockfile.c (flockfile): Change into weak alias.
|
||||||
|
@ -68,6 +68,9 @@ struct pthread
|
|||||||
struct pthread *self; /* Pointer to this structure */
|
struct pthread *self; /* Pointer to this structure */
|
||||||
list_t list;
|
list_t list;
|
||||||
int multiple_threads;
|
int multiple_threads;
|
||||||
|
#ifdef NEED_DL_SYSINFO
|
||||||
|
uintptr_t sysinfo;
|
||||||
|
#endif
|
||||||
} data;
|
} data;
|
||||||
void *__padding[16];
|
void *__padding[16];
|
||||||
} header;
|
} header;
|
||||||
|
@ -43,6 +43,7 @@ typedef struct
|
|||||||
void *self; /* Pointer to the thread descriptor. */
|
void *self; /* Pointer to the thread descriptor. */
|
||||||
list_t list;
|
list_t list;
|
||||||
int multiple_threads;
|
int multiple_threads;
|
||||||
|
uintptr_t sysinfo;
|
||||||
} tcbhead_t;
|
} tcbhead_t;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -62,6 +63,11 @@ typedef struct
|
|||||||
/* Offset of the MULTIPLE_THREADS element in tcbhead_t. */
|
/* Offset of the MULTIPLE_THREADS element in tcbhead_t. */
|
||||||
#define MULTIPLE_THREADS_OFFSET 20
|
#define MULTIPLE_THREADS_OFFSET 20
|
||||||
|
|
||||||
|
#ifdef NEED_DL_SYSINFO
|
||||||
|
/* Offset of the SYSINFO element in tcbhead_t. */
|
||||||
|
# define SYSINFO_OFFSET 24
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifndef __ASSEMBLER__
|
#ifndef __ASSEMBLER__
|
||||||
/* Get system call information. */
|
/* Get system call information. */
|
||||||
@ -160,6 +166,13 @@ union user_desc_init
|
|||||||
# define TLS_LOAD_EBX
|
# define TLS_LOAD_EBX
|
||||||
# endif
|
# 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
|
/* Code to initially initialize the thread pointer. This might need
|
||||||
special attention since 'errno' is not yet available and if the
|
special attention since 'errno' is not yet available and if the
|
||||||
operation can cause a failure 'errno' must not be touched. */
|
operation can cause a failure 'errno' must not be touched. */
|
||||||
@ -172,6 +185,8 @@ union user_desc_init
|
|||||||
_head->tcb = _thrdescr; \
|
_head->tcb = _thrdescr; \
|
||||||
/* For now the thread descriptor is at the same address. */ \
|
/* For now the thread descriptor is at the same address. */ \
|
||||||
_head->self = _thrdescr; \
|
_head->self = _thrdescr; \
|
||||||
|
/* New syscall handling support. */ \
|
||||||
|
INIT_SYSINFO; \
|
||||||
\
|
\
|
||||||
/* The 'entry_number' field. Let the kernel pick a value. */ \
|
/* The 'entry_number' field. Let the kernel pick a value. */ \
|
||||||
if (secondcall) \
|
if (secondcall) \
|
||||||
|
53
nptl/sysdeps/unix/sysv/linux/i386/dl-sysdep.h
Normal file
53
nptl/sysdeps/unix/sysv/linux/i386/dl-sysdep.h
Normal 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 */
|
@ -20,6 +20,7 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <list.h>
|
#include <list.h>
|
||||||
#include "fork.h"
|
#include "fork.h"
|
||||||
|
#include <dl-sysdep.h>
|
||||||
#include <tls.h>
|
#include <tls.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <pthreadP.h>
|
#include <pthreadP.h>
|
||||||
@ -62,4 +63,12 @@ __libc_pthread_init (ptr, reclaim, functions)
|
|||||||
str_n_len ("*** MULTIPLE_THREADS_OFFSET out of date\n"));
|
str_n_len ("*** MULTIPLE_THREADS_OFFSET out of date\n"));
|
||||||
_exit (1);
|
_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
|
||||||
}
|
}
|
||||||
|
@ -34,14 +34,9 @@ weak_alias (__curbrk, ___brk_addr)
|
|||||||
int
|
int
|
||||||
__brk (void *addr)
|
__brk (void *addr)
|
||||||
{
|
{
|
||||||
void *__unbounded newbrk, *__unbounded scratch;
|
void *__unbounded newbrk;
|
||||||
|
|
||||||
asm ("movl %%ebx, %1\n\t" /* Save %ebx in scratch register. */
|
newbrk = INLINE_SYSCALL (brk, 1, __ptrvalue (addr));
|
||||||
"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)));
|
|
||||||
|
|
||||||
__curbrk = newbrk;
|
__curbrk = newbrk;
|
||||||
|
|
||||||
|
@ -131,14 +131,9 @@ __libc_sigaction (int sig, const struct sigaction *act, struct sigaction *oact)
|
|||||||
k_newact.sa_restorer = &restore;
|
k_newact.sa_restorer = &restore;
|
||||||
}
|
}
|
||||||
|
|
||||||
asm volatile ("pushl %%ebx\n\t"
|
result = INTERNAL_SYCALL (sigaction, 3, sig,
|
||||||
"movl %2, %%ebx\n\t"
|
act ? __ptrvalue (&k_newact) : 0,
|
||||||
ENTER_KERNEL_STR "\n\t"
|
oact ? __ptrvalue (&k_oldact) : 0);
|
||||||
"popl %%ebx"
|
|
||||||
: "=a" (result)
|
|
||||||
: "0" (SYS_ify (sigaction)), "mr" (sig),
|
|
||||||
"c" (act ? __ptrvalue (&k_newact) : 0),
|
|
||||||
"d" (oact ? __ptrvalue (&k_oldact) : 0));
|
|
||||||
|
|
||||||
if (result < 0)
|
if (result < 0)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user