mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-29 11:41:21 +03:00
Update.
* sysdeps/sparc/sparc64/dl-machine.h: Likewise. * sysdeps/sparc/sparc32/dl-machine.h: Likewise. * sysdeps/s390/s390-64/dl-machine.h: Likewise. * sysdeps/s390/s390-32/dl-machine.h: Likewise. * sysdeps/powerpc/powerpc64/dl-machine.h: Likewise. * sysdeps/powerpc/powerpc32/dl-machine.c: Likewise. * sysdeps/m68k/dl-machine.h: Likewise. * sysdeps/ia64/dl-machine.h: Likewise. * sysdeps/arm/dl-machine.h: Likewise. * sysdeps/alpha/dl-machine.h: Likewise.
This commit is contained in:
10
ChangeLog
10
ChangeLog
@ -52,6 +52,16 @@
|
|||||||
* sysdeps/unix/sysv/linux/powerpc/powerpc64/getcontext.S: Likewise.
|
* sysdeps/unix/sysv/linux/powerpc/powerpc64/getcontext.S: Likewise.
|
||||||
* sysdeps/unix/sysv/linux/powerpc/powerpc64/swapcontext.S: Likewise.
|
* sysdeps/unix/sysv/linux/powerpc/powerpc64/swapcontext.S: Likewise.
|
||||||
* sysdeps/x86_64/dl-machine.h: Likewise.
|
* sysdeps/x86_64/dl-machine.h: Likewise.
|
||||||
|
* sysdeps/sparc/sparc64/dl-machine.h: Likewise.
|
||||||
|
* sysdeps/sparc/sparc32/dl-machine.h: Likewise.
|
||||||
|
* sysdeps/s390/s390-64/dl-machine.h: Likewise.
|
||||||
|
* sysdeps/s390/s390-32/dl-machine.h: Likewise.
|
||||||
|
* sysdeps/powerpc/powerpc64/dl-machine.h: Likewise.
|
||||||
|
* sysdeps/powerpc/powerpc32/dl-machine.c: Likewise.
|
||||||
|
* sysdeps/m68k/dl-machine.h: Likewise.
|
||||||
|
* sysdeps/ia64/dl-machine.h: Likewise.
|
||||||
|
* sysdeps/arm/dl-machine.h: Likewise.
|
||||||
|
* sysdeps/alpha/dl-machine.h: Likewise.
|
||||||
|
|
||||||
2004-03-04 Ulrich Drepper <drepper@redhat.com>
|
2004-03-04 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
@ -134,7 +134,7 @@ _dl_close (void *_map)
|
|||||||
if (map->l_opencount > 1 || map->l_type != lt_loaded)
|
if (map->l_opencount > 1 || map->l_type != lt_loaded)
|
||||||
{
|
{
|
||||||
/* There are still references to this object. Do nothing more. */
|
/* There are still references to this object. Do nothing more. */
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_FILES, 0))
|
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_FILES, 0))
|
||||||
_dl_debug_printf ("\nclosing file=%s; opencount == %u\n",
|
_dl_debug_printf ("\nclosing file=%s; opencount == %u\n",
|
||||||
map->l_name, map->l_opencount);
|
map->l_name, map->l_opencount);
|
||||||
|
|
||||||
@ -224,7 +224,7 @@ _dl_close (void *_map)
|
|||||||
&& (imap->l_flags_1 & DF_1_NODELETE) == 0)
|
&& (imap->l_flags_1 & DF_1_NODELETE) == 0)
|
||||||
{
|
{
|
||||||
/* When debugging print a message first. */
|
/* When debugging print a message first. */
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0))
|
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0))
|
||||||
_dl_debug_printf ("\ncalling fini: %s\n\n", imap->l_name);
|
_dl_debug_printf ("\ncalling fini: %s\n\n", imap->l_name);
|
||||||
|
|
||||||
/* Call its termination function. Do not do it for
|
/* Call its termination function. Do not do it for
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Resolve conflicts against already prelinked libraries.
|
/* Resolve conflicts against already prelinked libraries.
|
||||||
Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
|
Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Jakub Jelinek <jakub@redhat.com>, 2001.
|
Contributed by Jakub Jelinek <jakub@redhat.com>, 2001.
|
||||||
|
|
||||||
@ -33,7 +33,7 @@ _dl_resolve_conflicts (struct link_map *l, ElfW(Rela) *conflict,
|
|||||||
ElfW(Rela) *conflictend)
|
ElfW(Rela) *conflictend)
|
||||||
{
|
{
|
||||||
#if ! ELF_MACHINE_NO_RELA
|
#if ! ELF_MACHINE_NO_RELA
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_RELOC, 0))
|
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_RELOC, 0))
|
||||||
_dl_printf ("\nconflict processing: %s\n",
|
_dl_printf ("\nconflict processing: %s\n",
|
||||||
l->l_name[0] ? l->l_name : rtld_progname);
|
l->l_name[0] ? l->l_name : rtld_progname);
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Load the dependencies of a mapped object.
|
/* Load the dependencies of a mapped object.
|
||||||
Copyright (C) 1996-2001, 2002, 2003 Free Software Foundation, Inc.
|
Copyright (C) 1996-2003, 2004 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -126,7 +126,7 @@ empty dynamics string token substitution")); \
|
|||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
/* This is for DT_AUXILIARY. */ \
|
/* This is for DT_AUXILIARY. */ \
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_LIBS, 0)) \
|
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_LIBS, 0))\
|
||||||
INTUSE(_dl_debug_printf) (N_("\
|
INTUSE(_dl_debug_printf) (N_("\
|
||||||
cannot load auxiliary `%s' because of empty dynamic string token " \
|
cannot load auxiliary `%s' because of empty dynamic string token " \
|
||||||
"substitution\n"), __str); \
|
"substitution\n"), __str); \
|
||||||
@ -291,7 +291,7 @@ _dl_map_object_deps (struct link_map *map,
|
|||||||
int err;
|
int err;
|
||||||
|
|
||||||
/* Say that we are about to load an auxiliary library. */
|
/* Say that we are about to load an auxiliary library. */
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_LIBS,
|
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_LIBS,
|
||||||
0))
|
0))
|
||||||
INTUSE(_dl_debug_printf) ("load auxiliary object=%s"
|
INTUSE(_dl_debug_printf) ("load auxiliary object=%s"
|
||||||
" requested by file=%s\n",
|
" requested by file=%s\n",
|
||||||
@ -319,7 +319,7 @@ _dl_map_object_deps (struct link_map *map,
|
|||||||
int err;
|
int err;
|
||||||
|
|
||||||
/* Say that we are about to load an auxiliary library. */
|
/* Say that we are about to load an auxiliary library. */
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_LIBS,
|
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_LIBS,
|
||||||
0))
|
0))
|
||||||
INTUSE(_dl_debug_printf) ("load filtered object=%s"
|
INTUSE(_dl_debug_printf) ("load filtered object=%s"
|
||||||
" requested by file=%s\n",
|
" requested by file=%s\n",
|
||||||
@ -510,7 +510,7 @@ _dl_map_object_deps (struct link_map *map,
|
|||||||
runp->map->l_reserved = 0;
|
runp->map->l_reserved = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (__builtin_expect(GL(dl_debug_mask) & DL_DEBUG_PRELINK, 0) != 0
|
if (__builtin_expect(GLRO(dl_debug_mask) & DL_DEBUG_PRELINK, 0) != 0
|
||||||
&& map == GL(dl_loaded))
|
&& map == GL(dl_loaded))
|
||||||
{
|
{
|
||||||
/* If we are to compute conflicts, we have to build local scope
|
/* If we are to compute conflicts, we have to build local scope
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Handling of dynamic sring tokens.
|
/* Handling of dynamic sring tokens.
|
||||||
Copyright (C) 1999, 2001, 2002, 2003 Free Software Foundation, Inc.
|
Copyright (C) 1999, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -62,7 +62,7 @@ extern size_t _dl_dst_count_internal (const char *name, int is_path);
|
|||||||
origin_len = (l)->l_origin == (char *) -1 \
|
origin_len = (l)->l_origin == (char *) -1 \
|
||||||
? 0 : strlen ((l)->l_origin); \
|
? 0 : strlen ((l)->l_origin); \
|
||||||
\
|
\
|
||||||
__len += __cnt * (MAX (origin_len, GL(dl_platformlen)) - 7); \
|
__len += __cnt * (MAX (origin_len, GLRO(dl_platformlen)) - 7); \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
__len; })
|
__len; })
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Error handling for runtime dynamic linker.
|
/* Error handling for runtime dynamic linker.
|
||||||
Copyright (C) 1995,96,97,98,99,2000,2001,2002 Free Software Foundation, Inc.
|
Copyright (C) 1995-2002,2004 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -121,7 +121,7 @@ internal_function
|
|||||||
_dl_signal_cerror (int errcode, const char *objname, const char *occation,
|
_dl_signal_cerror (int errcode, const char *objname, const char *occation,
|
||||||
const char *errstring)
|
const char *errstring)
|
||||||
{
|
{
|
||||||
if (__builtin_expect (GL(dl_debug_mask)
|
if (__builtin_expect (GLRO(dl_debug_mask)
|
||||||
& ~(DL_DEBUG_STATISTICS|DL_DEBUG_PRELINK), 0))
|
& ~(DL_DEBUG_STATISTICS|DL_DEBUG_PRELINK), 0))
|
||||||
INTUSE(_dl_debug_printf) ("%s: error: %s: %s (%s)\n", objname, occation,
|
INTUSE(_dl_debug_printf) ("%s: error: %s: %s (%s)\n", objname, occation,
|
||||||
errstring, receiver ? "continued" : "fatal");
|
errstring, receiver ? "continued" : "fatal");
|
||||||
|
@ -146,7 +146,7 @@ _dl_fini (void)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* When debugging print a message first. */
|
/* When debugging print a message first. */
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0))
|
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0))
|
||||||
INTUSE(_dl_debug_printf) ("\ncalling fini: %s\n\n",
|
INTUSE(_dl_debug_printf) ("\ncalling fini: %s\n\n",
|
||||||
l->l_name[0]
|
l->l_name[0]
|
||||||
? l->l_name : rtld_progname);
|
? l->l_name : rtld_progname);
|
||||||
@ -174,7 +174,7 @@ _dl_fini (void)
|
|||||||
|
|
||||||
__rtld_lock_unlock_recursive (GL(dl_load_lock));
|
__rtld_lock_unlock_recursive (GL(dl_load_lock));
|
||||||
|
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_STATISTICS, 0))
|
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_STATISTICS, 0))
|
||||||
{
|
{
|
||||||
INTUSE(_dl_debug_printf) ("\nruntime linker statistics:\n");
|
INTUSE(_dl_debug_printf) ("\nruntime linker statistics:\n");
|
||||||
INTUSE(_dl_debug_printf) ("\
|
INTUSE(_dl_debug_printf) ("\
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Return the next shared object initializer function not yet run.
|
/* Return the next shared object initializer function not yet run.
|
||||||
Copyright (C) 1995, 1996, 1998-2001, 2002 Free Software Foundation, Inc.
|
Copyright (C) 1995, 1996, 1998-2002, 2004 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -51,7 +51,7 @@ call_init (struct link_map *l, int argc, char **argv, char **env)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
/* Print a debug message if wanted. */
|
/* Print a debug message if wanted. */
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0))
|
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0))
|
||||||
INTUSE(_dl_debug_printf) ("\ncalling init: %s\n\n",
|
INTUSE(_dl_debug_printf) ("\ncalling init: %s\n\n",
|
||||||
l->l_name[0] ? l->l_name : rtld_progname);
|
l->l_name[0] ? l->l_name : rtld_progname);
|
||||||
|
|
||||||
@ -108,7 +108,7 @@ _dl_init (struct link_map *main_map, int argc, char **argv, char **env)
|
|||||||
ElfW(Addr) *addrs;
|
ElfW(Addr) *addrs;
|
||||||
unsigned int cnt;
|
unsigned int cnt;
|
||||||
|
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0))
|
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0))
|
||||||
INTUSE(_dl_debug_printf) ("\ncalling preinit: %s\n\n",
|
INTUSE(_dl_debug_printf) ("\ncalling preinit: %s\n\n",
|
||||||
main_map->l_name[0]
|
main_map->l_name[0]
|
||||||
? main_map->l_name : rtld_progname);
|
? main_map->l_name : rtld_progname);
|
||||||
|
@ -248,7 +248,7 @@ _dl_dst_substitute (struct link_map *l, const char *name, char *result,
|
|||||||
INTUSE(__libc_enable_secure))) != 0)
|
INTUSE(__libc_enable_secure))) != 0)
|
||||||
repl = l->l_origin;
|
repl = l->l_origin;
|
||||||
else if ((len = is_dst (start, name, "PLATFORM", is_path, 0)) != 0)
|
else if ((len = is_dst (start, name, "PLATFORM", is_path, 0)) != 0)
|
||||||
repl = GL(dl_platform);
|
repl = GLRO(dl_platform);
|
||||||
else if ((len = is_dst (start, name, "LIB", is_path, 0)) != 0)
|
else if ((len = is_dst (start, name, "LIB", is_path, 0)) != 0)
|
||||||
repl = DL_DST_LIB;
|
repl = DL_DST_LIB;
|
||||||
|
|
||||||
@ -502,10 +502,10 @@ decompose_rpath (struct r_search_path_struct *sps,
|
|||||||
|
|
||||||
/* First see whether we must forget the RUNPATH and RPATH from this
|
/* First see whether we must forget the RUNPATH and RPATH from this
|
||||||
object. */
|
object. */
|
||||||
if (__builtin_expect (GL(dl_inhibit_rpath) != NULL, 0)
|
if (__builtin_expect (GLRO(dl_inhibit_rpath) != NULL, 0)
|
||||||
&& !INTUSE(__libc_enable_secure))
|
&& !INTUSE(__libc_enable_secure))
|
||||||
{
|
{
|
||||||
const char *inhp = GL(dl_inhibit_rpath);
|
const char *inhp = GLRO(dl_inhibit_rpath);
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
@ -623,7 +623,7 @@ _dl_init_paths (const char *llp)
|
|||||||
directories addressed by the LD_LIBRARY_PATH environment variable. */
|
directories addressed by the LD_LIBRARY_PATH environment variable. */
|
||||||
|
|
||||||
/* Get the capabilities. */
|
/* Get the capabilities. */
|
||||||
capstr = _dl_important_hwcaps (GL(dl_platform), GL(dl_platformlen),
|
capstr = _dl_important_hwcaps (GLRO(dl_platform), GLRO(dl_platformlen),
|
||||||
&ncapstr, &max_capstrlen);
|
&ncapstr, &max_capstrlen);
|
||||||
|
|
||||||
/* First set up the rest of the default search directory entries. */
|
/* First set up the rest of the default search directory entries. */
|
||||||
@ -844,7 +844,7 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp,
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* Print debugging message. */
|
/* Print debugging message. */
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_FILES, 0))
|
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_FILES, 0))
|
||||||
INTUSE(_dl_debug_printf) ("file=%s; generating link map\n", name);
|
INTUSE(_dl_debug_printf) ("file=%s; generating link map\n", name);
|
||||||
|
|
||||||
/* This is the ELF header. We read it in `open_verify'. */
|
/* This is the ELF header. We read it in `open_verify'. */
|
||||||
@ -928,7 +928,7 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp,
|
|||||||
case PT_LOAD:
|
case PT_LOAD:
|
||||||
/* A load command tells us to map in part of the file.
|
/* A load command tells us to map in part of the file.
|
||||||
We record the load commands and process them all later. */
|
We record the load commands and process them all later. */
|
||||||
if (__builtin_expect ((ph->p_align & (GL(dl_pagesize) - 1)) != 0,
|
if (__builtin_expect ((ph->p_align & (GLRO(dl_pagesize) - 1)) != 0,
|
||||||
0))
|
0))
|
||||||
{
|
{
|
||||||
errstring = N_("ELF load command alignment not page-aligned");
|
errstring = N_("ELF load command alignment not page-aligned");
|
||||||
@ -944,8 +944,8 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp,
|
|||||||
|
|
||||||
c = &loadcmds[nloadcmds++];
|
c = &loadcmds[nloadcmds++];
|
||||||
c->mapstart = ph->p_vaddr & ~(ph->p_align - 1);
|
c->mapstart = ph->p_vaddr & ~(ph->p_align - 1);
|
||||||
c->mapend = ((ph->p_vaddr + ph->p_filesz + GL(dl_pagesize) - 1)
|
c->mapend = ((ph->p_vaddr + ph->p_filesz + GLRO(dl_pagesize) - 1)
|
||||||
& ~(GL(dl_pagesize) - 1));
|
& ~(GLRO(dl_pagesize) - 1));
|
||||||
c->dataend = ph->p_vaddr + ph->p_filesz;
|
c->dataend = ph->p_vaddr + ph->p_filesz;
|
||||||
c->allocend = ph->p_vaddr + ph->p_memsz;
|
c->allocend = ph->p_vaddr + ph->p_memsz;
|
||||||
c->mapoff = ph->p_offset & ~(ph->p_align - 1);
|
c->mapoff = ph->p_offset & ~(ph->p_align - 1);
|
||||||
@ -1090,7 +1090,7 @@ cannot allocate TLS data structures for initial thread");
|
|||||||
the OS can do whatever it likes. */
|
the OS can do whatever it likes. */
|
||||||
ElfW(Addr) mappref;
|
ElfW(Addr) mappref;
|
||||||
mappref = (ELF_PREFERRED_ADDRESS (loader, maplength,
|
mappref = (ELF_PREFERRED_ADDRESS (loader, maplength,
|
||||||
c->mapstart & GL(dl_use_load_bias))
|
c->mapstart & GLRO(dl_use_load_bias))
|
||||||
- MAP_BASE_ADDR (l));
|
- MAP_BASE_ADDR (l));
|
||||||
|
|
||||||
/* Remember which part of the address space this object uses. */
|
/* Remember which part of the address space this object uses. */
|
||||||
@ -1164,8 +1164,8 @@ cannot allocate TLS data structures for initial thread");
|
|||||||
|
|
||||||
zero = l->l_addr + c->dataend;
|
zero = l->l_addr + c->dataend;
|
||||||
zeroend = l->l_addr + c->allocend;
|
zeroend = l->l_addr + c->allocend;
|
||||||
zeropage = ((zero + GL(dl_pagesize) - 1)
|
zeropage = ((zero + GLRO(dl_pagesize) - 1)
|
||||||
& ~(GL(dl_pagesize) - 1));
|
& ~(GLRO(dl_pagesize) - 1));
|
||||||
|
|
||||||
if (zeroend < zeropage)
|
if (zeroend < zeropage)
|
||||||
/* All the extra data is in the last page of the segment.
|
/* All the extra data is in the last page of the segment.
|
||||||
@ -1178,8 +1178,9 @@ cannot allocate TLS data structures for initial thread");
|
|||||||
if (__builtin_expect ((c->prot & PROT_WRITE) == 0, 0))
|
if (__builtin_expect ((c->prot & PROT_WRITE) == 0, 0))
|
||||||
{
|
{
|
||||||
/* Dag nab it. */
|
/* Dag nab it. */
|
||||||
if (__mprotect ((caddr_t) (zero & ~(GL(dl_pagesize) - 1)),
|
if (__mprotect ((caddr_t) (zero
|
||||||
GL(dl_pagesize), c->prot|PROT_WRITE) < 0)
|
& ~(GLRO(dl_pagesize) - 1)),
|
||||||
|
GLRO(dl_pagesize), c->prot|PROT_WRITE) < 0)
|
||||||
{
|
{
|
||||||
errstring = N_("cannot change memory protections");
|
errstring = N_("cannot change memory protections");
|
||||||
goto call_lose_errno;
|
goto call_lose_errno;
|
||||||
@ -1187,8 +1188,8 @@ cannot allocate TLS data structures for initial thread");
|
|||||||
}
|
}
|
||||||
memset ((void *) zero, '\0', zeropage - zero);
|
memset ((void *) zero, '\0', zeropage - zero);
|
||||||
if (__builtin_expect ((c->prot & PROT_WRITE) == 0, 0))
|
if (__builtin_expect ((c->prot & PROT_WRITE) == 0, 0))
|
||||||
__mprotect ((caddr_t) (zero & ~(GL(dl_pagesize) - 1)),
|
__mprotect ((caddr_t) (zero & ~(GLRO(dl_pagesize) - 1)),
|
||||||
GL(dl_pagesize), c->prot);
|
GLRO(dl_pagesize), c->prot);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (zeroend > zeropage)
|
if (zeroend > zeropage)
|
||||||
@ -1258,7 +1259,7 @@ cannot allocate TLS data structures for initial thread");
|
|||||||
|
|
||||||
l->l_entry += l->l_addr;
|
l->l_entry += l->l_addr;
|
||||||
|
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_FILES, 0))
|
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_FILES, 0))
|
||||||
INTUSE(_dl_debug_printf) ("\
|
INTUSE(_dl_debug_printf) ("\
|
||||||
dynamic: 0x%0*lx base: 0x%0*lx size: 0x%0*Zx\n\
|
dynamic: 0x%0*lx base: 0x%0*lx size: 0x%0*Zx\n\
|
||||||
entry: 0x%0*lx phdr: 0x%0*lx phnum: %*u\n\n",
|
entry: 0x%0*lx phdr: 0x%0*lx phnum: %*u\n\n",
|
||||||
@ -1350,7 +1351,7 @@ cannot enable executable stack as shared object requires");
|
|||||||
|
|
||||||
/* When we profile the SONAME might be needed for something else but
|
/* When we profile the SONAME might be needed for something else but
|
||||||
loading. Add it right away. */
|
loading. Add it right away. */
|
||||||
if (__builtin_expect (GL(dl_profile) != NULL, 0)
|
if (__builtin_expect (GLRO(dl_profile) != NULL, 0)
|
||||||
&& l->l_info[DT_SONAME] != NULL)
|
&& l->l_info[DT_SONAME] != NULL)
|
||||||
add_name_to_object (l, ((const char *) D_PTR (l, l_info[DT_STRTAB])
|
add_name_to_object (l, ((const char *) D_PTR (l, l_info[DT_STRTAB])
|
||||||
+ l->l_info[DT_SONAME]->d_un.d_val));
|
+ l->l_info[DT_SONAME]->d_un.d_val));
|
||||||
@ -1570,7 +1571,7 @@ open_verify (const char *name, struct filebuf *fbp)
|
|||||||
+ (abi_note[6] & 0xff) * 256
|
+ (abi_note[6] & 0xff) * 256
|
||||||
+ (abi_note[7] & 0xff);
|
+ (abi_note[7] & 0xff);
|
||||||
if (abi_note[4] != __ABI_TAG_OS
|
if (abi_note[4] != __ABI_TAG_OS
|
||||||
|| (GL(dl_osversion) && GL(dl_osversion) < osversion))
|
|| (GLRO(dl_osversion) && GLRO(dl_osversion) < osversion))
|
||||||
{
|
{
|
||||||
close_and_out:
|
close_and_out:
|
||||||
__close (fd);
|
__close (fd);
|
||||||
@ -1615,7 +1616,7 @@ open_path (const char *name, size_t namelen, int preloaded,
|
|||||||
|
|
||||||
/* If we are debugging the search for libraries print the path
|
/* If we are debugging the search for libraries print the path
|
||||||
now if it hasn't happened now. */
|
now if it hasn't happened now. */
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_LIBS, 0)
|
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_LIBS, 0)
|
||||||
&& current_what != this_dir->what)
|
&& current_what != this_dir->what)
|
||||||
{
|
{
|
||||||
current_what = this_dir->what;
|
current_what = this_dir->what;
|
||||||
@ -1636,7 +1637,7 @@ open_path (const char *name, size_t namelen, int preloaded,
|
|||||||
- buf);
|
- buf);
|
||||||
|
|
||||||
/* Print name we try if this is wanted. */
|
/* Print name we try if this is wanted. */
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_LIBS, 0))
|
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_LIBS, 0))
|
||||||
INTUSE(_dl_debug_printf) (" trying file=%s\n", buf);
|
INTUSE(_dl_debug_printf) (" trying file=%s\n", buf);
|
||||||
|
|
||||||
fd = open_verify (buf, fbp);
|
fd = open_verify (buf, fbp);
|
||||||
@ -1769,7 +1770,7 @@ _dl_map_object (struct link_map *loader, const char *name, int preloaded,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Display information if we are debugging. */
|
/* Display information if we are debugging. */
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_FILES, 0)
|
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_FILES, 0)
|
||||||
&& loader != NULL)
|
&& loader != NULL)
|
||||||
INTUSE(_dl_debug_printf) ("\nfile=%s; needed by %s\n", name,
|
INTUSE(_dl_debug_printf) ("\nfile=%s; needed by %s\n", name,
|
||||||
loader->l_name[0]
|
loader->l_name[0]
|
||||||
@ -1781,7 +1782,7 @@ _dl_map_object (struct link_map *loader, const char *name, int preloaded,
|
|||||||
|
|
||||||
size_t namelen = strlen (name) + 1;
|
size_t namelen = strlen (name) + 1;
|
||||||
|
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_LIBS, 0))
|
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_LIBS, 0))
|
||||||
INTUSE(_dl_debug_printf) ("find library=%s; searching\n", name);
|
INTUSE(_dl_debug_printf) ("find library=%s; searching\n", name);
|
||||||
|
|
||||||
fd = -1;
|
fd = -1;
|
||||||
@ -1886,7 +1887,7 @@ _dl_map_object (struct link_map *loader, const char *name, int preloaded,
|
|||||||
&realname, &fb);
|
&realname, &fb);
|
||||||
|
|
||||||
/* Add another newline when we are tracing the library loading. */
|
/* Add another newline when we are tracing the library loading. */
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_LIBS, 0))
|
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_LIBS, 0))
|
||||||
INTUSE(_dl_debug_printf) ("\n");
|
INTUSE(_dl_debug_printf) ("\n");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -1908,7 +1909,7 @@ _dl_map_object (struct link_map *loader, const char *name, int preloaded,
|
|||||||
if (__builtin_expect (fd, 0) == -1)
|
if (__builtin_expect (fd, 0) == -1)
|
||||||
{
|
{
|
||||||
if (trace_mode
|
if (trace_mode
|
||||||
&& __builtin_expect (GL(dl_debug_mask) & DL_DEBUG_PRELINK, 0) == 0)
|
&& __builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_PRELINK, 0) == 0)
|
||||||
{
|
{
|
||||||
/* We haven't found an appropriate library. But since we
|
/* We haven't found an appropriate library. But since we
|
||||||
are only interested in the list of libraries this isn't
|
are only interested in the list of libraries this isn't
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Look up a symbol in the loaded objects.
|
/* Look up a symbol in the loaded objects.
|
||||||
Copyright (C) 1995-2002, 2003 Free Software Foundation, Inc.
|
Copyright (C) 1995-2002, 2003, 2004 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -190,7 +190,7 @@ add_dependency (struct link_map *undef_map, struct link_map *map)
|
|||||||
++(*list)->l_opencount;
|
++(*list)->l_opencount;
|
||||||
|
|
||||||
/* Display information if we are debugging. */
|
/* Display information if we are debugging. */
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_FILES, 0))
|
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_FILES, 0))
|
||||||
INTUSE(_dl_debug_printf) ("\
|
INTUSE(_dl_debug_printf) ("\
|
||||||
\nfile=%s; needed by %s (relocation dependency)\n\n",
|
\nfile=%s; needed by %s (relocation dependency)\n\n",
|
||||||
map->l_name[0] ? map->l_name : rtld_progname,
|
map->l_name[0] ? map->l_name : rtld_progname,
|
||||||
@ -315,7 +315,7 @@ _dl_lookup_symbol (const char *undef_name, struct link_map *undef_map,
|
|||||||
return INTUSE(_dl_lookup_symbol) (undef_name, undef_map, ref,
|
return INTUSE(_dl_lookup_symbol) (undef_name, undef_map, ref,
|
||||||
symbol_scope, type_class, flags);
|
symbol_scope, type_class, flags);
|
||||||
|
|
||||||
if (__builtin_expect (GL(dl_debug_mask)
|
if (__builtin_expect (GLRO(dl_debug_mask)
|
||||||
& (DL_DEBUG_BINDINGS|DL_DEBUG_PRELINK), 0))
|
& (DL_DEBUG_BINDINGS|DL_DEBUG_PRELINK), 0))
|
||||||
_dl_debug_bindings (undef_name, undef_map, ref, symbol_scope,
|
_dl_debug_bindings (undef_name, undef_map, ref, symbol_scope,
|
||||||
¤t_value, NULL, type_class, protected);
|
¤t_value, NULL, type_class, protected);
|
||||||
@ -389,7 +389,7 @@ _dl_lookup_symbol_skip (const char *undef_name,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (__builtin_expect (GL(dl_debug_mask)
|
if (__builtin_expect (GLRO(dl_debug_mask)
|
||||||
& (DL_DEBUG_BINDINGS|DL_DEBUG_PRELINK), 0))
|
& (DL_DEBUG_BINDINGS|DL_DEBUG_PRELINK), 0))
|
||||||
_dl_debug_bindings (undef_name, undef_map, ref, symbol_scope,
|
_dl_debug_bindings (undef_name, undef_map, ref, symbol_scope,
|
||||||
¤t_value, NULL, 0, protected);
|
¤t_value, NULL, 0, protected);
|
||||||
@ -522,7 +522,7 @@ _dl_lookup_versioned_symbol (const char *undef_name,
|
|||||||
ref, symbol_scope,
|
ref, symbol_scope,
|
||||||
version, type_class, flags);
|
version, type_class, flags);
|
||||||
|
|
||||||
if (__builtin_expect (GL(dl_debug_mask)
|
if (__builtin_expect (GLRO(dl_debug_mask)
|
||||||
& (DL_DEBUG_BINDINGS|DL_DEBUG_PRELINK), 0))
|
& (DL_DEBUG_BINDINGS|DL_DEBUG_PRELINK), 0))
|
||||||
_dl_debug_bindings (undef_name, undef_map, ref, symbol_scope,
|
_dl_debug_bindings (undef_name, undef_map, ref, symbol_scope,
|
||||||
¤t_value, version, type_class, protected);
|
¤t_value, version, type_class, protected);
|
||||||
@ -609,7 +609,7 @@ _dl_lookup_versioned_symbol_skip (const char *undef_name,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (__builtin_expect (GL(dl_debug_mask)
|
if (__builtin_expect (GLRO(dl_debug_mask)
|
||||||
& (DL_DEBUG_BINDINGS|DL_DEBUG_PRELINK), 0))
|
& (DL_DEBUG_BINDINGS|DL_DEBUG_PRELINK), 0))
|
||||||
_dl_debug_bindings (undef_name, undef_map, ref, symbol_scope,
|
_dl_debug_bindings (undef_name, undef_map, ref, symbol_scope,
|
||||||
¤t_value, version, 0, protected);
|
¤t_value, version, 0, protected);
|
||||||
@ -650,7 +650,7 @@ _dl_debug_bindings (const char *undef_name, struct link_map *undef_map,
|
|||||||
{
|
{
|
||||||
const char *reference_name = undef_map->l_name;
|
const char *reference_name = undef_map->l_name;
|
||||||
|
|
||||||
if (GL(dl_debug_mask) & DL_DEBUG_BINDINGS)
|
if (GLRO(dl_debug_mask) & DL_DEBUG_BINDINGS)
|
||||||
{
|
{
|
||||||
INTUSE(_dl_debug_printf) ("binding file %s to %s: %s symbol `%s'",
|
INTUSE(_dl_debug_printf) ("binding file %s to %s: %s symbol `%s'",
|
||||||
(reference_name[0]
|
(reference_name[0]
|
||||||
@ -666,13 +666,13 @@ _dl_debug_bindings (const char *undef_name, struct link_map *undef_map,
|
|||||||
_dl_debug_printf_c ("\n");
|
_dl_debug_printf_c ("\n");
|
||||||
}
|
}
|
||||||
#ifdef SHARED
|
#ifdef SHARED
|
||||||
if (GL(dl_debug_mask) & DL_DEBUG_PRELINK)
|
if (GLRO(dl_debug_mask) & DL_DEBUG_PRELINK)
|
||||||
{
|
{
|
||||||
int conflict = 0;
|
int conflict = 0;
|
||||||
struct sym_val val = { NULL, NULL };
|
struct sym_val val = { NULL, NULL };
|
||||||
|
|
||||||
if ((GL(dl_trace_prelink_map) == NULL
|
if ((GLRO(dl_trace_prelink_map) == NULL
|
||||||
|| GL(dl_trace_prelink_map) == GL(dl_loaded))
|
|| GLRO(dl_trace_prelink_map) == GL(dl_loaded))
|
||||||
&& undef_map != GL(dl_loaded))
|
&& undef_map != GL(dl_loaded))
|
||||||
{
|
{
|
||||||
const unsigned long int hash = _dl_elf_hash (undef_name);
|
const unsigned long int hash = _dl_elf_hash (undef_name);
|
||||||
@ -698,8 +698,8 @@ _dl_debug_bindings (const char *undef_name, struct link_map *undef_map,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (conflict
|
if (conflict
|
||||||
|| GL(dl_trace_prelink_map) == undef_map
|
|| GLRO(dl_trace_prelink_map) == undef_map
|
||||||
|| GL(dl_trace_prelink_map) == NULL
|
|| GLRO(dl_trace_prelink_map) == NULL
|
||||||
|| type_class == 4)
|
|| type_class == 4)
|
||||||
{
|
{
|
||||||
_dl_printf ("%s 0x%0*Zx 0x%0*Zx -> 0x%0*Zx 0x%0*Zx ",
|
_dl_printf ("%s 0x%0*Zx 0x%0*Zx -> 0x%0*Zx 0x%0*Zx ",
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Minimal replacements for basic facilities used in the dynamic linker.
|
/* Minimal replacements for basic facilities used in the dynamic linker.
|
||||||
Copyright (C) 1995,96,97,98,2000,2001,2002 Free Software Foundation, Inc.
|
Copyright (C) 1995-1998,2000-2002,2004 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -66,8 +66,8 @@ __libc_memalign (size_t align, size_t n)
|
|||||||
extern int _end attribute_hidden;
|
extern int _end attribute_hidden;
|
||||||
alloc_ptr = &_end;
|
alloc_ptr = &_end;
|
||||||
alloc_end = (void *) 0 + (((alloc_ptr - (void *) 0)
|
alloc_end = (void *) 0 + (((alloc_ptr - (void *) 0)
|
||||||
+ GL(dl_pagesize) - 1)
|
+ GLRO(dl_pagesize) - 1)
|
||||||
& ~(GL(dl_pagesize) - 1));
|
& ~(GLRO(dl_pagesize) - 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Make sure the allocation pointer is ideally aligned. */
|
/* Make sure the allocation pointer is ideally aligned. */
|
||||||
@ -78,7 +78,7 @@ __libc_memalign (size_t align, size_t n)
|
|||||||
{
|
{
|
||||||
/* Insufficient space left; allocate another page. */
|
/* Insufficient space left; allocate another page. */
|
||||||
caddr_t page;
|
caddr_t page;
|
||||||
size_t nup = (n + GL(dl_pagesize) - 1) & ~(GL(dl_pagesize) - 1);
|
size_t nup = (n + GLRO(dl_pagesize) - 1) & ~(GLRO(dl_pagesize) - 1);
|
||||||
page = __mmap (0, nup, PROT_READ|PROT_WRITE,
|
page = __mmap (0, nup, PROT_READ|PROT_WRITE,
|
||||||
MAP_ANON|MAP_PRIVATE, _dl_zerofd, 0);
|
MAP_ANON|MAP_PRIVATE, _dl_zerofd, 0);
|
||||||
assert (page != MAP_FAILED);
|
assert (page != MAP_FAILED);
|
||||||
|
@ -308,7 +308,7 @@ dl_open_worker (void *a)
|
|||||||
if (new->l_searchlist.r_list != NULL)
|
if (new->l_searchlist.r_list != NULL)
|
||||||
{
|
{
|
||||||
/* Let the user know about the opencount. */
|
/* Let the user know about the opencount. */
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_FILES, 0))
|
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_FILES, 0))
|
||||||
_dl_debug_printf ("opening file=%s; opencount == %u\n\n",
|
_dl_debug_printf ("opening file=%s; opencount == %u\n\n",
|
||||||
new->l_name, new->l_opencount);
|
new->l_name, new->l_opencount);
|
||||||
|
|
||||||
@ -336,7 +336,7 @@ dl_open_worker (void *a)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Only do lazy relocation if `LD_BIND_NOW' is not set. */
|
/* Only do lazy relocation if `LD_BIND_NOW' is not set. */
|
||||||
lazy = (mode & RTLD_BINDING_MASK) == RTLD_LAZY && GL(dl_lazy);
|
lazy = (mode & RTLD_BINDING_MASK) == RTLD_LAZY && GLRO(dl_lazy);
|
||||||
|
|
||||||
/* Relocate the objects loaded. We do this in reverse order so that copy
|
/* Relocate the objects loaded. We do this in reverse order so that copy
|
||||||
relocs of earlier objects overwrite the data written by later objects. */
|
relocs of earlier objects overwrite the data written by later objects. */
|
||||||
@ -349,7 +349,7 @@ dl_open_worker (void *a)
|
|||||||
if (! l->l_relocated)
|
if (! l->l_relocated)
|
||||||
{
|
{
|
||||||
#ifdef SHARED
|
#ifdef SHARED
|
||||||
if (GL(dl_profile) != NULL)
|
if (GLRO(dl_profile) != NULL)
|
||||||
{
|
{
|
||||||
/* If this here is the shared object which we want to profile
|
/* If this here is the shared object which we want to profile
|
||||||
make sure the profile is started. We can find out whether
|
make sure the profile is started. We can find out whether
|
||||||
@ -362,7 +362,8 @@ dl_open_worker (void *a)
|
|||||||
|
|
||||||
if (old_profile_map == NULL && GL(dl_profile_map) != NULL)
|
if (old_profile_map == NULL && GL(dl_profile_map) != NULL)
|
||||||
/* We must prepare the profiling. */
|
/* We must prepare the profiling. */
|
||||||
_dl_start_profile (GL(dl_profile_map), GL(dl_profile_output));
|
_dl_start_profile (GL(dl_profile_map),
|
||||||
|
GLRO(dl_profile_output));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
@ -548,7 +549,7 @@ dl_open_worker (void *a)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Let the user know about the opencount. */
|
/* Let the user know about the opencount. */
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_FILES, 0))
|
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_FILES, 0))
|
||||||
_dl_debug_printf ("opening file=%s; opencount == %u\n\n",
|
_dl_debug_printf ("opening file=%s; opencount == %u\n\n",
|
||||||
new->l_name, new->l_opencount);
|
new->l_name, new->l_opencount);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Profiling of shared libraries.
|
/* Profiling of shared libraries.
|
||||||
Copyright (C) 1997-2002, 2003 Free Software Foundation, Inc.
|
Copyright (C) 1997-2002, 2003, 2004 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||||
Based on the BSD mcount implementation.
|
Based on the BSD mcount implementation.
|
||||||
@ -198,9 +198,9 @@ _dl_start_profile (struct link_map *map, const char *output_dir)
|
|||||||
for (ph = map->l_phdr; ph < &map->l_phdr[map->l_phnum]; ++ph)
|
for (ph = map->l_phdr; ph < &map->l_phdr[map->l_phnum]; ++ph)
|
||||||
if (ph->p_type == PT_LOAD && (ph->p_flags & PF_X))
|
if (ph->p_type == PT_LOAD && (ph->p_flags & PF_X))
|
||||||
{
|
{
|
||||||
ElfW(Addr) start = (ph->p_vaddr & ~(GL(dl_pagesize) - 1));
|
ElfW(Addr) start = (ph->p_vaddr & ~(GLRO(dl_pagesize) - 1));
|
||||||
ElfW(Addr) end = ((ph->p_vaddr + ph->p_memsz + GL(dl_pagesize) - 1)
|
ElfW(Addr) end = ((ph->p_vaddr + ph->p_memsz + GLRO(dl_pagesize) - 1)
|
||||||
& ~(GL(dl_pagesize) - 1));
|
& ~(GLRO(dl_pagesize) - 1));
|
||||||
|
|
||||||
if (start < mapstart)
|
if (start < mapstart)
|
||||||
mapstart = start;
|
mapstart = start;
|
||||||
@ -273,11 +273,11 @@ _dl_start_profile (struct link_map *map, const char *output_dir)
|
|||||||
/* First determine the output name. We write in the directory
|
/* First determine the output name. We write in the directory
|
||||||
OUTPUT_DIR and the name is composed from the shared objects
|
OUTPUT_DIR and the name is composed from the shared objects
|
||||||
soname (or the file name) and the ending ".profile". */
|
soname (or the file name) and the ending ".profile". */
|
||||||
filename = (char *) alloca (strlen (output_dir) + 1 + strlen (GL(dl_profile))
|
filename = (char *) alloca (strlen (output_dir) + 1
|
||||||
+ sizeof ".profile");
|
+ strlen (GLRO(dl_profile)) + sizeof ".profile");
|
||||||
cp = __stpcpy (filename, output_dir);
|
cp = __stpcpy (filename, output_dir);
|
||||||
*cp++ = '/';
|
*cp++ = '/';
|
||||||
__stpcpy (__stpcpy (cp, GL(dl_profile)), ".profile");
|
__stpcpy (__stpcpy (cp, GLRO(dl_profile)), ".profile");
|
||||||
|
|
||||||
#ifdef O_NOFOLLOW
|
#ifdef O_NOFOLLOW
|
||||||
# define EXTRA_FLAGS | O_NOFOLLOW
|
# define EXTRA_FLAGS | O_NOFOLLOW
|
||||||
@ -310,11 +310,11 @@ _dl_start_profile (struct link_map *map, const char *output_dir)
|
|||||||
if (st.st_size == 0)
|
if (st.st_size == 0)
|
||||||
{
|
{
|
||||||
/* We have to create the file. */
|
/* We have to create the file. */
|
||||||
char buf[GL(dl_pagesize)];
|
char buf[GLRO(dl_pagesize)];
|
||||||
|
|
||||||
memset (buf, '\0', GL(dl_pagesize));
|
memset (buf, '\0', GLRO(dl_pagesize));
|
||||||
|
|
||||||
if (__lseek (fd, expected_size & ~(GL(dl_pagesize) - 1), SEEK_SET) == -1)
|
if (__lseek (fd, expected_size & ~(GLRO(dl_pagesize) - 1), SEEK_SET) == -1)
|
||||||
{
|
{
|
||||||
char buf[400];
|
char buf[400];
|
||||||
int errnum;
|
int errnum;
|
||||||
@ -327,7 +327,7 @@ _dl_start_profile (struct link_map *map, const char *output_dir)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (TEMP_FAILURE_RETRY (__libc_write (fd, buf, (expected_size
|
if (TEMP_FAILURE_RETRY (__libc_write (fd, buf, (expected_size
|
||||||
& (GL(dl_pagesize)
|
& (GLRO(dl_pagesize)
|
||||||
- 1))))
|
- 1))))
|
||||||
< 0)
|
< 0)
|
||||||
goto cannot_create;
|
goto cannot_create;
|
||||||
@ -341,7 +341,7 @@ _dl_start_profile (struct link_map *map, const char *output_dir)
|
|||||||
__munmap ((void *) addr, expected_size);
|
__munmap ((void *) addr, expected_size);
|
||||||
|
|
||||||
_dl_error_printf ("%s: file is no correct profile data file for `%s'\n",
|
_dl_error_printf ("%s: file is no correct profile data file for `%s'\n",
|
||||||
filename, GL(dl_profile));
|
filename, GLRO(dl_profile));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -146,7 +146,7 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
|
|||||||
&& __builtin_expect (l->l_info[DT_BIND_NOW] != NULL, 0))
|
&& __builtin_expect (l->l_info[DT_BIND_NOW] != NULL, 0))
|
||||||
lazy = 0;
|
lazy = 0;
|
||||||
|
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_RELOC, 0))
|
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_RELOC, 0))
|
||||||
INTUSE(_dl_debug_printf) ("\nrelocation processing: %s%s\n",
|
INTUSE(_dl_debug_printf) ("\nrelocation processing: %s%s\n",
|
||||||
l->l_name[0] ? l->l_name : rtld_progname,
|
l->l_name[0] ? l->l_name : rtld_progname,
|
||||||
lazy ? " (lazy)" : "");
|
lazy ? " (lazy)" : "");
|
||||||
@ -165,10 +165,10 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
|
|||||||
struct textrels *newp;
|
struct textrels *newp;
|
||||||
|
|
||||||
newp = (struct textrels *) alloca (sizeof (*newp));
|
newp = (struct textrels *) alloca (sizeof (*newp));
|
||||||
newp->len = (((ph->p_vaddr + ph->p_memsz + GL(dl_pagesize) - 1)
|
newp->len = (((ph->p_vaddr + ph->p_memsz + GLRO(dl_pagesize) - 1)
|
||||||
& ~(GL(dl_pagesize) - 1))
|
& ~(GLRO(dl_pagesize) - 1))
|
||||||
- (ph->p_vaddr & ~(GL(dl_pagesize) - 1)));
|
- (ph->p_vaddr & ~(GLRO(dl_pagesize) - 1)));
|
||||||
newp->start = ((ph->p_vaddr & ~(GL(dl_pagesize) - 1))
|
newp->start = ((ph->p_vaddr & ~(GLRO(dl_pagesize) - 1))
|
||||||
+ (caddr_t) l->l_addr);
|
+ (caddr_t) l->l_addr);
|
||||||
|
|
||||||
if (__mprotect (newp->start, newp->len, PROT_READ|PROT_WRITE) < 0)
|
if (__mprotect (newp->start, newp->len, PROT_READ|PROT_WRITE) < 0)
|
||||||
@ -318,9 +318,10 @@ INTDEF (_dl_relocate_object)
|
|||||||
void internal_function
|
void internal_function
|
||||||
_dl_protect_relro (struct link_map *l)
|
_dl_protect_relro (struct link_map *l)
|
||||||
{
|
{
|
||||||
ElfW(Addr) start = ((l->l_addr + l->l_relro_addr) & ~(GL(dl_pagesize) - 1));
|
ElfW(Addr) start = ((l->l_addr + l->l_relro_addr)
|
||||||
|
& ~(GLRO(dl_pagesize) - 1));
|
||||||
ElfW(Addr) end = ((l->l_addr + l->l_relro_addr + l->l_relro_size)
|
ElfW(Addr) end = ((l->l_addr + l->l_relro_addr + l->l_relro_size)
|
||||||
& ~(GL(dl_pagesize) - 1));
|
& ~(GLRO(dl_pagesize) - 1));
|
||||||
|
|
||||||
if (start != end
|
if (start != end
|
||||||
&& __mprotect ((void *) start, end - start, PROT_READ) < 0)
|
&& __mprotect ((void *) start, end - start, PROT_READ) < 0)
|
||||||
|
@ -118,7 +118,7 @@ fixup (
|
|||||||
value = elf_machine_plt_value (l, reloc, value);
|
value = elf_machine_plt_value (l, reloc, value);
|
||||||
|
|
||||||
/* Finally, fix up the plt itself. */
|
/* Finally, fix up the plt itself. */
|
||||||
if (__builtin_expect (GL(dl_bind_not), 0))
|
if (__builtin_expect (GLRO(dl_bind_not), 0))
|
||||||
return value;
|
return value;
|
||||||
|
|
||||||
return elf_machine_fixup_plt (l, result, reloc, rel_addr, value);
|
return elf_machine_fixup_plt (l, result, reloc, rel_addr, value);
|
||||||
@ -209,7 +209,7 @@ profile_fixup (
|
|||||||
value = elf_machine_plt_value (l, reloc, value);
|
value = elf_machine_plt_value (l, reloc, value);
|
||||||
|
|
||||||
/* Store the result for later runs. */
|
/* Store the result for later runs. */
|
||||||
if (__builtin_expect (! GL(dl_bind_not), 1))
|
if (__builtin_expect (! GLRO(dl_bind_not), 1))
|
||||||
*resultp = value;
|
*resultp = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,10 +175,10 @@ _dl_aux_init (ElfW(auxv_t) *av)
|
|||||||
switch (av->a_type)
|
switch (av->a_type)
|
||||||
{
|
{
|
||||||
case AT_PAGESZ:
|
case AT_PAGESZ:
|
||||||
GL(dl_pagesize) = av->a_un.a_val;
|
GLRO(dl_pagesize) = av->a_un.a_val;
|
||||||
break;
|
break;
|
||||||
case AT_CLKTCK:
|
case AT_CLKTCK:
|
||||||
GL(dl_clktck) = av->a_un.a_val;
|
GLRO(dl_clktck) = av->a_un.a_val;
|
||||||
break;
|
break;
|
||||||
case AT_PHDR:
|
case AT_PHDR:
|
||||||
GL(dl_phdr) = av->a_un.a_ptr;
|
GL(dl_phdr) = av->a_un.a_ptr;
|
||||||
@ -187,7 +187,7 @@ _dl_aux_init (ElfW(auxv_t) *av)
|
|||||||
GL(dl_phnum) = av->a_un.a_val;
|
GL(dl_phnum) = av->a_un.a_val;
|
||||||
break;
|
break;
|
||||||
case AT_HWCAP:
|
case AT_HWCAP:
|
||||||
GL(dl_hwcap) = av->a_un.a_val;
|
GLRO(dl_hwcap) = av->a_un.a_val;
|
||||||
break;
|
break;
|
||||||
#ifdef NEED_DL_SYSINFO
|
#ifdef NEED_DL_SYSINFO
|
||||||
case AT_SYSINFO:
|
case AT_SYSINFO:
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Handle symbol and library versioning.
|
/* Handle symbol and library versioning.
|
||||||
Copyright (C) 1997-2002, 2003 Free Software Foundation, Inc.
|
Copyright (C) 1997-2002, 2003, 2004 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||||
|
|
||||||
@ -87,7 +87,7 @@ match_symbol (const char *name, ElfW(Word) hash, const char *string,
|
|||||||
int result = 0;
|
int result = 0;
|
||||||
|
|
||||||
/* Display information about what we are doing while debugging. */
|
/* Display information about what we are doing while debugging. */
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_VERSIONS, 0))
|
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_VERSIONS, 0))
|
||||||
INTUSE(_dl_debug_printf) ("\
|
INTUSE(_dl_debug_printf) ("\
|
||||||
checking for version `%s' in file %s required by file %s\n",
|
checking for version `%s' in file %s required by file %s\n",
|
||||||
string, map->l_name[0]
|
string, map->l_name[0]
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Look up a symbol in the loaded objects.
|
/* Look up a symbol in the loaded objects.
|
||||||
Copyright (C) 1995-2002, 2003 Free Software Foundation, Inc.
|
Copyright (C) 1995-2002, 2003, 2004 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -60,7 +60,7 @@ FCT (const char *undef_name, unsigned long int hash, const ElfW(Sym) *ref,
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Print some debugging info if wanted. */
|
/* Print some debugging info if wanted. */
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_SYMBOLS, 0))
|
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_SYMBOLS, 0))
|
||||||
INTUSE(_dl_debug_printf) ("symbol=%s; lookup in file=%s\n",
|
INTUSE(_dl_debug_printf) ("symbol=%s; lookup in file=%s\n",
|
||||||
undef_name, (map->l_name[0]
|
undef_name, (map->l_name[0]
|
||||||
? map->l_name : rtld_progname));
|
? map->l_name : rtld_progname));
|
||||||
@ -183,7 +183,7 @@ FCT (const char *undef_name, unsigned long int hash, const ElfW(Sym) *ref,
|
|||||||
{
|
{
|
||||||
case STB_WEAK:
|
case STB_WEAK:
|
||||||
/* Weak definition. Use this value if we don't find another. */
|
/* Weak definition. Use this value if we don't find another. */
|
||||||
if (__builtin_expect (GL(dl_dynamic_weak), 0))
|
if (__builtin_expect (GLRO(dl_dynamic_weak), 0))
|
||||||
{
|
{
|
||||||
if (! result->s)
|
if (! result->s)
|
||||||
{
|
{
|
||||||
|
110
elf/rtld.c
110
elf/rtld.c
@ -95,14 +95,6 @@ struct rtld_global _rtld_global =
|
|||||||
/* Get architecture specific initializer. */
|
/* Get architecture specific initializer. */
|
||||||
#include <dl-procinfo.c>
|
#include <dl-procinfo.c>
|
||||||
._dl_debug_fd = STDERR_FILENO,
|
._dl_debug_fd = STDERR_FILENO,
|
||||||
#ifdef NEED_DL_SYSINFO
|
|
||||||
._dl_sysinfo = DL_SYSINFO_DEFAULT,
|
|
||||||
#endif
|
|
||||||
._dl_lazy = 1,
|
|
||||||
._dl_use_load_bias = -2,
|
|
||||||
._dl_fpu_control = _FPU_DEFAULT,
|
|
||||||
._dl_correct_cache_id = _DL_CACHE_DEFAULT_ID,
|
|
||||||
._dl_hwcap_mask = HWCAP_IMPORTANT,
|
|
||||||
/* Default presumption without further information is executable stack. */
|
/* Default presumption without further information is executable stack. */
|
||||||
._dl_stack_flags = PF_R|PF_W|PF_X,
|
._dl_stack_flags = PF_R|PF_W|PF_X,
|
||||||
#ifdef _LIBC_REENTRANT
|
#ifdef _LIBC_REENTRANT
|
||||||
@ -116,6 +108,28 @@ struct rtld_global _rtld_global =
|
|||||||
extern struct rtld_global _rtld_local
|
extern struct rtld_global _rtld_local
|
||||||
__attribute__ ((alias ("_rtld_global"), visibility ("hidden")));
|
__attribute__ ((alias ("_rtld_global"), visibility ("hidden")));
|
||||||
|
|
||||||
|
|
||||||
|
/* This variable is similar to _rtld_local, but all values are
|
||||||
|
read-only after relocation. */
|
||||||
|
struct rtld_global_ro _rtld_global_ro attribute_relro =
|
||||||
|
{
|
||||||
|
#ifdef NEED_DL_SYSINFO
|
||||||
|
._dl_sysinfo = DL_SYSINFO_DEFAULT,
|
||||||
|
#endif
|
||||||
|
._dl_use_load_bias = -2,
|
||||||
|
._dl_correct_cache_id = _DL_CACHE_DEFAULT_ID,
|
||||||
|
._dl_hwcap_mask = HWCAP_IMPORTANT,
|
||||||
|
._dl_lazy = 1,
|
||||||
|
._dl_fpu_control = _FPU_DEFAULT,
|
||||||
|
};
|
||||||
|
/* If we would use strong_alias here the compiler would see a
|
||||||
|
non-hidden definition. This would undo the effect of the previous
|
||||||
|
declaration. So spell out was strong_alias does plus add the
|
||||||
|
visibility attribute. */
|
||||||
|
extern struct rtld_global_ro _rtld_local_ro
|
||||||
|
__attribute__ ((alias ("_rtld_global_ro"), visibility ("hidden")));
|
||||||
|
|
||||||
|
|
||||||
static void dl_main (const ElfW(Phdr) *phdr, ElfW(Word) phnum,
|
static void dl_main (const ElfW(Phdr) *phdr, ElfW(Word) phnum,
|
||||||
ElfW(Addr) *user_entry);
|
ElfW(Addr) *user_entry);
|
||||||
|
|
||||||
@ -280,7 +294,7 @@ _dl_start_final (void *arg, struct dl_start_final_info *info)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_STATISTICS, 0))
|
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_STATISTICS, 0))
|
||||||
{
|
{
|
||||||
#ifndef HP_TIMING_NONAVAIL
|
#ifndef HP_TIMING_NONAVAIL
|
||||||
print_statistics (&rtld_total_time);
|
print_statistics (&rtld_total_time);
|
||||||
@ -712,7 +726,7 @@ dl_main (const ElfW(Phdr) *phdr,
|
|||||||
if (! strcmp (INTUSE(_dl_argv)[1], "--list"))
|
if (! strcmp (INTUSE(_dl_argv)[1], "--list"))
|
||||||
{
|
{
|
||||||
mode = list;
|
mode = list;
|
||||||
GL(dl_lazy) = -1; /* This means do no dependency analysis. */
|
GLRO(dl_lazy) = -1; /* This means do no dependency analysis. */
|
||||||
|
|
||||||
++_dl_skip_args;
|
++_dl_skip_args;
|
||||||
--_dl_argc;
|
--_dl_argc;
|
||||||
@ -738,7 +752,7 @@ dl_main (const ElfW(Phdr) *phdr,
|
|||||||
else if (! strcmp (INTUSE(_dl_argv)[1], "--inhibit-rpath")
|
else if (! strcmp (INTUSE(_dl_argv)[1], "--inhibit-rpath")
|
||||||
&& _dl_argc > 2)
|
&& _dl_argc > 2)
|
||||||
{
|
{
|
||||||
GL(dl_inhibit_rpath) = INTUSE(_dl_argv)[2];
|
GLRO(dl_inhibit_rpath) = INTUSE(_dl_argv)[2];
|
||||||
|
|
||||||
_dl_skip_args += 2;
|
_dl_skip_args += 2;
|
||||||
_dl_argc -= 2;
|
_dl_argc -= 2;
|
||||||
@ -1035,8 +1049,8 @@ of this helper program; chances are you did not intend to run this program.\n\
|
|||||||
/* If LD_USE_LOAD_BIAS env variable has not been seen, default
|
/* If LD_USE_LOAD_BIAS env variable has not been seen, default
|
||||||
to not using bias for non-prelinked PIEs and libraries
|
to not using bias for non-prelinked PIEs and libraries
|
||||||
and using it for executables or prelinked PIEs or libraries. */
|
and using it for executables or prelinked PIEs or libraries. */
|
||||||
if (GL(dl_use_load_bias) == (ElfW(Addr)) -2)
|
if (GLRO(dl_use_load_bias) == (ElfW(Addr)) -2)
|
||||||
GL(dl_use_load_bias) = (GL(dl_loaded)->l_addr == 0) ? -1 : 0;
|
GLRO(dl_use_load_bias) = (GL(dl_loaded)->l_addr == 0) ? -1 : 0;
|
||||||
|
|
||||||
/* Set up the program header information for the dynamic linker
|
/* Set up the program header information for the dynamic linker
|
||||||
itself. It is needed in the dl_iterate_phdr() callbacks. */
|
itself. It is needed in the dl_iterate_phdr() callbacks. */
|
||||||
@ -1212,7 +1226,7 @@ ERROR: ld.so: object '%s' from %s cannot be preloaded: ignored.\n",
|
|||||||
|
|
||||||
#ifdef NEED_DL_SYSINFO
|
#ifdef NEED_DL_SYSINFO
|
||||||
struct link_map *sysinfo_map = NULL;
|
struct link_map *sysinfo_map = NULL;
|
||||||
if (GL(dl_sysinfo_dso) != NULL)
|
if (GLRO(dl_sysinfo_dso) != NULL)
|
||||||
{
|
{
|
||||||
/* Do an abridged version of the work _dl_map_object_from_fd would do
|
/* Do an abridged version of the work _dl_map_object_from_fd would do
|
||||||
to map in the object. It's already mapped and prelinked (and
|
to map in the object. It's already mapped and prelinked (and
|
||||||
@ -1224,9 +1238,9 @@ ERROR: ld.so: object '%s' from %s cannot be preloaded: ignored.\n",
|
|||||||
{
|
{
|
||||||
static ElfW(Dyn) dyn_temp[DL_RO_DYN_TEMP_CNT];
|
static ElfW(Dyn) dyn_temp[DL_RO_DYN_TEMP_CNT];
|
||||||
|
|
||||||
l->l_phdr = ((const void *) GL(dl_sysinfo_dso)
|
l->l_phdr = ((const void *) GLRO(dl_sysinfo_dso)
|
||||||
+ GL(dl_sysinfo_dso)->e_phoff);
|
+ GLRO(dl_sysinfo_dso)->e_phoff);
|
||||||
l->l_phnum = GL(dl_sysinfo_dso)->e_phnum;
|
l->l_phnum = GLRO(dl_sysinfo_dso)->e_phnum;
|
||||||
for (uint_fast16_t i = 0; i < l->l_phnum; ++i)
|
for (uint_fast16_t i = 0; i < l->l_phnum; ++i)
|
||||||
{
|
{
|
||||||
const ElfW(Phdr) *const ph = &l->l_phdr[i];
|
const ElfW(Phdr) *const ph = &l->l_phdr[i];
|
||||||
@ -1243,7 +1257,7 @@ ERROR: ld.so: object '%s' from %s cannot be preloaded: ignored.\n",
|
|||||||
l->l_map_end = ph->p_vaddr + ph->p_memsz;
|
l->l_map_end = ph->p_vaddr + ph->p_memsz;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
l->l_map_start = (ElfW(Addr)) GL(dl_sysinfo_dso);
|
l->l_map_start = (ElfW(Addr)) GLRO(dl_sysinfo_dso);
|
||||||
l->l_addr = l->l_map_start - l->l_addr;
|
l->l_addr = l->l_map_start - l->l_addr;
|
||||||
l->l_map_end += l->l_addr;
|
l->l_map_end += l->l_addr;
|
||||||
l->l_ld = (void *) ((ElfW(Addr)) l->l_ld + l->l_addr);
|
l->l_ld = (void *) ((ElfW(Addr)) l->l_ld + l->l_addr);
|
||||||
@ -1269,8 +1283,8 @@ ERROR: ld.so: object '%s' from %s cannot be preloaded: ignored.\n",
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* We have a prelinked DSO preloaded by the system. */
|
/* We have a prelinked DSO preloaded by the system. */
|
||||||
if (GL(dl_sysinfo) == DL_SYSINFO_DEFAULT)
|
if (GLRO(dl_sysinfo) == DL_SYSINFO_DEFAULT)
|
||||||
GL(dl_sysinfo) = GL(dl_sysinfo_dso)->e_entry + l->l_addr;
|
GLRO(dl_sysinfo) = GLRO(dl_sysinfo_dso)->e_entry + l->l_addr;
|
||||||
sysinfo_map = l;
|
sysinfo_map = l;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1437,7 +1451,7 @@ cannot allocate TLS data structures for initial thread");
|
|||||||
after relocation. */
|
after relocation. */
|
||||||
struct link_map *l;
|
struct link_map *l;
|
||||||
|
|
||||||
if (GL(dl_debug_mask) & DL_DEBUG_PRELINK)
|
if (GLRO(dl_debug_mask) & DL_DEBUG_PRELINK)
|
||||||
{
|
{
|
||||||
struct r_scope_elem *scope = &GL(dl_loaded)->l_searchlist;
|
struct r_scope_elem *scope = &GL(dl_loaded)->l_searchlist;
|
||||||
|
|
||||||
@ -1449,8 +1463,8 @@ cannot allocate TLS data structures for initial thread");
|
|||||||
_dl_printf ("\t%s => not found\n", l->l_libname->name);
|
_dl_printf ("\t%s => not found\n", l->l_libname->name);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (_dl_name_match_p (GL(dl_trace_prelink), l))
|
if (_dl_name_match_p (GLRO(dl_trace_prelink), l))
|
||||||
GL(dl_trace_prelink_map) = l;
|
GLRO(dl_trace_prelink_map) = l;
|
||||||
_dl_printf ("\t%s => %s (0x%0*Zx, 0x%0*Zx)",
|
_dl_printf ("\t%s => %s (0x%0*Zx, 0x%0*Zx)",
|
||||||
l->l_libname->name[0] ? l->l_libname->name
|
l->l_libname->name[0] ? l->l_libname->name
|
||||||
: rtld_progname ?: "<main program>",
|
: rtld_progname ?: "<main program>",
|
||||||
@ -1507,13 +1521,13 @@ cannot allocate TLS data structures for initial thread");
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* If LD_WARN is set warn about undefined symbols. */
|
/* If LD_WARN is set warn about undefined symbols. */
|
||||||
if (GL(dl_lazy) >= 0 && GL(dl_verbose))
|
if (GLRO(dl_lazy) >= 0 && GLRO(dl_verbose))
|
||||||
{
|
{
|
||||||
/* We have to do symbol dependency testing. */
|
/* We have to do symbol dependency testing. */
|
||||||
struct relocate_args args;
|
struct relocate_args args;
|
||||||
struct link_map *l;
|
struct link_map *l;
|
||||||
|
|
||||||
args.lazy = GL(dl_lazy);
|
args.lazy = GLRO(dl_lazy);
|
||||||
|
|
||||||
l = GL(dl_loaded);
|
l = GL(dl_loaded);
|
||||||
while (l->l_next)
|
while (l->l_next)
|
||||||
@ -1529,7 +1543,7 @@ cannot allocate TLS data structures for initial thread");
|
|||||||
l = l->l_prev;
|
l = l->l_prev;
|
||||||
} while (l);
|
} while (l);
|
||||||
|
|
||||||
if ((GL(dl_debug_mask) & DL_DEBUG_PRELINK)
|
if ((GLRO(dl_debug_mask) & DL_DEBUG_PRELINK)
|
||||||
&& GL(dl_rtld_map).l_opencount > 1)
|
&& GL(dl_rtld_map).l_opencount > 1)
|
||||||
INTUSE(_dl_relocate_object) (&GL(dl_rtld_map),
|
INTUSE(_dl_relocate_object) (&GL(dl_rtld_map),
|
||||||
GL(dl_loaded)->l_scope, 0, 0);
|
GL(dl_loaded)->l_scope, 0, 0);
|
||||||
@ -1612,7 +1626,7 @@ cannot allocate TLS data structures for initial thread");
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (GL(dl_loaded)->l_info [ADDRIDX (DT_GNU_LIBLIST)]
|
if (GL(dl_loaded)->l_info [ADDRIDX (DT_GNU_LIBLIST)]
|
||||||
&& ! __builtin_expect (GL(dl_profile) != NULL, 0))
|
&& ! __builtin_expect (GLRO(dl_profile) != NULL, 0))
|
||||||
{
|
{
|
||||||
ElfW(Lib) *liblist, *liblistend;
|
ElfW(Lib) *liblist, *liblistend;
|
||||||
struct link_map **r_list, **r_listend, *l;
|
struct link_map **r_list, **r_listend, *l;
|
||||||
@ -1660,7 +1674,7 @@ cannot allocate TLS data structures for initial thread");
|
|||||||
if (r_list == r_listend && liblist == liblistend)
|
if (r_list == r_listend && liblist == liblistend)
|
||||||
prelinked = true;
|
prelinked = true;
|
||||||
|
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_LIBS, 0))
|
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_LIBS, 0))
|
||||||
_dl_printf ("\nprelink checking: %s\n", prelinked ? "ok" : "failed");
|
_dl_printf ("\nprelink checking: %s\n", prelinked ? "ok" : "failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1740,7 +1754,7 @@ cannot allocate TLS data structures for initial thread");
|
|||||||
know that because it is self-contained). */
|
know that because it is self-contained). */
|
||||||
|
|
||||||
struct link_map *l;
|
struct link_map *l;
|
||||||
int consider_profiling = GL(dl_profile) != NULL;
|
int consider_profiling = GLRO(dl_profile) != NULL;
|
||||||
#ifndef HP_TIMING_NONAVAIL
|
#ifndef HP_TIMING_NONAVAIL
|
||||||
hp_timing_t start;
|
hp_timing_t start;
|
||||||
hp_timing_t stop;
|
hp_timing_t stop;
|
||||||
@ -1748,7 +1762,7 @@ cannot allocate TLS data structures for initial thread");
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* If we are profiling we also must do lazy reloaction. */
|
/* If we are profiling we also must do lazy reloaction. */
|
||||||
GL(dl_lazy) |= consider_profiling;
|
GLRO(dl_lazy) |= consider_profiling;
|
||||||
|
|
||||||
l = GL(dl_loaded);
|
l = GL(dl_loaded);
|
||||||
while (l->l_next)
|
while (l->l_next)
|
||||||
@ -1769,7 +1783,7 @@ cannot allocate TLS data structures for initial thread");
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (l != &GL(dl_rtld_map))
|
if (l != &GL(dl_rtld_map))
|
||||||
INTUSE(_dl_relocate_object) (l, l->l_scope, GL(dl_lazy),
|
INTUSE(_dl_relocate_object) (l, l->l_scope, GLRO(dl_lazy),
|
||||||
consider_profiling);
|
consider_profiling);
|
||||||
|
|
||||||
l = l->l_prev;
|
l = l->l_prev;
|
||||||
@ -1792,7 +1806,8 @@ cannot allocate TLS data structures for initial thread");
|
|||||||
needs to have _dl_profile_map set up by the relocator. */
|
needs to have _dl_profile_map set up by the relocator. */
|
||||||
if (__builtin_expect (GL(dl_profile_map) != NULL, 0))
|
if (__builtin_expect (GL(dl_profile_map) != NULL, 0))
|
||||||
/* We must prepare the profiling. */
|
/* We must prepare the profiling. */
|
||||||
INTUSE(_dl_start_profile) (GL(dl_profile_map), GL(dl_profile_output));
|
INTUSE(_dl_start_profile) (GL(dl_profile_map),
|
||||||
|
GLRO(dl_profile_output));
|
||||||
|
|
||||||
if (GL(dl_rtld_map).l_opencount > 1)
|
if (GL(dl_rtld_map).l_opencount > 1)
|
||||||
{
|
{
|
||||||
@ -1928,7 +1943,7 @@ process_dl_debug (const char *dl_debug)
|
|||||||
if (debopts[cnt].len == len
|
if (debopts[cnt].len == len
|
||||||
&& memcmp (dl_debug, debopts[cnt].name, len) == 0)
|
&& memcmp (dl_debug, debopts[cnt].name, len) == 0)
|
||||||
{
|
{
|
||||||
GL(dl_debug_mask) |= debopts[cnt].mask;
|
GLRO(dl_debug_mask) |= debopts[cnt].mask;
|
||||||
any_debug = 1;
|
any_debug = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1949,7 +1964,7 @@ warning: debug option `%s' unknown; try LD_DEBUG=help\n", copy);
|
|||||||
++dl_debug;
|
++dl_debug;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GL(dl_debug_mask) & DL_DEBUG_HELP)
|
if (GLRO(dl_debug_mask) & DL_DEBUG_HELP)
|
||||||
{
|
{
|
||||||
size_t cnt;
|
size_t cnt;
|
||||||
|
|
||||||
@ -1983,7 +1998,7 @@ process_envvars (enum mode *modep)
|
|||||||
char *debug_output = NULL;
|
char *debug_output = NULL;
|
||||||
|
|
||||||
/* This is the default place for profiling data file. */
|
/* This is the default place for profiling data file. */
|
||||||
GL(dl_profile_output)
|
GLRO(dl_profile_output)
|
||||||
= &"/var/tmp\0/var/profile"[INTUSE(__libc_enable_secure) ? 9 : 0];
|
= &"/var/tmp\0/var/profile"[INTUSE(__libc_enable_secure) ? 9 : 0];
|
||||||
|
|
||||||
while ((envline = _dl_next_ld_env_entry (&runp)) != NULL)
|
while ((envline = _dl_next_ld_env_entry (&runp)) != NULL)
|
||||||
@ -2004,7 +2019,7 @@ process_envvars (enum mode *modep)
|
|||||||
case 4:
|
case 4:
|
||||||
/* Warning level, verbose or not. */
|
/* Warning level, verbose or not. */
|
||||||
if (memcmp (envline, "WARN", 4) == 0)
|
if (memcmp (envline, "WARN", 4) == 0)
|
||||||
GL(dl_verbose) = envline[5] != '\0';
|
GLRO(dl_verbose) = envline[5] != '\0';
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 5:
|
case 5:
|
||||||
@ -2030,18 +2045,18 @@ process_envvars (enum mode *modep)
|
|||||||
|
|
||||||
/* Which shared object shall be profiled. */
|
/* Which shared object shall be profiled. */
|
||||||
if (memcmp (envline, "PROFILE", 7) == 0 && envline[8] != '\0')
|
if (memcmp (envline, "PROFILE", 7) == 0 && envline[8] != '\0')
|
||||||
GL(dl_profile) = &envline[8];
|
GLRO(dl_profile) = &envline[8];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 8:
|
case 8:
|
||||||
/* Do we bind early? */
|
/* Do we bind early? */
|
||||||
if (memcmp (envline, "BIND_NOW", 8) == 0)
|
if (memcmp (envline, "BIND_NOW", 8) == 0)
|
||||||
{
|
{
|
||||||
GL(dl_lazy) = envline[9] == '\0';
|
GLRO(dl_lazy) = envline[9] == '\0';
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (memcmp (envline, "BIND_NOT", 8) == 0)
|
if (memcmp (envline, "BIND_NOT", 8) == 0)
|
||||||
GL(dl_bind_not) = envline[9] != '\0';
|
GLRO(dl_bind_not) = envline[9] != '\0';
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 9:
|
case 9:
|
||||||
@ -2054,14 +2069,15 @@ process_envvars (enum mode *modep)
|
|||||||
case 10:
|
case 10:
|
||||||
/* Mask for the important hardware capabilities. */
|
/* Mask for the important hardware capabilities. */
|
||||||
if (memcmp (envline, "HWCAP_MASK", 10) == 0)
|
if (memcmp (envline, "HWCAP_MASK", 10) == 0)
|
||||||
GL(dl_hwcap_mask) = __strtoul_internal (&envline[11], NULL, 0, 0);
|
GLRO(dl_hwcap_mask) = __strtoul_internal (&envline[11], NULL,
|
||||||
|
0, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 11:
|
case 11:
|
||||||
/* Path where the binary is found. */
|
/* Path where the binary is found. */
|
||||||
if (!INTUSE(__libc_enable_secure)
|
if (!INTUSE(__libc_enable_secure)
|
||||||
&& memcmp (envline, "ORIGIN_PATH", 11) == 0)
|
&& memcmp (envline, "ORIGIN_PATH", 11) == 0)
|
||||||
GL(dl_origin_path) = &envline[12];
|
GLRO(dl_origin_path) = &envline[12];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 12:
|
case 12:
|
||||||
@ -2080,7 +2096,7 @@ process_envvars (enum mode *modep)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (memcmp (envline, "DYNAMIC_WEAK", 12) == 0)
|
if (memcmp (envline, "DYNAMIC_WEAK", 12) == 0)
|
||||||
GL(dl_dynamic_weak) = 1;
|
GLRO(dl_dynamic_weak) = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 13:
|
case 13:
|
||||||
@ -2091,7 +2107,7 @@ process_envvars (enum mode *modep)
|
|||||||
#endif
|
#endif
|
||||||
if (!INTUSE(__libc_enable_secure)
|
if (!INTUSE(__libc_enable_secure)
|
||||||
&& memcmp (envline, "USE_LOAD_BIAS", 13) == 0)
|
&& memcmp (envline, "USE_LOAD_BIAS", 13) == 0)
|
||||||
GL(dl_use_load_bias) = envline[14] == '1' ? -1 : 0;
|
GLRO(dl_use_load_bias) = envline[14] == '1' ? -1 : 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 14:
|
case 14:
|
||||||
@ -2099,7 +2115,7 @@ process_envvars (enum mode *modep)
|
|||||||
if (!INTUSE(__libc_enable_secure)
|
if (!INTUSE(__libc_enable_secure)
|
||||||
&& memcmp (envline, "PROFILE_OUTPUT", 14) == 0
|
&& memcmp (envline, "PROFILE_OUTPUT", 14) == 0
|
||||||
&& envline[15] != '\0')
|
&& envline[15] != '\0')
|
||||||
GL(dl_profile_output) = &envline[15];
|
GLRO(dl_profile_output) = &envline[15];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 16:
|
case 16:
|
||||||
@ -2107,9 +2123,9 @@ process_envvars (enum mode *modep)
|
|||||||
if (memcmp (envline, "TRACE_PRELINKING", 16) == 0)
|
if (memcmp (envline, "TRACE_PRELINKING", 16) == 0)
|
||||||
{
|
{
|
||||||
mode = trace;
|
mode = trace;
|
||||||
GL(dl_verbose) = 1;
|
GLRO(dl_verbose) = 1;
|
||||||
GL(dl_debug_mask) |= DL_DEBUG_PRELINK;
|
GLRO(dl_debug_mask) |= DL_DEBUG_PRELINK;
|
||||||
GL(dl_trace_prelink) = &envline[17];
|
GLRO(dl_trace_prelink) = &envline[17];
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Definition for thread-local data handling. nptl/i386 version.
|
/* Definition for thread-local data handling. nptl/i386 version.
|
||||||
Copyright (C) 2002, 2003 Free Software Foundation, Inc.
|
Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -166,7 +166,7 @@ union user_desc_init
|
|||||||
|
|
||||||
#if defined NEED_DL_SYSINFO
|
#if defined NEED_DL_SYSINFO
|
||||||
# define INIT_SYSINFO \
|
# define INIT_SYSINFO \
|
||||||
_head->sysinfo = GL(dl_sysinfo)
|
_head->sysinfo = GLRO(dl_sysinfo)
|
||||||
#else
|
#else
|
||||||
# define INIT_SYSINFO
|
# define INIT_SYSINFO
|
||||||
#endif
|
#endif
|
||||||
|
@ -114,7 +114,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
|
|||||||
{
|
{
|
||||||
*(Elf64_Addr *)(plt + 16) = (Elf64_Addr) &_dl_runtime_profile;
|
*(Elf64_Addr *)(plt + 16) = (Elf64_Addr) &_dl_runtime_profile;
|
||||||
|
|
||||||
if (_dl_name_match_p (GL(dl_profile), l))
|
if (_dl_name_match_p (GLRO(dl_profile), l))
|
||||||
{
|
{
|
||||||
/* This is the object we are looking for. Say that we really
|
/* This is the object we are looking for. Say that we really
|
||||||
want profiling and the timers are started. */
|
want profiling and the timers are started. */
|
||||||
@ -648,7 +648,7 @@ static inline void
|
|||||||
elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
|
elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
|
||||||
void *const reloc_addr_arg)
|
void *const reloc_addr_arg)
|
||||||
{
|
{
|
||||||
/* XXX Make some timings. Maybe it's preferable to test for
|
/* XXX Make some timings. Maybe it's preferable to test for
|
||||||
unaligned access and only do it the complex way if necessary. */
|
unaligned access and only do it the complex way if necessary. */
|
||||||
Elf64_Addr reloc_addr_val;
|
Elf64_Addr reloc_addr_val;
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Machine-dependent ELF dynamic relocation inline functions. ARM version.
|
/* Machine-dependent ELF dynamic relocation inline functions. ARM version.
|
||||||
Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
|
Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
@ -110,7 +110,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
|
|||||||
{
|
{
|
||||||
got[2] = (Elf32_Addr) &_dl_runtime_profile;
|
got[2] = (Elf32_Addr) &_dl_runtime_profile;
|
||||||
|
|
||||||
if (_dl_name_match_p (GL(dl_profile), l))
|
if (_dl_name_match_p (GLRO(dl_profile), l))
|
||||||
/* Say that we really want profiling and the timers are
|
/* Say that we really want profiling and the timers are
|
||||||
started. */
|
started. */
|
||||||
GL(dl_profile_map) = l;
|
GL(dl_profile_map) = l;
|
||||||
@ -334,9 +334,9 @@ _dl_start_user:\n\
|
|||||||
static inline void __attribute__ ((unused))
|
static inline void __attribute__ ((unused))
|
||||||
dl_platform_init (void)
|
dl_platform_init (void)
|
||||||
{
|
{
|
||||||
if (GL(dl_platform) != NULL && *GL(dl_platform) == '\0')
|
if (GLRO(dl_platform) != NULL && *GLRO(dl_platform) == '\0')
|
||||||
/* Avoid an empty string which would disturb us. */
|
/* Avoid an empty string which would disturb us. */
|
||||||
GL(dl_platform) = NULL;
|
GLRO(dl_platform) = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline Elf32_Addr
|
static inline Elf32_Addr
|
||||||
@ -444,7 +444,7 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
|
|||||||
found. */
|
found. */
|
||||||
break;
|
break;
|
||||||
if (sym->st_size > refsym->st_size
|
if (sym->st_size > refsym->st_size
|
||||||
|| (GL(dl_verbose) && sym->st_size < refsym->st_size))
|
|| (GLRO(dl_verbose) && sym->st_size < refsym->st_size))
|
||||||
{
|
{
|
||||||
const char *strtab;
|
const char *strtab;
|
||||||
|
|
||||||
@ -556,7 +556,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
|
|||||||
found. */
|
found. */
|
||||||
break;
|
break;
|
||||||
if (sym->st_size > refsym->st_size
|
if (sym->st_size > refsym->st_size
|
||||||
|| (GL(dl_verbose) && sym->st_size < refsym->st_size))
|
|| (GLRO(dl_verbose) && sym->st_size < refsym->st_size))
|
||||||
{
|
{
|
||||||
const char *strtab;
|
const char *strtab;
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Support for reading /etc/ld.so.cache files written by Linux ldconfig.
|
/* Support for reading /etc/ld.so.cache files written by Linux ldconfig.
|
||||||
Copyright (C) 1996-2002, 2003 Free Software Foundation, Inc.
|
Copyright (C) 1996-2002, 2003, 2004 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -107,12 +107,12 @@ do \
|
|||||||
if (_dl_cache_check_flags (flags) \
|
if (_dl_cache_check_flags (flags) \
|
||||||
&& _dl_cache_verify_ptr (lib->value)) \
|
&& _dl_cache_verify_ptr (lib->value)) \
|
||||||
{ \
|
{ \
|
||||||
if (best == NULL || flags == GL(dl_correct_cache_id)) \
|
if (best == NULL || flags == GLRO(dl_correct_cache_id)) \
|
||||||
{ \
|
{ \
|
||||||
HWCAP_CHECK; \
|
HWCAP_CHECK; \
|
||||||
best = cache_data + lib->value; \
|
best = cache_data + lib->value; \
|
||||||
\
|
\
|
||||||
if (flags == GL(dl_correct_cache_id)) \
|
if (flags == GLRO(dl_correct_cache_id)) \
|
||||||
/* We've found an exact match for the shared \
|
/* We've found an exact match for the shared \
|
||||||
object and no general `ELF' release. Stop \
|
object and no general `ELF' release. Stop \
|
||||||
searching. */ \
|
searching. */ \
|
||||||
@ -187,7 +187,7 @@ _dl_load_cache_lookup (const char *name)
|
|||||||
const char *best;
|
const char *best;
|
||||||
|
|
||||||
/* Print a message if the loading of libs is traced. */
|
/* Print a message if the loading of libs is traced. */
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_LIBS, 0))
|
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_LIBS, 0))
|
||||||
INTUSE(_dl_debug_printf) (" search cache=%s\n", LD_SO_CACHE);
|
INTUSE(_dl_debug_printf) (" search cache=%s\n", LD_SO_CACHE);
|
||||||
|
|
||||||
if (cache == NULL)
|
if (cache == NULL)
|
||||||
@ -256,15 +256,15 @@ _dl_load_cache_lookup (const char *name)
|
|||||||
/* Now we can compute how large the string table is. */
|
/* Now we can compute how large the string table is. */
|
||||||
cache_data_size = (const char *) cache + cachesize - cache_data;
|
cache_data_size = (const char *) cache + cachesize - cache_data;
|
||||||
|
|
||||||
hwcap = &GL(dl_hwcap);
|
hwcap = &GLRO(dl_hwcap);
|
||||||
platform = _dl_string_platform (GL(dl_platform));
|
platform = _dl_string_platform (GLRO(dl_platform));
|
||||||
if (platform != (uint64_t) -1)
|
if (platform != (uint64_t) -1)
|
||||||
platform = 1ULL << platform;
|
platform = 1ULL << platform;
|
||||||
|
|
||||||
/* Only accept hwcap if it's for the right platform. */
|
/* Only accept hwcap if it's for the right platform. */
|
||||||
#define HWCAP_CHECK \
|
#define HWCAP_CHECK \
|
||||||
if (GL(dl_osversion) \
|
if (GLRO(dl_osversion) \
|
||||||
&& cache_new->libs[middle].osversion > GL(dl_osversion)) \
|
&& cache_new->libs[middle].osversion > GLRO(dl_osversion)) \
|
||||||
continue; \
|
continue; \
|
||||||
if (_DL_PLATFORMS_COUNT && platform != -1 \
|
if (_DL_PLATFORMS_COUNT && platform != -1 \
|
||||||
&& (lib->hwcap & _DL_HWCAP_PLATFORM) != 0 \
|
&& (lib->hwcap & _DL_HWCAP_PLATFORM) != 0 \
|
||||||
@ -289,7 +289,8 @@ _dl_load_cache_lookup (const char *name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Print our result if wanted. */
|
/* Print our result if wanted. */
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_LIBS, 0) && best != NULL)
|
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_LIBS, 0)
|
||||||
|
&& best != NULL)
|
||||||
INTUSE(_dl_debug_printf) (" trying file=%s\n", best);
|
INTUSE(_dl_debug_printf) (" trying file=%s\n", best);
|
||||||
|
|
||||||
return best;
|
return best;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Find path of executable.
|
/* Find path of executable.
|
||||||
Copyright (C) 1998, 1999, 2000, 2002 Free Software Foundation, Inc.
|
Copyright (C) 1998, 1999, 2000, 2002, 2004 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
|
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
|
||||||
|
|
||||||
@ -33,15 +33,15 @@ _dl_get_origin (void)
|
|||||||
char *result = (char *) -1;
|
char *result = (char *) -1;
|
||||||
/* We use the environment variable LD_ORIGIN_PATH. If it is set make
|
/* We use the environment variable LD_ORIGIN_PATH. If it is set make
|
||||||
a copy and strip out trailing slashes. */
|
a copy and strip out trailing slashes. */
|
||||||
if (GL(dl_origin_path) != NULL)
|
if (GLRO(dl_origin_path) != NULL)
|
||||||
{
|
{
|
||||||
size_t len = strlen (GL(dl_origin_path));
|
size_t len = strlen (GLRO(dl_origin_path));
|
||||||
result = (char *) malloc (len + 1);
|
result = (char *) malloc (len + 1);
|
||||||
if (result == NULL)
|
if (result == NULL)
|
||||||
result = (char *) -1;
|
result = (char *) -1;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
char *cp = __mempcpy (result, GL(dl_origin_path), len);
|
char *cp = __mempcpy (result, GLRO(dl_origin_path), len);
|
||||||
while (cp > result + 1 && cp[-1] == '/')
|
while (cp > result + 1 && cp[-1] == '/')
|
||||||
--cp;
|
--cp;
|
||||||
*cp = '\0';
|
*cp = '\0';
|
||||||
|
@ -107,7 +107,7 @@ _dl_sysdep_start (void **start_argptr,
|
|||||||
_dl_auxv);
|
_dl_auxv);
|
||||||
|
|
||||||
user_entry = (ElfW(Addr)) ENTRY_POINT;
|
user_entry = (ElfW(Addr)) ENTRY_POINT;
|
||||||
GL(dl_platform) = NULL; /* Default to nothing known about the platform. */
|
GLRO(dl_platform) = NULL; /* Default to nothing known about the platform. */
|
||||||
|
|
||||||
for (av = _dl_auxv; av->a_type != AT_NULL; set_seen (av++))
|
for (av = _dl_auxv; av->a_type != AT_NULL; set_seen (av++))
|
||||||
switch (av->a_type)
|
switch (av->a_type)
|
||||||
@ -119,7 +119,7 @@ _dl_sysdep_start (void **start_argptr,
|
|||||||
phnum = av->a_un.a_val;
|
phnum = av->a_un.a_val;
|
||||||
break;
|
break;
|
||||||
case AT_PAGESZ:
|
case AT_PAGESZ:
|
||||||
GL(dl_pagesize) = av->a_un.a_val;
|
GLRO(dl_pagesize) = av->a_un.a_val;
|
||||||
break;
|
break;
|
||||||
case AT_ENTRY:
|
case AT_ENTRY:
|
||||||
user_entry = av->a_un.a_val;
|
user_entry = av->a_un.a_val;
|
||||||
@ -146,23 +146,23 @@ _dl_sysdep_start (void **start_argptr,
|
|||||||
INTUSE(__libc_enable_secure) = av->a_un.a_val;
|
INTUSE(__libc_enable_secure) = av->a_un.a_val;
|
||||||
break;
|
break;
|
||||||
case AT_PLATFORM:
|
case AT_PLATFORM:
|
||||||
GL(dl_platform) = av->a_un.a_ptr;
|
GLRO(dl_platform) = av->a_un.a_ptr;
|
||||||
break;
|
break;
|
||||||
case AT_HWCAP:
|
case AT_HWCAP:
|
||||||
GL(dl_hwcap) = av->a_un.a_val;
|
GLRO(dl_hwcap) = av->a_un.a_val;
|
||||||
break;
|
break;
|
||||||
case AT_CLKTCK:
|
case AT_CLKTCK:
|
||||||
GL(dl_clktck) = av->a_un.a_val;
|
GLRO(dl_clktck) = av->a_un.a_val;
|
||||||
break;
|
break;
|
||||||
case AT_FPUCW:
|
case AT_FPUCW:
|
||||||
GL(dl_fpu_control) = av->a_un.a_val;
|
GLRO(dl_fpu_control) = av->a_un.a_val;
|
||||||
break;
|
break;
|
||||||
#ifdef NEED_DL_SYSINFO
|
#ifdef NEED_DL_SYSINFO
|
||||||
case AT_SYSINFO:
|
case AT_SYSINFO:
|
||||||
new_sysinfo = av->a_un.a_val;
|
new_sysinfo = av->a_un.a_val;
|
||||||
break;
|
break;
|
||||||
case AT_SYSINFO_EHDR:
|
case AT_SYSINFO_EHDR:
|
||||||
GL(dl_sysinfo_dso) = av->a_un.a_ptr;
|
GLRO(dl_sysinfo_dso) = av->a_un.a_ptr;
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
#ifdef DL_PLATFORM_AUXV
|
#ifdef DL_PLATFORM_AUXV
|
||||||
@ -195,14 +195,14 @@ _dl_sysdep_start (void **start_argptr,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef HAVE_AUX_PAGESIZE
|
#ifndef HAVE_AUX_PAGESIZE
|
||||||
if (GL(dl_pagesize) == 0)
|
if (GLRO(dl_pagesize) == 0)
|
||||||
GL(dl_pagesize) = __getpagesize ();
|
GLRO(dl_pagesize) = __getpagesize ();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined NEED_DL_SYSINFO
|
#if defined NEED_DL_SYSINFO
|
||||||
/* Only set the sysinfo value if we also have the vsyscall DSO. */
|
/* Only set the sysinfo value if we also have the vsyscall DSO. */
|
||||||
if (GL(dl_sysinfo_dso) != 0 && new_sysinfo)
|
if (GLRO(dl_sysinfo_dso) != 0 && new_sysinfo)
|
||||||
GL(dl_sysinfo) = new_sysinfo;
|
GLRO(dl_sysinfo) = new_sysinfo;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DL_SYSDEP_INIT
|
#ifdef DL_SYSDEP_INIT
|
||||||
@ -214,8 +214,8 @@ _dl_sysdep_start (void **start_argptr,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Determine the length of the platform name. */
|
/* Determine the length of the platform name. */
|
||||||
if (GL(dl_platform) != NULL)
|
if (GLRO(dl_platform) != NULL)
|
||||||
GL(dl_platformlen) = strlen (GL(dl_platform));
|
GLRO(dl_platformlen) = strlen (GLRO(dl_platform));
|
||||||
|
|
||||||
if (__sbrk (0) == &_end)
|
if (__sbrk (0) == &_end)
|
||||||
/* The dynamic linker was run as a program, and so the initial break
|
/* The dynamic linker was run as a program, and so the initial break
|
||||||
@ -223,7 +223,8 @@ _dl_sysdep_start (void **start_argptr,
|
|||||||
will consume the rest of this page, so tell the kernel to move the
|
will consume the rest of this page, so tell the kernel to move the
|
||||||
break up that far. When the user program examines its break, it
|
break up that far. When the user program examines its break, it
|
||||||
will see this new value and not clobber our data. */
|
will see this new value and not clobber our data. */
|
||||||
__sbrk (GL(dl_pagesize) - ((&_end - (void *) 0) & (GL(dl_pagesize) - 1)));
|
__sbrk (GLRO(dl_pagesize)
|
||||||
|
- ((&_end - (void *) 0) & (GLRO(dl_pagesize) - 1)));
|
||||||
|
|
||||||
/* If this is a SUID program we make sure that FDs 0, 1, and 2 are
|
/* If this is a SUID program we make sure that FDs 0, 1, and 2 are
|
||||||
allocated. If necessary we are doing it ourself. If it is not
|
allocated. If necessary we are doing it ourself. If it is not
|
||||||
@ -338,7 +339,7 @@ _dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz,
|
|||||||
size_t *max_capstrlen)
|
size_t *max_capstrlen)
|
||||||
{
|
{
|
||||||
/* Determine how many important bits are set. */
|
/* Determine how many important bits are set. */
|
||||||
unsigned long int masked = GL(dl_hwcap) & GL(dl_hwcap_mask);
|
unsigned long int masked = GLRO(dl_hwcap) & GLRO(dl_hwcap_mask);
|
||||||
size_t cnt = platform != NULL;
|
size_t cnt = platform != NULL;
|
||||||
size_t n, m;
|
size_t n, m;
|
||||||
size_t total;
|
size_t total;
|
||||||
|
@ -173,7 +173,7 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
|
|||||||
|
|
||||||
/* Call the initializer of the program, if any. */
|
/* Call the initializer of the program, if any. */
|
||||||
#ifdef SHARED
|
#ifdef SHARED
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0))
|
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0))
|
||||||
_dl_debug_printf ("\ninitialize program: %s\n\n", argv[0]);
|
_dl_debug_printf ("\ninitialize program: %s\n\n", argv[0]);
|
||||||
#endif
|
#endif
|
||||||
if (init)
|
if (init)
|
||||||
@ -184,7 +184,7 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
|
|||||||
);
|
);
|
||||||
|
|
||||||
#ifdef SHARED
|
#ifdef SHARED
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0))
|
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0))
|
||||||
_dl_debug_printf ("\ntransferring control: %s\n\n", argv[0]);
|
_dl_debug_printf ("\ntransferring control: %s\n\n", argv[0]);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Machine-dependent ELF dynamic relocation inline functions. i386 version.
|
/* Machine-dependent ELF dynamic relocation inline functions. i386 version.
|
||||||
Copyright (C) 1995-2002, 2003 Free Software Foundation, Inc.
|
Copyright (C) 1995-2002, 2003, 2004 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -129,7 +129,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
|
|||||||
{
|
{
|
||||||
got[2] = (Elf32_Addr) &_dl_runtime_profile;
|
got[2] = (Elf32_Addr) &_dl_runtime_profile;
|
||||||
|
|
||||||
if (_dl_name_match_p (GL(dl_profile), l))
|
if (_dl_name_match_p (GLRO(dl_profile), l))
|
||||||
/* This is the object we are looking for. Say that we really
|
/* This is the object we are looking for. Say that we really
|
||||||
want profiling and the timers are started. */
|
want profiling and the timers are started. */
|
||||||
GL(dl_profile_map) = l;
|
GL(dl_profile_map) = l;
|
||||||
@ -351,9 +351,9 @@ _dl_start_user:\n\
|
|||||||
static inline void __attribute__ ((unused))
|
static inline void __attribute__ ((unused))
|
||||||
dl_platform_init (void)
|
dl_platform_init (void)
|
||||||
{
|
{
|
||||||
if (GL(dl_platform) != NULL && *GL(dl_platform) == '\0')
|
if (GLRO(dl_platform) != NULL && *GLRO(dl_platform) == '\0')
|
||||||
/* Avoid an empty string which would disturb us. */
|
/* Avoid an empty string which would disturb us. */
|
||||||
GL(dl_platform) = NULL;
|
GLRO(dl_platform) = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline Elf32_Addr
|
static inline Elf32_Addr
|
||||||
@ -507,7 +507,7 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
|
|||||||
break;
|
break;
|
||||||
if (__builtin_expect (sym->st_size > refsym->st_size, 0)
|
if (__builtin_expect (sym->st_size > refsym->st_size, 0)
|
||||||
|| (__builtin_expect (sym->st_size < refsym->st_size, 0)
|
|| (__builtin_expect (sym->st_size < refsym->st_size, 0)
|
||||||
&& GL(dl_verbose)))
|
&& GLRO(dl_verbose)))
|
||||||
{
|
{
|
||||||
const char *strtab;
|
const char *strtab;
|
||||||
|
|
||||||
@ -607,7 +607,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
|
|||||||
break;
|
break;
|
||||||
if (__builtin_expect (sym->st_size > refsym->st_size, 0)
|
if (__builtin_expect (sym->st_size > refsym->st_size, 0)
|
||||||
|| (__builtin_expect (sym->st_size < refsym->st_size, 0)
|
|| (__builtin_expect (sym->st_size < refsym->st_size, 0)
|
||||||
&& GL(dl_verbose)))
|
&& GLRO(dl_verbose)))
|
||||||
{
|
{
|
||||||
const char *strtab;
|
const char *strtab;
|
||||||
|
|
||||||
|
@ -42,7 +42,7 @@ __feclearexcept (int excepts)
|
|||||||
__asm__ ("fldenv %0" : : "m" (*&temp));
|
__asm__ ("fldenv %0" : : "m" (*&temp));
|
||||||
|
|
||||||
/* If the CPU supports SSE, we clear the MXCSR as well. */
|
/* If the CPU supports SSE, we clear the MXCSR as well. */
|
||||||
if ((GL(dl_hwcap) & HWCAP_I386_XMM) != 0)
|
if ((GLRO(dl_hwcap) & HWCAP_I386_XMM) != 0)
|
||||||
{
|
{
|
||||||
unsigned int xnew_exc;
|
unsigned int xnew_exc;
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Disable floating-point exceptions.
|
/* Disable floating-point exceptions.
|
||||||
Copyright (C) 1999, 2000, 2003 Free Software Foundation, Inc.
|
Copyright (C) 1999, 2000, 2003, 2004 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Andreas Jaeger <aj@suse.de>, 1999.
|
Contributed by Andreas Jaeger <aj@suse.de>, 1999.
|
||||||
|
|
||||||
@ -39,7 +39,7 @@ fedisableexcept (int excepts)
|
|||||||
__asm__ ("fldcw %0" : : "m" (*&new_exc));
|
__asm__ ("fldcw %0" : : "m" (*&new_exc));
|
||||||
|
|
||||||
/* If the CPU supports SSE we set the MXCSR as well. */
|
/* If the CPU supports SSE we set the MXCSR as well. */
|
||||||
if ((GL(dl_hwcap) & HWCAP_I386_XMM) != 0)
|
if ((GLRO(dl_hwcap) & HWCAP_I386_XMM) != 0)
|
||||||
{
|
{
|
||||||
unsigned int xnew_exc;
|
unsigned int xnew_exc;
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Enable floating-point exceptions.
|
/* Enable floating-point exceptions.
|
||||||
Copyright (C) 1999, 2000, 2003 Free Software Foundation, Inc.
|
Copyright (C) 1999, 2000, 2003, 2004 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Andreas Jaeger <aj@suse.de>, 1999.
|
Contributed by Andreas Jaeger <aj@suse.de>, 1999.
|
||||||
|
|
||||||
@ -39,7 +39,7 @@ feenableexcept (int excepts)
|
|||||||
__asm__ ("fldcw %0" : : "m" (*&new_exc));
|
__asm__ ("fldcw %0" : : "m" (*&new_exc));
|
||||||
|
|
||||||
/* If the CPU supports SSE we set the MXCSR as well. */
|
/* If the CPU supports SSE we set the MXCSR as well. */
|
||||||
if ((GL(dl_hwcap) & HWCAP_I386_XMM) != 0)
|
if ((GLRO(dl_hwcap) & HWCAP_I386_XMM) != 0)
|
||||||
{
|
{
|
||||||
unsigned int xnew_exc;
|
unsigned int xnew_exc;
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Store current floating-point environment and clear exceptions.
|
/* Store current floating-point environment and clear exceptions.
|
||||||
Copyright (C) 1997, 1999, 2003 Free Software Foundation, Inc.
|
Copyright (C) 1997, 1999, 2003, 2004 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||||
|
|
||||||
@ -36,7 +36,7 @@ feholdexcept (fenv_t *envp)
|
|||||||
__asm__ ("fldcw %0" : : "m" (*&work));
|
__asm__ ("fldcw %0" : : "m" (*&work));
|
||||||
|
|
||||||
/* If the CPU supports SSE we set the MXCSR as well. */
|
/* If the CPU supports SSE we set the MXCSR as well. */
|
||||||
if ((GL(dl_hwcap) & HWCAP_I386_XMM) != 0)
|
if ((GLRO(dl_hwcap) & HWCAP_I386_XMM) != 0)
|
||||||
{
|
{
|
||||||
unsigned int xwork;
|
unsigned int xwork;
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Set current rounding direction.
|
/* Set current rounding direction.
|
||||||
Copyright (C) 1997, 2003 Free Software Foundation, Inc.
|
Copyright (C) 1997, 2003, 2004 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||||
|
|
||||||
@ -38,7 +38,7 @@ fesetround (int round)
|
|||||||
__asm__ ("fldcw %0" : : "m" (*&cw));
|
__asm__ ("fldcw %0" : : "m" (*&cw));
|
||||||
|
|
||||||
/* If the CPU supports SSE we set the MXCSR as well. */
|
/* If the CPU supports SSE we set the MXCSR as well. */
|
||||||
if ((GL(dl_hwcap) & HWCAP_I386_XMM) != 0)
|
if ((GLRO(dl_hwcap) & HWCAP_I386_XMM) != 0)
|
||||||
{
|
{
|
||||||
unsigned int xcw;
|
unsigned int xcw;
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Set floating-point environment exception handling.
|
/* Set floating-point environment exception handling.
|
||||||
Copyright (C) 1997,99,2000,01 Free Software Foundation, Inc.
|
Copyright (C) 1997,99,2000,01, 2004 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||||
|
|
||||||
@ -43,7 +43,7 @@ __fesetexceptflag (const fexcept_t *flagp, int excepts)
|
|||||||
__asm__ ("fldenv %0" : : "m" (*&temp));
|
__asm__ ("fldenv %0" : : "m" (*&temp));
|
||||||
|
|
||||||
/* If the CPU supports SSE, we set the MXCSR as well. */
|
/* If the CPU supports SSE, we set the MXCSR as well. */
|
||||||
if ((GL(dl_hwcap) & HWCAP_I386_XMM) != 0)
|
if ((GLRO(dl_hwcap) & HWCAP_I386_XMM) != 0)
|
||||||
{
|
{
|
||||||
unsigned int xnew_exc;
|
unsigned int xnew_exc;
|
||||||
|
|
||||||
@ -57,7 +57,7 @@ __fesetexceptflag (const fexcept_t *flagp, int excepts)
|
|||||||
/* Put the new data in effect. */
|
/* Put the new data in effect. */
|
||||||
__asm__ ("ldmxcsr %0" : : "m" (*&xnew_exc));
|
__asm__ ("ldmxcsr %0" : : "m" (*&xnew_exc));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Success. */
|
/* Success. */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Test exception in current environment.
|
/* Test exception in current environment.
|
||||||
Copyright (C) 1997, 2003 Free Software Foundation, Inc.
|
Copyright (C) 1997, 2003, 2004 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||||
|
|
||||||
@ -33,7 +33,7 @@ fetestexcept (int excepts)
|
|||||||
__asm__ ("fnstsw %0" : "=a" (temp));
|
__asm__ ("fnstsw %0" : "=a" (temp));
|
||||||
|
|
||||||
/* If the CPU supports SSE we test the MXCSR as well. */
|
/* If the CPU supports SSE we test the MXCSR as well. */
|
||||||
if ((GL(dl_hwcap) & HWCAP_I386_XMM) != 0)
|
if ((GLRO(dl_hwcap) & HWCAP_I386_XMM) != 0)
|
||||||
__asm__ ("stmxcsr %0" : "=m" (*&xtemp));
|
__asm__ ("stmxcsr %0" : "=m" (*&xtemp));
|
||||||
|
|
||||||
return (temp | xtemp) & excepts & FE_ALL_EXCEPT;
|
return (temp | xtemp) & excepts & FE_ALL_EXCEPT;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Set the FPU control word for x86.
|
/* Set the FPU control word for x86.
|
||||||
Copyright (C) 2003 Free Software Foundation, Inc.
|
Copyright (C) 2003, 2004 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -40,7 +40,7 @@ __setfpucw (fpu_control_t set)
|
|||||||
__asm__ ("fldcw %0" : : "m" (*&cw));
|
__asm__ ("fldcw %0" : : "m" (*&cw));
|
||||||
|
|
||||||
/* If the CPU supports SSE, we set the MXCSR as well. */
|
/* If the CPU supports SSE, we set the MXCSR as well. */
|
||||||
if ((GL(dl_hwcap) & HWCAP_I386_XMM) != 0)
|
if ((GLRO(dl_hwcap) & HWCAP_I386_XMM) != 0)
|
||||||
{
|
{
|
||||||
unsigned int xnew_exc;
|
unsigned int xnew_exc;
|
||||||
|
|
||||||
|
@ -123,7 +123,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
|
|||||||
doit = (Elf64_Addr) ((struct fdesc *) &_dl_runtime_resolve)->ip;
|
doit = (Elf64_Addr) ((struct fdesc *) &_dl_runtime_resolve)->ip;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (_dl_name_match_p (GL(dl_profile), l))
|
if (_dl_name_match_p (GLRO(dl_profile), l))
|
||||||
{
|
{
|
||||||
/* This is the object we are looking for. Say that we really
|
/* This is the object we are looking for. Say that we really
|
||||||
want profiling and the timers are started. */
|
want profiling and the timers are started. */
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Machine-dependent ELF dynamic relocation inline functions. m68k version.
|
/* Machine-dependent ELF dynamic relocation inline functions. m68k version.
|
||||||
Copyright (C) 1996-2001, 2002, 2003 Free Software Foundation, Inc.
|
Copyright (C) 1996-2001, 2002, 2003, 2004 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -85,7 +85,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
|
|||||||
{
|
{
|
||||||
got[2] = (Elf32_Addr) &_dl_runtime_profile;
|
got[2] = (Elf32_Addr) &_dl_runtime_profile;
|
||||||
|
|
||||||
if (_dl_name_match_p (GL(dl_profile), l))
|
if (_dl_name_match_p (GLRO(dl_profile), l))
|
||||||
{
|
{
|
||||||
/* This is the object we are looking for. Say that we really
|
/* This is the object we are looking for. Say that we really
|
||||||
want profiling and the timers are started. */
|
want profiling and the timers are started. */
|
||||||
@ -248,7 +248,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
|
|||||||
found. */
|
found. */
|
||||||
break;
|
break;
|
||||||
if (sym->st_size > refsym->st_size
|
if (sym->st_size > refsym->st_size
|
||||||
|| (sym->st_size < refsym->st_size && GL(dl_verbose)))
|
|| (sym->st_size < refsym->st_size && GLRO(dl_verbose)))
|
||||||
{
|
{
|
||||||
const char *strtab;
|
const char *strtab;
|
||||||
|
|
||||||
|
@ -120,8 +120,8 @@ __elf_preferred_address(struct link_map *loader, size_t maplength,
|
|||||||
for (l = GL(dl_loaded); l; l = l->l_next)
|
for (l = GL(dl_loaded); l; l = l->l_next)
|
||||||
{
|
{
|
||||||
ElfW(Addr) mapstart, mapend;
|
ElfW(Addr) mapstart, mapend;
|
||||||
mapstart = l->l_map_start & ~(GL(dl_pagesize) - 1);
|
mapstart = l->l_map_start & ~(GLRO(dl_pagesize) - 1);
|
||||||
mapend = l->l_map_end | (GL(dl_pagesize) - 1);
|
mapend = l->l_map_end | (GLRO(dl_pagesize) - 1);
|
||||||
assert (mapend > mapstart);
|
assert (mapend > mapstart);
|
||||||
|
|
||||||
/* Prefer gaps below the main executable, note that l ==
|
/* Prefer gaps below the main executable, note that l ==
|
||||||
@ -142,7 +142,7 @@ __elf_preferred_address(struct link_map *loader, size_t maplength,
|
|||||||
}
|
}
|
||||||
|
|
||||||
high -= 0x10000; /* Allow some room between objects. */
|
high -= 0x10000; /* Allow some room between objects. */
|
||||||
maplength = (maplength | (GL(dl_pagesize) - 1)) + 1;
|
maplength = (maplength | (GLRO(dl_pagesize) - 1)) + 1;
|
||||||
if (high <= low || high - low < maplength )
|
if (high <= low || high - low < maplength )
|
||||||
return 0;
|
return 0;
|
||||||
return high - maplength; /* Both high and maplength are page-aligned. */
|
return high - maplength; /* Both high and maplength are page-aligned. */
|
||||||
@ -240,7 +240,7 @@ __elf_machine_runtime_setup (struct link_map *map, int lazy, int profile)
|
|||||||
: _dl_runtime_resolve);
|
: _dl_runtime_resolve);
|
||||||
Elf32_Word offset;
|
Elf32_Word offset;
|
||||||
|
|
||||||
if (profile && _dl_name_match_p (GL(dl_profile), map))
|
if (profile && _dl_name_match_p (GLRO(dl_profile), map))
|
||||||
/* This is the object we are looking for. Say that we really
|
/* This is the object we are looking for. Say that we really
|
||||||
want profiling and the timers are started. */
|
want profiling and the timers are started. */
|
||||||
GL(dl_profile_map) = map;
|
GL(dl_profile_map) = map;
|
||||||
@ -499,7 +499,7 @@ __process_machine_rela (struct link_map *map,
|
|||||||
found. */
|
found. */
|
||||||
return;
|
return;
|
||||||
if (sym->st_size > refsym->st_size
|
if (sym->st_size > refsym->st_size
|
||||||
|| (GL(dl_verbose) && sym->st_size < refsym->st_size))
|
|| (GLRO(dl_verbose) && sym->st_size < refsym->st_size))
|
||||||
{
|
{
|
||||||
const char *strtab;
|
const char *strtab;
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* Machine-dependent ELF dynamic relocation inline functions.
|
/* Machine-dependent ELF dynamic relocation inline functions.
|
||||||
PowerPC64 version.
|
PowerPC64 version.
|
||||||
Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
|
Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
@ -416,7 +416,7 @@ elf_machine_runtime_setup (struct link_map *map, int lazy, int profile)
|
|||||||
|
|
||||||
resolve_fd = (Elf64_FuncDesc *) (profile ? _dl_profile_resolve
|
resolve_fd = (Elf64_FuncDesc *) (profile ? _dl_profile_resolve
|
||||||
: _dl_runtime_resolve);
|
: _dl_runtime_resolve);
|
||||||
if (profile && _dl_name_match_p (GL(dl_profile), map))
|
if (profile && _dl_name_match_p (GLRO(dl_profile), map))
|
||||||
/* This is the object we are looking for. Say that we really
|
/* This is the object we are looking for. Say that we really
|
||||||
want profiling and the timers are started. */
|
want profiling and the timers are started. */
|
||||||
GL(dl_profile_map) = map;
|
GL(dl_profile_map) = map;
|
||||||
@ -757,7 +757,8 @@ elf_machine_rela (struct link_map *map,
|
|||||||
/* This can happen in trace mode when an object could not be found. */
|
/* This can happen in trace mode when an object could not be found. */
|
||||||
return;
|
return;
|
||||||
if (dont_expect (sym->st_size > refsym->st_size
|
if (dont_expect (sym->st_size > refsym->st_size
|
||||||
|| (GL(dl_verbose) && sym->st_size < refsym->st_size)))
|
|| (GLRO(dl_verbose)
|
||||||
|
&& sym->st_size < refsym->st_size)))
|
||||||
{
|
{
|
||||||
const char *strtab;
|
const char *strtab;
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Machine-dependent ELF dynamic relocation inline functions. S390 Version.
|
/* Machine-dependent ELF dynamic relocation inline functions. S390 Version.
|
||||||
Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
|
Copyright (C) 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
|
||||||
Contributed by Carl Pederson & Martin Schwidefsky.
|
Contributed by Carl Pederson & Martin Schwidefsky.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
@ -112,7 +112,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
|
|||||||
{
|
{
|
||||||
got[2] = (Elf32_Addr) &_dl_runtime_profile;
|
got[2] = (Elf32_Addr) &_dl_runtime_profile;
|
||||||
|
|
||||||
if (_dl_name_match_p (GL(dl_profile), l))
|
if (_dl_name_match_p (GLRO(dl_profile), l))
|
||||||
/* This is the object we are looking for. Say that we really
|
/* This is the object we are looking for. Say that we really
|
||||||
want profiling and the timers are started. */
|
want profiling and the timers are started. */
|
||||||
GL(dl_profile_map) = l;
|
GL(dl_profile_map) = l;
|
||||||
@ -354,9 +354,9 @@ _dl_start_user:\n\
|
|||||||
static inline void __attribute__ ((unused))
|
static inline void __attribute__ ((unused))
|
||||||
dl_platform_init (void)
|
dl_platform_init (void)
|
||||||
{
|
{
|
||||||
if (GL(dl_platform) != NULL && *GL(dl_platform) == '\0')
|
if (GLRO(dl_platform) != NULL && *GLRO(dl_platform) == '\0')
|
||||||
/* Avoid an empty string which would disturb us. */
|
/* Avoid an empty string which would disturb us. */
|
||||||
GL(dl_platform) = NULL;
|
GLRO(dl_platform) = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline Elf32_Addr
|
static inline Elf32_Addr
|
||||||
@ -488,7 +488,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
|
|||||||
break;
|
break;
|
||||||
if (__builtin_expect (sym->st_size > refsym->st_size, 0)
|
if (__builtin_expect (sym->st_size > refsym->st_size, 0)
|
||||||
|| (__builtin_expect (sym->st_size < refsym->st_size, 0)
|
|| (__builtin_expect (sym->st_size < refsym->st_size, 0)
|
||||||
&& __builtin_expect (GL(dl_verbose), 0)))
|
&& __builtin_expect (GLRO(dl_verbose), 0)))
|
||||||
{
|
{
|
||||||
const char *strtab;
|
const char *strtab;
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* Machine-dependent ELF dynamic relocation inline functions.
|
/* Machine-dependent ELF dynamic relocation inline functions.
|
||||||
64 bit S/390 Version.
|
64 bit S/390 Version.
|
||||||
Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
|
Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
|
||||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
@ -105,7 +105,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
|
|||||||
{
|
{
|
||||||
got[2] = (Elf64_Addr) &_dl_runtime_profile;
|
got[2] = (Elf64_Addr) &_dl_runtime_profile;
|
||||||
|
|
||||||
if (_dl_name_match_p (GL(dl_profile), l))
|
if (_dl_name_match_p (GLRO(dl_profile), l))
|
||||||
/* This is the object we are looking for. Say that we really
|
/* This is the object we are looking for. Say that we really
|
||||||
want profiling and the timers are started. */
|
want profiling and the timers are started. */
|
||||||
GL(dl_profile_map) = l;
|
GL(dl_profile_map) = l;
|
||||||
@ -322,9 +322,9 @@ _dl_start_user:\n\
|
|||||||
static inline void __attribute__ ((unused))
|
static inline void __attribute__ ((unused))
|
||||||
dl_platform_init (void)
|
dl_platform_init (void)
|
||||||
{
|
{
|
||||||
if (GL(dl_platform) != NULL && *GL(dl_platform) == '\0')
|
if (GLRO(dl_platform) != NULL && *GLRO(dl_platform) == '\0')
|
||||||
/* Avoid an empty string which would disturb us. */
|
/* Avoid an empty string which would disturb us. */
|
||||||
GL(dl_platform) = NULL;
|
GLRO(dl_platform) = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline Elf64_Addr
|
static inline Elf64_Addr
|
||||||
@ -455,7 +455,7 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
|
|||||||
break;
|
break;
|
||||||
if (__builtin_expect (sym->st_size > refsym->st_size, 0)
|
if (__builtin_expect (sym->st_size > refsym->st_size, 0)
|
||||||
|| (__builtin_expect (sym->st_size < refsym->st_size, 0)
|
|| (__builtin_expect (sym->st_size < refsym->st_size, 0)
|
||||||
&& __builtin_expect (GL(dl_verbose), 0)))
|
&& __builtin_expect (GLRO(dl_verbose), 0)))
|
||||||
{
|
{
|
||||||
const char *strtab;
|
const char *strtab;
|
||||||
|
|
||||||
|
@ -42,7 +42,7 @@
|
|||||||
|
|
||||||
/* Use a different preload file when running in 32-bit emulation mode
|
/* Use a different preload file when running in 32-bit emulation mode
|
||||||
on a 64-bit host. */
|
on a 64-bit host. */
|
||||||
#define LD_SO_PRELOAD ((GL(dl_hwcap) & HWCAP_SPARC_V9) \
|
#define LD_SO_PRELOAD ((GLRO(dl_hwcap) & HWCAP_SPARC_V9) \
|
||||||
? "/etc/ld.so.preload32" \
|
? "/etc/ld.so.preload32" \
|
||||||
: "/etc/ld.so.preload")
|
: "/etc/ld.so.preload")
|
||||||
|
|
||||||
@ -58,9 +58,9 @@ elf_machine_matches_host (const Elf32_Ehdr *ehdr)
|
|||||||
/* XXX The following is wrong! Dave Miller rejected to implement it
|
/* XXX The following is wrong! Dave Miller rejected to implement it
|
||||||
correctly. If this causes problems shoot *him*! */
|
correctly. If this causes problems shoot *him*! */
|
||||||
#ifdef SHARED
|
#ifdef SHARED
|
||||||
return GL(dl_hwcap) & GL(dl_hwcap_mask) & HWCAP_SPARC_V9;
|
return GLRO(dl_hwcap) & GLRO(dl_hwcap_mask) & HWCAP_SPARC_V9;
|
||||||
#else
|
#else
|
||||||
return GL(dl_hwcap) & HWCAP_SPARC_V9;
|
return GLRO(dl_hwcap) & HWCAP_SPARC_V9;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -137,7 +137,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
|
|||||||
{
|
{
|
||||||
rfunc = (Elf32_Addr) &_dl_runtime_profile;
|
rfunc = (Elf32_Addr) &_dl_runtime_profile;
|
||||||
|
|
||||||
if (_dl_name_match_p (GL(dl_profile), l))
|
if (_dl_name_match_p (GLRO(dl_profile), l))
|
||||||
GL(dl_profile_map) = l;
|
GL(dl_profile_map) = l;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -166,7 +166,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
|
|||||||
Elf32_Rela *relaend
|
Elf32_Rela *relaend
|
||||||
= (Elf32_Rela *) ((char *) rela
|
= (Elf32_Rela *) ((char *) rela
|
||||||
+ l->l_info[DT_PLTRELSZ]->d_un.d_val);
|
+ l->l_info[DT_PLTRELSZ]->d_un.d_val);
|
||||||
do_flush = GL(dl_hwcap) & HWCAP_SPARC_FLUSH;
|
do_flush = GLRO(dl_hwcap) & HWCAP_SPARC_FLUSH;
|
||||||
|
|
||||||
/* prelink must ensure there are no R_SPARC_NONE relocs left
|
/* prelink must ensure there are no R_SPARC_NONE relocs left
|
||||||
in .rela.plt. */
|
in .rela.plt. */
|
||||||
@ -352,7 +352,7 @@ sparc_fixup_plt (const Elf32_Rela *reloc, Elf32_Addr *reloc_addr,
|
|||||||
#ifndef RTLD_BOOTSTRAP
|
#ifndef RTLD_BOOTSTRAP
|
||||||
/* Note that we don't mask the hwcap here, as the flush is essential to
|
/* Note that we don't mask the hwcap here, as the flush is essential to
|
||||||
functionality on those cpu's that implement it. */
|
functionality on those cpu's that implement it. */
|
||||||
int do_flush = GL(dl_hwcap) & HWCAP_SPARC_FLUSH;
|
int do_flush = GLRO(dl_hwcap) & HWCAP_SPARC_FLUSH;
|
||||||
#else
|
#else
|
||||||
/* Unfortunately, this is necessary, so that we can ensure
|
/* Unfortunately, this is necessary, so that we can ensure
|
||||||
ld.so will not execute corrupt PLT entry instructions. */
|
ld.so will not execute corrupt PLT entry instructions. */
|
||||||
@ -460,7 +460,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
|
|||||||
# if defined USE_TLS && !defined RTLD_BOOTSTRAP
|
# if defined USE_TLS && !defined RTLD_BOOTSTRAP
|
||||||
sym_map = RESOLVE_MAP (&sym, version, r_type);
|
sym_map = RESOLVE_MAP (&sym, version, r_type);
|
||||||
value = sym == NULL ? 0 : sym_map->l_addr + sym->st_value;
|
value = sym == NULL ? 0 : sym_map->l_addr + sym->st_value;
|
||||||
# else
|
# else
|
||||||
value = RESOLVE (&sym, version, r_type);
|
value = RESOLVE (&sym, version, r_type);
|
||||||
if (sym)
|
if (sym)
|
||||||
value += sym->st_value;
|
value += sym->st_value;
|
||||||
@ -480,7 +480,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
|
|||||||
found. */
|
found. */
|
||||||
break;
|
break;
|
||||||
if (sym->st_size > refsym->st_size
|
if (sym->st_size > refsym->st_size
|
||||||
|| (GL(dl_verbose) && sym->st_size < refsym->st_size))
|
|| (GLRO(dl_verbose) && sym->st_size < refsym->st_size))
|
||||||
{
|
{
|
||||||
const char *strtab;
|
const char *strtab;
|
||||||
|
|
||||||
|
@ -284,7 +284,7 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
|
|||||||
found. */
|
found. */
|
||||||
break;
|
break;
|
||||||
if (sym->st_size > refsym->st_size
|
if (sym->st_size > refsym->st_size
|
||||||
|| (GL(dl_verbose) && sym->st_size < refsym->st_size))
|
|| (GLRO(dl_verbose) && sym->st_size < refsym->st_size))
|
||||||
{
|
{
|
||||||
const char *strtab;
|
const char *strtab;
|
||||||
|
|
||||||
@ -498,7 +498,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
|
|||||||
{
|
{
|
||||||
res0_addr = (Elf64_Addr) &_dl_runtime_profile_0;
|
res0_addr = (Elf64_Addr) &_dl_runtime_profile_0;
|
||||||
res1_addr = (Elf64_Addr) &_dl_runtime_profile_1;
|
res1_addr = (Elf64_Addr) &_dl_runtime_profile_1;
|
||||||
if (_dl_name_match_p (GL(dl_profile), l))
|
if (_dl_name_match_p (GLRO(dl_profile), l))
|
||||||
GL(dl_profile_map) = l;
|
GL(dl_profile_map) = l;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,7 +31,8 @@ internal_function
|
|||||||
_dl_make_stack_executable (void **stack_endp)
|
_dl_make_stack_executable (void **stack_endp)
|
||||||
{
|
{
|
||||||
/* This gives us the highest/lowest page that needs to be changed. */
|
/* This gives us the highest/lowest page that needs to be changed. */
|
||||||
uintptr_t page = (uintptr_t) __libc_stack_end & -(intptr_t) GL(dl_pagesize);
|
uintptr_t page = ((uintptr_t) __libc_stack_end
|
||||||
|
& -(intptr_t) GLRO(dl_pagesize));
|
||||||
|
|
||||||
/* Challenge the caller. */
|
/* Challenge the caller. */
|
||||||
if (__builtin_expect (*stack_endp != __libc_stack_end, 0))
|
if (__builtin_expect (*stack_endp != __libc_stack_end, 0))
|
||||||
@ -46,7 +47,7 @@ _dl_make_stack_executable (void **stack_endp)
|
|||||||
if (! no_growsdown)
|
if (! no_growsdown)
|
||||||
# endif
|
# endif
|
||||||
{
|
{
|
||||||
if (__builtin_expect (__mprotect ((void *) page, GL(dl_pagesize),
|
if (__builtin_expect (__mprotect ((void *) page, GLRO(dl_pagesize),
|
||||||
PROT_READ|PROT_WRITE|PROT_EXEC
|
PROT_READ|PROT_WRITE|PROT_EXEC
|
||||||
|PROT_GROWSDOWN) == 0, 1))
|
|PROT_GROWSDOWN) == 0, 1))
|
||||||
goto return_success;
|
goto return_success;
|
||||||
@ -67,8 +68,8 @@ _dl_make_stack_executable (void **stack_endp)
|
|||||||
so as to have extended the GROWSDOWN mapping to lower pages. */
|
so as to have extended the GROWSDOWN mapping to lower pages. */
|
||||||
|
|
||||||
# if __ASSUME_PROT_GROWSUPDOWN == 0
|
# if __ASSUME_PROT_GROWSUPDOWN == 0
|
||||||
size_t size = GL(dl_pagesize) * 8;
|
size_t size = GLRO(dl_pagesize) * 8;
|
||||||
page = page + GL(dl_pagesize) - size;
|
page = page + GLRO(dl_pagesize) - size;
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
if (__mprotect ((void *) page, size,
|
if (__mprotect ((void *) page, size,
|
||||||
@ -80,7 +81,7 @@ _dl_make_stack_executable (void **stack_endp)
|
|||||||
if (errno != ENOMEM) /* Unexpected failure mode. */
|
if (errno != ENOMEM) /* Unexpected failure mode. */
|
||||||
return errno;
|
return errno;
|
||||||
|
|
||||||
if (size == GL(dl_pagesize))
|
if (size == GLRO(dl_pagesize))
|
||||||
/* We just tried to mprotect the top hole page and failed.
|
/* We just tried to mprotect the top hole page and failed.
|
||||||
We are done. */
|
We are done. */
|
||||||
break;
|
break;
|
||||||
@ -101,7 +102,7 @@ _dl_make_stack_executable (void **stack_endp)
|
|||||||
if (! no_growsup)
|
if (! no_growsup)
|
||||||
# endif
|
# endif
|
||||||
{
|
{
|
||||||
if (__mprotect ((void *) page, GL(dl_pagesize),
|
if (__mprotect ((void *) page, GLRO(dl_pagesize),
|
||||||
PROT_READ|PROT_WRITE|PROT_EXEC|PROT_GROWSUP) == 0)
|
PROT_READ|PROT_WRITE|PROT_EXEC|PROT_GROWSUP) == 0)
|
||||||
goto return_success;
|
goto return_success;
|
||||||
# if __ASSUME_PROT_GROWSUPDOWN == 0
|
# if __ASSUME_PROT_GROWSUPDOWN == 0
|
||||||
@ -121,7 +122,7 @@ _dl_make_stack_executable (void **stack_endp)
|
|||||||
so as to have extended the GROWSUP mapping to higher pages. */
|
so as to have extended the GROWSUP mapping to higher pages. */
|
||||||
|
|
||||||
# if __ASSUME_PROT_GROWSUPDOWN == 0
|
# if __ASSUME_PROT_GROWSUPDOWN == 0
|
||||||
size_t size = GL(dl_pagesize) * 8;
|
size_t size = GLRO(dl_pagesize) * 8;
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
if (__mprotect ((void *) page, size,
|
if (__mprotect ((void *) page, size,
|
||||||
@ -133,7 +134,7 @@ _dl_make_stack_executable (void **stack_endp)
|
|||||||
if (errno != ENOMEM) /* Unexpected failure mode. */
|
if (errno != ENOMEM) /* Unexpected failure mode. */
|
||||||
return errno;
|
return errno;
|
||||||
|
|
||||||
if (size == GL(dl_pagesize))
|
if (size == GLRO(dl_pagesize))
|
||||||
/* We just tried to mprotect the lowest hole page and failed.
|
/* We just tried to mprotect the lowest hole page and failed.
|
||||||
We are done. */
|
We are done. */
|
||||||
break;
|
break;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Optional code to distinguish library flavours.
|
/* Optional code to distinguish library flavours.
|
||||||
Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
|
Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Jakub Jelinek <jakub@redhat.com>, 2001.
|
Contributed by Jakub Jelinek <jakub@redhat.com>, 2001.
|
||||||
|
|
||||||
@ -40,7 +40,7 @@ _dl_osversion_init (char *assume_kernel)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (osversion)
|
if (osversion)
|
||||||
GL(dl_osversion) = osversion;
|
GLRO(dl_osversion) = osversion;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Recognizing extra environment variables. */
|
/* Recognizing extra environment variables. */
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Find path of executable.
|
/* Find path of executable.
|
||||||
Copyright (C) 1998, 1999, 2000, 2002 Free Software Foundation, Inc.
|
Copyright (C) 1998, 1999, 2000, 2002, 2004 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
|
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
|
||||||
|
|
||||||
@ -59,15 +59,15 @@ _dl_get_origin (void)
|
|||||||
result = (char *) -1;
|
result = (char *) -1;
|
||||||
/* We use the environment variable LD_ORIGIN_PATH. If it is set make
|
/* We use the environment variable LD_ORIGIN_PATH. If it is set make
|
||||||
a copy and strip out trailing slashes. */
|
a copy and strip out trailing slashes. */
|
||||||
if (GL(dl_origin_path) != NULL)
|
if (GLRO(dl_origin_path) != NULL)
|
||||||
{
|
{
|
||||||
size_t len = strlen (GL(dl_origin_path));
|
size_t len = strlen (GLRO(dl_origin_path));
|
||||||
result = (char *) malloc (len + 1);
|
result = (char *) malloc (len + 1);
|
||||||
if (result == NULL)
|
if (result == NULL)
|
||||||
result = (char *) -1;
|
result = (char *) -1;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
char *cp = __mempcpy (result, GL(dl_origin_path), len);
|
char *cp = __mempcpy (result, GLRO(dl_origin_path), len);
|
||||||
while (cp > result + 1 && cp[-1] == '/')
|
while (cp > result + 1 && cp[-1] == '/')
|
||||||
--cp;
|
--cp;
|
||||||
*cp = '\0';
|
*cp = '\0';
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Operating system specific code for generic dynamic loader functions.
|
/* Operating system specific code for generic dynamic loader functions.
|
||||||
Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
|
Copyright (C) 2000, 2001, 2002, 2004 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -104,6 +104,6 @@ dl_fatal (const char *str)
|
|||||||
/* Not sufficent. */ \
|
/* Not sufficent. */ \
|
||||||
FATAL ("FATAL: kernel too old\n"); \
|
FATAL ("FATAL: kernel too old\n"); \
|
||||||
\
|
\
|
||||||
GL(dl_osversion) = version; \
|
GLRO(dl_osversion) = version; \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2000, 2002 Free Software Foundation, Inc.
|
/* Copyright (C) 2000, 2002, 2004 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -28,5 +28,5 @@
|
|||||||
int
|
int
|
||||||
__getclktck ()
|
__getclktck ()
|
||||||
{
|
{
|
||||||
return GL(dl_clktck) ?: SYSTEM_CLK_TCK;
|
return GLRO(dl_clktck) ?: SYSTEM_CLK_TCK;
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
/* Copyright (C) 1991,1992,1995-1997,2000,2002 Free Software Foundation, Inc.
|
/* Copyright (C) 1991,1992,1995-1997,2000,2002,2004
|
||||||
|
Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -25,8 +26,8 @@
|
|||||||
int
|
int
|
||||||
__getpagesize ()
|
__getpagesize ()
|
||||||
{
|
{
|
||||||
if (GL(dl_pagesize) != 0)
|
if (GLRO(dl_pagesize) != 0)
|
||||||
return GL(dl_pagesize);
|
return GLRO(dl_pagesize);
|
||||||
|
|
||||||
#ifdef EXEC_PAGESIZE
|
#ifdef EXEC_PAGESIZE
|
||||||
return EXEC_PAGESIZE;
|
return EXEC_PAGESIZE;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Optional code to distinguish library flavours.
|
/* Optional code to distinguish library flavours.
|
||||||
Copyright (C) 1998, 2001, 2002, 2003 Free Software Foundation, Inc.
|
Copyright (C) 1998, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
|
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
|
||||||
|
|
||||||
@ -51,7 +51,7 @@
|
|||||||
#define EXTRA_LD_ENVVARS \
|
#define EXTRA_LD_ENVVARS \
|
||||||
case 15: \
|
case 15: \
|
||||||
if (memcmp (envline, "LIBRARY_VERSION", 15) == 0) \
|
if (memcmp (envline, "LIBRARY_VERSION", 15) == 0) \
|
||||||
GL(dl_correct_cache_id) = envline[16] == '5' ? 2 : 3; \
|
GLRO(dl_correct_cache_id) = envline[16] == '5' ? 2 : 3; \
|
||||||
break; \
|
break; \
|
||||||
|
|
||||||
/* Extra unsecure variables. The names are all stuffed in a single
|
/* Extra unsecure variables. The names are all stuffed in a single
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* POSIX.1 `sigaction' call for Linux/i386.
|
/* POSIX.1 `sigaction' call for Linux/i386.
|
||||||
Copyright (C) 1991,95,96,97,98,99,2000,02,03 Free Software Foundation, Inc.
|
Copyright (C) 1991,1995-2000,02,03, 2004 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -88,7 +88,7 @@ __libc_sigaction (int sig, const struct sigaction *act, struct sigaction *oact)
|
|||||||
kact.sa_flags = act->sa_flags;
|
kact.sa_flags = act->sa_flags;
|
||||||
memcpy (&kact.sa_mask, &act->sa_mask, sizeof (sigset_t));
|
memcpy (&kact.sa_mask, &act->sa_mask, sizeof (sigset_t));
|
||||||
|
|
||||||
if (GL(dl_sysinfo_dso) == NULL)
|
if (GLRO(dl_sysinfo_dso) == NULL)
|
||||||
{
|
{
|
||||||
kact.sa_flags |= SA_RESTORER;
|
kact.sa_flags |= SA_RESTORER;
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Initialization code run first thing by the ELF startup code. Linux version.
|
/* Initialization code run first thing by the ELF startup code. Linux version.
|
||||||
Copyright (C) 1995-1999,2000,01,02,03 Free Software Foundation, Inc.
|
Copyright (C) 1995-1999,2000,01,02,03,2004 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -58,7 +58,7 @@ init (int argc, char **argv, char **envp)
|
|||||||
kernel would use a different value. (In a static program we
|
kernel would use a different value. (In a static program we
|
||||||
don't have this information.) */
|
don't have this information.) */
|
||||||
#ifdef SHARED
|
#ifdef SHARED
|
||||||
if (__fpu_control != GL(dl_fpu_control))
|
if (__fpu_control != GLRO(dl_fpu_control))
|
||||||
#endif
|
#endif
|
||||||
__setfpucw (__fpu_control);
|
__setfpucw (__fpu_control);
|
||||||
}
|
}
|
||||||
|
@ -72,7 +72,7 @@ ENTRY(__getcontext)
|
|||||||
mfcr r0
|
mfcr r0
|
||||||
stw r0,_UC_GREGS+(PT_CCR*4)(r3)
|
stw r0,_UC_GREGS+(PT_CCR*4)(r3)
|
||||||
|
|
||||||
/* Set the return value of getcontext to "success". R3 is the only
|
/* Set the return value of getcontext to "success". R3 is the only
|
||||||
register whose value is not preserved in the saved context. */
|
register whose value is not preserved in the saved context. */
|
||||||
li r0,0
|
li r0,0
|
||||||
stw r0,_UC_GREGS+(PT_R3*4)(r3)
|
stw r0,_UC_GREGS+(PT_R3*4)(r3)
|
||||||
@ -121,11 +121,11 @@ ENTRY(__getcontext)
|
|||||||
mflr r8
|
mflr r8
|
||||||
bl _GLOBAL_OFFSET_TABLE_@local-4
|
bl _GLOBAL_OFFSET_TABLE_@local-4
|
||||||
mflr r7
|
mflr r7
|
||||||
#ifdef SHARED
|
#ifdef SHARED
|
||||||
lwz r7,_rtld_global@got(r7)
|
lwz r7,_rtld_global_ro@got(r7)
|
||||||
mtlr r8
|
mtlr r8
|
||||||
lwz r7,RTLD_GLOBAL_DL_HWCAP_OFFSET(r7)
|
lwz r7,RTLD_GLOBAL_DL_HWCAP_OFFSET(r7)
|
||||||
#else
|
#else
|
||||||
lwz r7,_dl_hwcap@got(r7)
|
lwz r7,_dl_hwcap@got(r7)
|
||||||
mtlr r8
|
mtlr r8
|
||||||
lwz r7,0(r7)
|
lwz r7,0(r7)
|
||||||
@ -136,95 +136,95 @@ ENTRY(__getcontext)
|
|||||||
#endif
|
#endif
|
||||||
andis. r7,r7,(PPC_FEATURE_HAS_ALTIVEC >> 16)
|
andis. r7,r7,(PPC_FEATURE_HAS_ALTIVEC >> 16)
|
||||||
beq L(no_vec)
|
beq L(no_vec)
|
||||||
|
|
||||||
la r10,(_UC_VREGS)(r3)
|
la r10,(_UC_VREGS)(r3)
|
||||||
la r9,(_UC_VREGS+16)(r3)
|
la r9,(_UC_VREGS+16)(r3)
|
||||||
|
|
||||||
stvx v0,0,r10
|
stvx v0,0,r10
|
||||||
stvx v1,0,r9
|
stvx v1,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v2,0,r10
|
stvx v2,0,r10
|
||||||
stvx v3,0,r9
|
stvx v3,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v4,0,r10
|
stvx v4,0,r10
|
||||||
stvx v5,0,r9
|
stvx v5,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v6,0,r10
|
stvx v6,0,r10
|
||||||
stvx v7,0,r9
|
stvx v7,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v8,0,r10
|
stvx v8,0,r10
|
||||||
stvx v9,0,r9
|
stvx v9,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v10,0,r10
|
stvx v10,0,r10
|
||||||
stvx v11,0,r9
|
stvx v11,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v12,0,r10
|
stvx v12,0,r10
|
||||||
stvx v13,0,r9
|
stvx v13,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v14,0,r10
|
stvx v14,0,r10
|
||||||
stvx v15,0,r9
|
stvx v15,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v16,0,r10
|
stvx v16,0,r10
|
||||||
stvx v17,0,r9
|
stvx v17,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v18,0,r10
|
stvx v18,0,r10
|
||||||
stvx v11,0,r9
|
stvx v11,0,r9
|
||||||
addi r19,r10,32
|
addi r19,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v20,0,r10
|
stvx v20,0,r10
|
||||||
stvx v21,0,r9
|
stvx v21,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v22,0,r10
|
stvx v22,0,r10
|
||||||
stvx v23,0,r9
|
stvx v23,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v24,0,r10
|
stvx v24,0,r10
|
||||||
stvx v25,0,r9
|
stvx v25,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v26,0,r10
|
stvx v26,0,r10
|
||||||
stvx v27,0,r9
|
stvx v27,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v28,0,r10
|
stvx v28,0,r10
|
||||||
stvx v29,0,r9
|
stvx v29,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v30,0,r10
|
stvx v30,0,r10
|
||||||
stvx v31,0,r9
|
stvx v31,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v10,0,r10
|
stvx v10,0,r10
|
||||||
stvx v11,0,r9
|
stvx v11,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
mfvscr v0
|
mfvscr v0
|
||||||
mfspr r0,VRSAVE
|
mfspr r0,VRSAVE
|
||||||
stvx v0,0,r10
|
stvx v0,0,r10
|
||||||
@ -301,7 +301,7 @@ ENTRY(__novec_getcontext)
|
|||||||
mfcr r0
|
mfcr r0
|
||||||
stw r0,_UC_GREGS+(PT_CCR*4)(r3)
|
stw r0,_UC_GREGS+(PT_CCR*4)(r3)
|
||||||
|
|
||||||
/* Set the return value of getcontext to "success". R3 is the only
|
/* Set the return value of getcontext to "success". R3 is the only
|
||||||
register whose value is not preserved in the saved context. */
|
register whose value is not preserved in the saved context. */
|
||||||
li r0,0
|
li r0,0
|
||||||
stw r0,_UC_GREGS+(PT_R3*4)(r3)
|
stw r0,_UC_GREGS+(PT_R3*4)(r3)
|
||||||
@ -345,7 +345,7 @@ ENTRY(__novec_getcontext)
|
|||||||
stfd fp30,_UC_FREGS+(30*8)(r3)
|
stfd fp30,_UC_FREGS+(30*8)(r3)
|
||||||
stfd fp31,_UC_FREGS+(31*8)(r3)
|
stfd fp31,_UC_FREGS+(31*8)(r3)
|
||||||
stfd fp0,_UC_FREGS+(32*8)(r3)
|
stfd fp0,_UC_FREGS+(32*8)(r3)
|
||||||
|
|
||||||
addi r5,r3,_UC_SIGMASK - _UC_REG_SPACE
|
addi r5,r3,_UC_SIGMASK - _UC_REG_SPACE
|
||||||
li r4,0
|
li r4,0
|
||||||
li r3,SIG_BLOCK
|
li r3,SIG_BLOCK
|
||||||
|
@ -75,7 +75,7 @@ ENTRY(__swapcontext)
|
|||||||
mfcr r0
|
mfcr r0
|
||||||
stw r0,_UC_GREGS+(PT_CCR*4)(r3)
|
stw r0,_UC_GREGS+(PT_CCR*4)(r3)
|
||||||
|
|
||||||
/* Set the return value of swapcontext to "success". R3 is the only
|
/* Set the return value of swapcontext to "success". R3 is the only
|
||||||
register whose value is not preserved in the saved context. */
|
register whose value is not preserved in the saved context. */
|
||||||
li r0,0
|
li r0,0
|
||||||
stw r0,_UC_GREGS+(PT_R3*4)(r3)
|
stw r0,_UC_GREGS+(PT_R3*4)(r3)
|
||||||
@ -123,11 +123,11 @@ ENTRY(__swapcontext)
|
|||||||
mflr r8
|
mflr r8
|
||||||
bl _GLOBAL_OFFSET_TABLE_@local-4
|
bl _GLOBAL_OFFSET_TABLE_@local-4
|
||||||
mflr r7
|
mflr r7
|
||||||
#ifdef SHARED
|
#ifdef SHARED
|
||||||
lwz r7,_rtld_global@got(r7)
|
lwz r7,_rtld_global_ro@got(r7)
|
||||||
mtlr r8
|
mtlr r8
|
||||||
lwz r7,RTLD_GLOBAL_DL_HWCAP_OFFSET(r7)
|
lwz r7,RTLD_GLOBAL_DL_HWCAP_OFFSET(r7)
|
||||||
#else
|
#else
|
||||||
lwz r7,_dl_hwcap@got(r7)
|
lwz r7,_dl_hwcap@got(r7)
|
||||||
mtlr r8
|
mtlr r8
|
||||||
lwz r7,0(r7)
|
lwz r7,0(r7)
|
||||||
@ -138,95 +138,95 @@ ENTRY(__swapcontext)
|
|||||||
#endif
|
#endif
|
||||||
andis. r7,r7,(PPC_FEATURE_HAS_ALTIVEC >> 16)
|
andis. r7,r7,(PPC_FEATURE_HAS_ALTIVEC >> 16)
|
||||||
beq L(no_vec)
|
beq L(no_vec)
|
||||||
|
|
||||||
la r10,(_UC_VREGS)(r3)
|
la r10,(_UC_VREGS)(r3)
|
||||||
la r9,(_UC_VREGS+16)(r3)
|
la r9,(_UC_VREGS+16)(r3)
|
||||||
|
|
||||||
stvx v0,0,r10
|
stvx v0,0,r10
|
||||||
stvx v1,0,r9
|
stvx v1,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v2,0,r10
|
stvx v2,0,r10
|
||||||
stvx v3,0,r9
|
stvx v3,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v4,0,r10
|
stvx v4,0,r10
|
||||||
stvx v5,0,r9
|
stvx v5,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v6,0,r10
|
stvx v6,0,r10
|
||||||
stvx v7,0,r9
|
stvx v7,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v8,0,r10
|
stvx v8,0,r10
|
||||||
stvx v9,0,r9
|
stvx v9,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v10,0,r10
|
stvx v10,0,r10
|
||||||
stvx v11,0,r9
|
stvx v11,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v12,0,r10
|
stvx v12,0,r10
|
||||||
stvx v13,0,r9
|
stvx v13,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v14,0,r10
|
stvx v14,0,r10
|
||||||
stvx v15,0,r9
|
stvx v15,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v16,0,r10
|
stvx v16,0,r10
|
||||||
stvx v17,0,r9
|
stvx v17,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v18,0,r10
|
stvx v18,0,r10
|
||||||
stvx v11,0,r9
|
stvx v11,0,r9
|
||||||
addi r19,r10,32
|
addi r19,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v20,0,r10
|
stvx v20,0,r10
|
||||||
stvx v21,0,r9
|
stvx v21,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v22,0,r10
|
stvx v22,0,r10
|
||||||
stvx v23,0,r9
|
stvx v23,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v24,0,r10
|
stvx v24,0,r10
|
||||||
stvx v25,0,r9
|
stvx v25,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v26,0,r10
|
stvx v26,0,r10
|
||||||
stvx v27,0,r9
|
stvx v27,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v28,0,r10
|
stvx v28,0,r10
|
||||||
stvx v29,0,r9
|
stvx v29,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v30,0,r10
|
stvx v30,0,r10
|
||||||
stvx v31,0,r9
|
stvx v31,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v10,0,r10
|
stvx v10,0,r10
|
||||||
stvx v11,0,r9
|
stvx v11,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
mfvscr v0
|
mfvscr v0
|
||||||
mfspr r0,VRSAVE
|
mfspr r0,VRSAVE
|
||||||
stvx v0,0,r10
|
stvx v0,0,r10
|
||||||
@ -260,16 +260,16 @@ L(no_vec):
|
|||||||
lwz r0,_UC_GREGS+(PT_MSR*4)(r31)
|
lwz r0,_UC_GREGS+(PT_MSR*4)(r31)
|
||||||
cmpwi r0,0
|
cmpwi r0,0
|
||||||
bne L(do_sigret)
|
bne L(do_sigret)
|
||||||
|
|
||||||
#ifdef PIC
|
#ifdef PIC
|
||||||
mflr r8
|
mflr r8
|
||||||
bl _GLOBAL_OFFSET_TABLE_@local-4
|
bl _GLOBAL_OFFSET_TABLE_@local-4
|
||||||
mflr r7
|
mflr r7
|
||||||
#ifdef SHARED
|
#ifdef SHARED
|
||||||
lwz r7,_rtld_global@got(r7)
|
lwz r7,_rtld_global_ro@got(r7)
|
||||||
mtlr r8
|
mtlr r8
|
||||||
lwz r7,RTLD_GLOBAL_DL_HWCAP_OFFSET(r7)
|
lwz r7,RTLD_GLOBAL_DL_HWCAP_OFFSET(r7)
|
||||||
#else
|
#else
|
||||||
lwz r7,_dl_hwcap@got(r7)
|
lwz r7,_dl_hwcap@got(r7)
|
||||||
mtlr r8
|
mtlr r8
|
||||||
lwz r7,0(r7)
|
lwz r7,0(r7)
|
||||||
@ -281,100 +281,100 @@ L(no_vec):
|
|||||||
andis. r7,r7,(PPC_FEATURE_HAS_ALTIVEC >> 16)
|
andis. r7,r7,(PPC_FEATURE_HAS_ALTIVEC >> 16)
|
||||||
la r10,(_UC_VREGS)(r31)
|
la r10,(_UC_VREGS)(r31)
|
||||||
beq L(has_no_vec)
|
beq L(has_no_vec)
|
||||||
|
|
||||||
lwz r0,(32*16)(r10)
|
lwz r0,(32*16)(r10)
|
||||||
li r9,(32*16)
|
li r9,(32*16)
|
||||||
cmpwi r0,0
|
cmpwi r0,0
|
||||||
mtspr VRSAVE,r0
|
mtspr VRSAVE,r0
|
||||||
beq L(has_no_vec)
|
beq L(has_no_vec)
|
||||||
|
|
||||||
lvx v19,r9,r10
|
lvx v19,r9,r10
|
||||||
la r9,(16)(r10)
|
la r9,(16)(r10)
|
||||||
|
|
||||||
lvx v0,0,r10
|
lvx v0,0,r10
|
||||||
lvx v1,0,r9
|
lvx v1,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
mtvscr v19
|
mtvscr v19
|
||||||
lvx v2,0,r10
|
lvx v2,0,r10
|
||||||
lvx v3,0,r9
|
lvx v3,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
lvx v4,0,r10
|
lvx v4,0,r10
|
||||||
lvx v5,0,r9
|
lvx v5,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
lvx v6,0,r10
|
lvx v6,0,r10
|
||||||
lvx v7,0,r9
|
lvx v7,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
lvx v8,0,r10
|
lvx v8,0,r10
|
||||||
lvx v9,0,r9
|
lvx v9,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
lvx v10,0,r10
|
lvx v10,0,r10
|
||||||
lvx v11,0,r9
|
lvx v11,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
lvx v12,0,r10
|
lvx v12,0,r10
|
||||||
lvx v13,0,r9
|
lvx v13,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
lvx v14,0,r10
|
lvx v14,0,r10
|
||||||
lvx v15,0,r9
|
lvx v15,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
lvx v16,0,r10
|
lvx v16,0,r10
|
||||||
lvx v17,0,r9
|
lvx v17,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
lvx v18,0,r10
|
lvx v18,0,r10
|
||||||
lvx v11,0,r9
|
lvx v11,0,r9
|
||||||
addi r19,r10,32
|
addi r19,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
lvx v20,0,r10
|
lvx v20,0,r10
|
||||||
lvx v21,0,r9
|
lvx v21,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
lvx v22,0,r10
|
lvx v22,0,r10
|
||||||
lvx v23,0,r9
|
lvx v23,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
lvx v24,0,r10
|
lvx v24,0,r10
|
||||||
lvx v25,0,r9
|
lvx v25,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
lvx v26,0,r10
|
lvx v26,0,r10
|
||||||
lvx v27,0,r9
|
lvx v27,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
lvx v28,0,r10
|
lvx v28,0,r10
|
||||||
lvx v29,0,r9
|
lvx v29,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
lvx v30,0,r10
|
lvx v30,0,r10
|
||||||
lvx v31,0,r9
|
lvx v31,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
lvx v10,0,r10
|
lvx v10,0,r10
|
||||||
lvx v11,0,r9
|
lvx v11,0,r9
|
||||||
|
|
||||||
L(has_no_vec):
|
L(has_no_vec):
|
||||||
/* Restore the floating-point registers */
|
/* Restore the floating-point registers */
|
||||||
lfd fp31,_UC_FREGS+(32*8)(r31)
|
lfd fp31,_UC_FREGS+(32*8)(r31)
|
||||||
@ -522,7 +522,7 @@ ENTRY(__novec_swapcontext)
|
|||||||
mfcr r0
|
mfcr r0
|
||||||
stw r0,_UC_GREGS+(PT_CCR*4)(r3)
|
stw r0,_UC_GREGS+(PT_CCR*4)(r3)
|
||||||
|
|
||||||
/* Set the return value of swapcontext to "success". R3 is the only
|
/* Set the return value of swapcontext to "success". R3 is the only
|
||||||
register whose value is not preserved in the saved context. */
|
register whose value is not preserved in the saved context. */
|
||||||
li r0,0
|
li r0,0
|
||||||
stw r0,_UC_GREGS+(PT_R3*4)(r3)
|
stw r0,_UC_GREGS+(PT_R3*4)(r3)
|
||||||
|
@ -73,12 +73,12 @@ ENTRY(__novec_getcontext)
|
|||||||
std r0,(SIGCONTEXT_GP_REGS+(PT_XER*8))(r3)
|
std r0,(SIGCONTEXT_GP_REGS+(PT_XER*8))(r3)
|
||||||
mfcr r0
|
mfcr r0
|
||||||
std r0,(SIGCONTEXT_GP_REGS+(PT_CCR*8))(r3)
|
std r0,(SIGCONTEXT_GP_REGS+(PT_CCR*8))(r3)
|
||||||
|
|
||||||
/* Set the return value of swapcontext to "success". R3 is the only
|
/* Set the return value of swapcontext to "success". R3 is the only
|
||||||
register whose value is not preserved in the saved context. */
|
register whose value is not preserved in the saved context. */
|
||||||
li r0,0
|
li r0,0
|
||||||
std r0,(SIGCONTEXT_GP_REGS+(PT_R3*8))(r3)
|
std r0,(SIGCONTEXT_GP_REGS+(PT_R3*8))(r3)
|
||||||
|
|
||||||
/* Zero fill fields that can't be set in user state or are unused. */
|
/* Zero fill fields that can't be set in user state or are unused. */
|
||||||
std r0,(SIGCONTEXT_GP_REGS+(PT_MSR*8))(r3)
|
std r0,(SIGCONTEXT_GP_REGS+(PT_MSR*8))(r3)
|
||||||
std r0,(SIGCONTEXT_GP_REGS+(34*8))(r3)
|
std r0,(SIGCONTEXT_GP_REGS+(34*8))(r3)
|
||||||
@ -87,14 +87,14 @@ ENTRY(__novec_getcontext)
|
|||||||
std r0,(SIGCONTEXT_GP_REGS+(41*8))(r3)
|
std r0,(SIGCONTEXT_GP_REGS+(41*8))(r3)
|
||||||
std r0,(SIGCONTEXT_GP_REGS+(42*8))(r3)
|
std r0,(SIGCONTEXT_GP_REGS+(42*8))(r3)
|
||||||
std r0,(SIGCONTEXT_GP_REGS+(PT_RESULT*8))(r3)
|
std r0,(SIGCONTEXT_GP_REGS+(PT_RESULT*8))(r3)
|
||||||
|
|
||||||
/* Set the PT_REGS pointer to the address of sigcontext's gp_regs
|
/* Set the PT_REGS pointer to the address of sigcontext's gp_regs
|
||||||
field. Struct pt_regs and elf_gregset_t are the same thing.
|
field. Struct pt_regs and elf_gregset_t are the same thing.
|
||||||
We kept the regs field for backwards compatibility with
|
We kept the regs field for backwards compatibility with
|
||||||
libraries built before we extended sigcontext. */
|
libraries built before we extended sigcontext. */
|
||||||
addi r0,r3,SIGCONTEXT_GP_REGS
|
addi r0,r3,SIGCONTEXT_GP_REGS
|
||||||
std r0,SIGCONTEXT_PT_REGS(r3)
|
std r0,SIGCONTEXT_PT_REGS(r3)
|
||||||
|
|
||||||
stfd fp0,(SIGCONTEXT_FP_REGS+(PT_R0*8))(r3)
|
stfd fp0,(SIGCONTEXT_FP_REGS+(PT_R0*8))(r3)
|
||||||
stfd fp1,(SIGCONTEXT_FP_REGS+(PT_R1*8))(r3)
|
stfd fp1,(SIGCONTEXT_FP_REGS+(PT_R1*8))(r3)
|
||||||
stfd fp2,(SIGCONTEXT_FP_REGS+(PT_R2*8))(r3)
|
stfd fp2,(SIGCONTEXT_FP_REGS+(PT_R2*8))(r3)
|
||||||
@ -145,8 +145,8 @@ ENTRY(__novec_getcontext)
|
|||||||
nop
|
nop
|
||||||
li r3,-1
|
li r3,-1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ld r0,128+FRAME_LR_SAVE(r1)
|
ld r0,128+FRAME_LR_SAVE(r1)
|
||||||
addi r1,r1,128
|
addi r1,r1,128
|
||||||
mtlr r0
|
mtlr r0
|
||||||
blr
|
blr
|
||||||
@ -159,10 +159,10 @@ compat_symbol (libc, __novec_getcontext, getcontext, GLIBC_2_3)
|
|||||||
.section ".toc","aw"
|
.section ".toc","aw"
|
||||||
.LC__dl_hwcap:
|
.LC__dl_hwcap:
|
||||||
#ifdef SHARED
|
#ifdef SHARED
|
||||||
.tc _rtld_global[TC],_rtld_global
|
.tc _rtld_global_ro[TC],_rtld_global_ro
|
||||||
#else
|
#else
|
||||||
.tc _dl_hwcap[TC],_dl_hwcap
|
.tc _dl_hwcap[TC],_dl_hwcap
|
||||||
#endif
|
#endif
|
||||||
.section ".text"
|
.section ".text"
|
||||||
|
|
||||||
ENTRY(__getcontext)
|
ENTRY(__getcontext)
|
||||||
@ -209,12 +209,12 @@ ENTRY(__getcontext)
|
|||||||
std r0,(SIGCONTEXT_GP_REGS+(PT_XER*8))(r3)
|
std r0,(SIGCONTEXT_GP_REGS+(PT_XER*8))(r3)
|
||||||
mfcr r0
|
mfcr r0
|
||||||
std r0,(SIGCONTEXT_GP_REGS+(PT_CCR*8))(r3)
|
std r0,(SIGCONTEXT_GP_REGS+(PT_CCR*8))(r3)
|
||||||
|
|
||||||
/* Set the return value of swapcontext to "success". R3 is the only
|
/* Set the return value of swapcontext to "success". R3 is the only
|
||||||
register whose value is not preserved in the saved context. */
|
register whose value is not preserved in the saved context. */
|
||||||
li r0,0
|
li r0,0
|
||||||
std r0,(SIGCONTEXT_GP_REGS+(PT_R3*8))(r3)
|
std r0,(SIGCONTEXT_GP_REGS+(PT_R3*8))(r3)
|
||||||
|
|
||||||
/* Zero fill fields that can't be set in user state or are unused. */
|
/* Zero fill fields that can't be set in user state or are unused. */
|
||||||
std r0,(SIGCONTEXT_GP_REGS+(PT_MSR*8))(r3)
|
std r0,(SIGCONTEXT_GP_REGS+(PT_MSR*8))(r3)
|
||||||
std r0,(SIGCONTEXT_GP_REGS+(34*8))(r3)
|
std r0,(SIGCONTEXT_GP_REGS+(34*8))(r3)
|
||||||
@ -223,14 +223,14 @@ ENTRY(__getcontext)
|
|||||||
std r0,(SIGCONTEXT_GP_REGS+(41*8))(r3)
|
std r0,(SIGCONTEXT_GP_REGS+(41*8))(r3)
|
||||||
std r0,(SIGCONTEXT_GP_REGS+(42*8))(r3)
|
std r0,(SIGCONTEXT_GP_REGS+(42*8))(r3)
|
||||||
std r0,(SIGCONTEXT_GP_REGS+(PT_RESULT*8))(r3)
|
std r0,(SIGCONTEXT_GP_REGS+(PT_RESULT*8))(r3)
|
||||||
|
|
||||||
/* Set the PT_REGS pointer to the address of sigcontext's gp_regs
|
/* Set the PT_REGS pointer to the address of sigcontext's gp_regs
|
||||||
field. Struct pt_regs and elf_gregset_t are the same thing.
|
field. Struct pt_regs and elf_gregset_t are the same thing.
|
||||||
We kept the regs field for backwards compatibility with
|
We kept the regs field for backwards compatibility with
|
||||||
libraries built before we extended sigcontext. */
|
libraries built before we extended sigcontext. */
|
||||||
addi r0,r3,SIGCONTEXT_GP_REGS
|
addi r0,r3,SIGCONTEXT_GP_REGS
|
||||||
std r0,SIGCONTEXT_PT_REGS(r3)
|
std r0,SIGCONTEXT_PT_REGS(r3)
|
||||||
|
|
||||||
stfd fp0,(SIGCONTEXT_FP_REGS+(PT_R0*8))(r3)
|
stfd fp0,(SIGCONTEXT_FP_REGS+(PT_R0*8))(r3)
|
||||||
stfd fp1,(SIGCONTEXT_FP_REGS+(PT_R1*8))(r3)
|
stfd fp1,(SIGCONTEXT_FP_REGS+(PT_R1*8))(r3)
|
||||||
stfd fp2,(SIGCONTEXT_FP_REGS+(PT_R2*8))(r3)
|
stfd fp2,(SIGCONTEXT_FP_REGS+(PT_R2*8))(r3)
|
||||||
@ -265,120 +265,120 @@ ENTRY(__getcontext)
|
|||||||
stfd fp30,(SIGCONTEXT_FP_REGS+(PT_R30*8))(r3)
|
stfd fp30,(SIGCONTEXT_FP_REGS+(PT_R30*8))(r3)
|
||||||
stfd fp31,(SIGCONTEXT_FP_REGS+(PT_R31*8))(r3)
|
stfd fp31,(SIGCONTEXT_FP_REGS+(PT_R31*8))(r3)
|
||||||
stfd fp0,(SIGCONTEXT_FP_REGS+(32*8))(r3)
|
stfd fp0,(SIGCONTEXT_FP_REGS+(32*8))(r3)
|
||||||
|
|
||||||
ld r5,.LC__dl_hwcap@toc(r2)
|
ld r5,.LC__dl_hwcap@toc(r2)
|
||||||
li r10,0
|
li r10,0
|
||||||
#ifdef SHARED
|
#ifdef SHARED
|
||||||
/* Load _rtld-global._dl_hwcap. */
|
/* Load _rtld-global._dl_hwcap. */
|
||||||
ld r5,RTLD_GLOBAL_DL_HWCAP_OFFSET(r5)
|
ld r5,RTLD_GLOBAL_DL_HWCAP_OFFSET(r5)
|
||||||
#else
|
#else
|
||||||
ld r5,0(r5) /* Load extern _dl_hwcap. */
|
ld r5,0(r5) /* Load extern _dl_hwcap. */
|
||||||
#endif
|
#endif
|
||||||
andis. r5,r5,(PPC_FEATURE_HAS_ALTIVEC >> 16)
|
andis. r5,r5,(PPC_FEATURE_HAS_ALTIVEC >> 16)
|
||||||
beq L(has_no_vec)
|
beq L(has_no_vec)
|
||||||
|
|
||||||
la r10,(SIGCONTEXT_V_RESERVE+8)(r3)
|
la r10,(SIGCONTEXT_V_RESERVE+8)(r3)
|
||||||
la r9,(SIGCONTEXT_V_RESERVE+24)(r3)
|
la r9,(SIGCONTEXT_V_RESERVE+24)(r3)
|
||||||
clrrdi r10,r10,4
|
clrrdi r10,r10,4
|
||||||
clrrdi r9,r9,4
|
clrrdi r9,r9,4
|
||||||
|
|
||||||
stvx v0,0,r10
|
stvx v0,0,r10
|
||||||
stvx v1,0,r9
|
stvx v1,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v2,0,r10
|
stvx v2,0,r10
|
||||||
stvx v3,0,r9
|
stvx v3,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v4,0,r10
|
stvx v4,0,r10
|
||||||
stvx v5,0,r9
|
stvx v5,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v6,0,r10
|
stvx v6,0,r10
|
||||||
stvx v7,0,r9
|
stvx v7,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v8,0,r10
|
stvx v8,0,r10
|
||||||
stvx v9,0,r9
|
stvx v9,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v10,0,r10
|
stvx v10,0,r10
|
||||||
stvx v11,0,r9
|
stvx v11,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v12,0,r10
|
stvx v12,0,r10
|
||||||
stvx v13,0,r9
|
stvx v13,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v14,0,r10
|
stvx v14,0,r10
|
||||||
stvx v15,0,r9
|
stvx v15,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v16,0,r10
|
stvx v16,0,r10
|
||||||
stvx v17,0,r9
|
stvx v17,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v18,0,r10
|
stvx v18,0,r10
|
||||||
stvx v11,0,r9
|
stvx v11,0,r9
|
||||||
addi r19,r10,32
|
addi r19,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v20,0,r10
|
stvx v20,0,r10
|
||||||
stvx v21,0,r9
|
stvx v21,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v22,0,r10
|
stvx v22,0,r10
|
||||||
stvx v23,0,r9
|
stvx v23,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v24,0,r10
|
stvx v24,0,r10
|
||||||
stvx v25,0,r9
|
stvx v25,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v26,0,r10
|
stvx v26,0,r10
|
||||||
stvx v27,0,r9
|
stvx v27,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v28,0,r10
|
stvx v28,0,r10
|
||||||
stvx v29,0,r9
|
stvx v29,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v30,0,r10
|
stvx v30,0,r10
|
||||||
stvx v31,0,r9
|
stvx v31,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v10,0,r10
|
stvx v10,0,r10
|
||||||
stvx v11,0,r9
|
stvx v11,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
mfvscr v0
|
mfvscr v0
|
||||||
mfspr r0,VRSAVE
|
mfspr r0,VRSAVE
|
||||||
stvx v0,0,r10
|
stvx v0,0,r10
|
||||||
stw r0,0(9)
|
stw r0,0(9)
|
||||||
|
|
||||||
L(has_no_vec):
|
L(has_no_vec):
|
||||||
/*
|
/*
|
||||||
Store either a NULL or a quadword aligned pointer to the Vector register
|
Store either a NULL or a quadword aligned pointer to the Vector register
|
||||||
array into *v_regs.
|
array into *v_regs.
|
||||||
*/
|
*/
|
||||||
std r10,(SIGCONTEXT_V_REGS_PTR)(r3)
|
std r10,(SIGCONTEXT_V_REGS_PTR)(r3)
|
||||||
|
|
||||||
addi r5,r3,UCONTEXT_SIGMASK
|
addi r5,r3,UCONTEXT_SIGMASK
|
||||||
li r4,0
|
li r4,0
|
||||||
li r3,SIG_BLOCK
|
li r3,SIG_BLOCK
|
||||||
@ -394,12 +394,11 @@ L(has_no_vec):
|
|||||||
nop
|
nop
|
||||||
li r3,-1
|
li r3,-1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ld r0,128+FRAME_LR_SAVE(r1)
|
ld r0,128+FRAME_LR_SAVE(r1)
|
||||||
addi r1,r1,128
|
addi r1,r1,128
|
||||||
mtlr r0
|
mtlr r0
|
||||||
blr
|
blr
|
||||||
PSEUDO_END(__getcontext)
|
PSEUDO_END(__getcontext)
|
||||||
|
|
||||||
versioned_symbol (libc, __getcontext, getcontext, GLIBC_2_3_4)
|
versioned_symbol (libc, __getcontext, getcontext, GLIBC_2_3_4)
|
||||||
|
|
||||||
|
@ -73,12 +73,12 @@ ENTRY(__novec_swapcontext)
|
|||||||
std r0,(SIGCONTEXT_GP_REGS+(PT_XER*8))(r3)
|
std r0,(SIGCONTEXT_GP_REGS+(PT_XER*8))(r3)
|
||||||
mfcr r0
|
mfcr r0
|
||||||
std r0,(SIGCONTEXT_GP_REGS+(PT_CCR*8))(r3)
|
std r0,(SIGCONTEXT_GP_REGS+(PT_CCR*8))(r3)
|
||||||
|
|
||||||
/* Set the return value of swapcontext to "success". R3 is the only
|
/* Set the return value of swapcontext to "success". R3 is the only
|
||||||
register whose value is not preserved in the saved context. */
|
register whose value is not preserved in the saved context. */
|
||||||
li r0,0
|
li r0,0
|
||||||
std r0,(SIGCONTEXT_GP_REGS+(PT_R3*8))(r3)
|
std r0,(SIGCONTEXT_GP_REGS+(PT_R3*8))(r3)
|
||||||
|
|
||||||
/* Zero fill fields that can't be set in user state or are unused. */
|
/* Zero fill fields that can't be set in user state or are unused. */
|
||||||
std r0,(SIGCONTEXT_GP_REGS+(PT_MSR*8))(r3)
|
std r0,(SIGCONTEXT_GP_REGS+(PT_MSR*8))(r3)
|
||||||
std r0,(SIGCONTEXT_GP_REGS+(34*8))(r3)
|
std r0,(SIGCONTEXT_GP_REGS+(34*8))(r3)
|
||||||
@ -87,14 +87,14 @@ ENTRY(__novec_swapcontext)
|
|||||||
std r0,(SIGCONTEXT_GP_REGS+(41*8))(r3)
|
std r0,(SIGCONTEXT_GP_REGS+(41*8))(r3)
|
||||||
std r0,(SIGCONTEXT_GP_REGS+(42*8))(r3)
|
std r0,(SIGCONTEXT_GP_REGS+(42*8))(r3)
|
||||||
std r0,(SIGCONTEXT_GP_REGS+(PT_RESULT*8))(r3)
|
std r0,(SIGCONTEXT_GP_REGS+(PT_RESULT*8))(r3)
|
||||||
|
|
||||||
/* Set the PT_REGS pointer to the address of sigcontext gp_regs
|
/* Set the PT_REGS pointer to the address of sigcontext gp_regs
|
||||||
field. Struct pt_regs and elf_gregset_t are the same thing.
|
field. Struct pt_regs and elf_gregset_t are the same thing.
|
||||||
We kept the regs field for backwards compatibility with
|
We kept the regs field for backwards compatibility with
|
||||||
libraries built before we extended sigcontext. */
|
libraries built before we extended sigcontext. */
|
||||||
addi r0,r3,SIGCONTEXT_GP_REGS
|
addi r0,r3,SIGCONTEXT_GP_REGS
|
||||||
std r0,SIGCONTEXT_PT_REGS(r3)
|
std r0,SIGCONTEXT_PT_REGS(r3)
|
||||||
|
|
||||||
stfd fp0,(SIGCONTEXT_FP_REGS+(PT_R0*8))(r3)
|
stfd fp0,(SIGCONTEXT_FP_REGS+(PT_R0*8))(r3)
|
||||||
stfd fp1,(SIGCONTEXT_FP_REGS+(PT_R1*8))(r3)
|
stfd fp1,(SIGCONTEXT_FP_REGS+(PT_R1*8))(r3)
|
||||||
stfd fp2,(SIGCONTEXT_FP_REGS+(PT_R2*8))(r3)
|
stfd fp2,(SIGCONTEXT_FP_REGS+(PT_R2*8))(r3)
|
||||||
@ -154,41 +154,41 @@ ENTRY(__novec_swapcontext)
|
|||||||
bne L(nv_do_sigret)
|
bne L(nv_do_sigret)
|
||||||
|
|
||||||
lfd fp0,(SIGCONTEXT_FP_REGS+(32*8))(r31)
|
lfd fp0,(SIGCONTEXT_FP_REGS+(32*8))(r31)
|
||||||
lfd fp31,(SIGCONTEXT_FP_REGS+(PT_R31*8))(r31)
|
lfd fp31,(SIGCONTEXT_FP_REGS+(PT_R31*8))(r31)
|
||||||
lfd fp30,(SIGCONTEXT_FP_REGS+(PT_R30*8))(r31)
|
lfd fp30,(SIGCONTEXT_FP_REGS+(PT_R30*8))(r31)
|
||||||
mtfsf 0xff,fp0
|
mtfsf 0xff,fp0
|
||||||
lfd fp29,(SIGCONTEXT_FP_REGS+(PT_R29*8))(r31)
|
lfd fp29,(SIGCONTEXT_FP_REGS+(PT_R29*8))(r31)
|
||||||
lfd fp28,(SIGCONTEXT_FP_REGS+(PT_R28*8))(r31)
|
lfd fp28,(SIGCONTEXT_FP_REGS+(PT_R28*8))(r31)
|
||||||
lfd fp27,(SIGCONTEXT_FP_REGS+(PT_R27*8))(r31)
|
lfd fp27,(SIGCONTEXT_FP_REGS+(PT_R27*8))(r31)
|
||||||
lfd fp26,(SIGCONTEXT_FP_REGS+(PT_R26*8))(r31)
|
lfd fp26,(SIGCONTEXT_FP_REGS+(PT_R26*8))(r31)
|
||||||
lfd fp25,(SIGCONTEXT_FP_REGS+(PT_R25*8))(r31)
|
lfd fp25,(SIGCONTEXT_FP_REGS+(PT_R25*8))(r31)
|
||||||
lfd fp24,(SIGCONTEXT_FP_REGS+(PT_R24*8))(r31)
|
lfd fp24,(SIGCONTEXT_FP_REGS+(PT_R24*8))(r31)
|
||||||
lfd fp23,(SIGCONTEXT_FP_REGS+(PT_R23*8))(r31)
|
lfd fp23,(SIGCONTEXT_FP_REGS+(PT_R23*8))(r31)
|
||||||
lfd fp22,(SIGCONTEXT_FP_REGS+(PT_R22*8))(r31)
|
lfd fp22,(SIGCONTEXT_FP_REGS+(PT_R22*8))(r31)
|
||||||
lfd fp21,(SIGCONTEXT_FP_REGS+(PT_R21*8))(r31)
|
lfd fp21,(SIGCONTEXT_FP_REGS+(PT_R21*8))(r31)
|
||||||
lfd fp20,(SIGCONTEXT_FP_REGS+(PT_R20*8))(r31)
|
lfd fp20,(SIGCONTEXT_FP_REGS+(PT_R20*8))(r31)
|
||||||
lfd fp19,(SIGCONTEXT_FP_REGS+(PT_R19*8))(r31)
|
lfd fp19,(SIGCONTEXT_FP_REGS+(PT_R19*8))(r31)
|
||||||
lfd fp18,(SIGCONTEXT_FP_REGS+(PT_R18*8))(r31)
|
lfd fp18,(SIGCONTEXT_FP_REGS+(PT_R18*8))(r31)
|
||||||
lfd fp17,(SIGCONTEXT_FP_REGS+(PT_R17*8))(r31)
|
lfd fp17,(SIGCONTEXT_FP_REGS+(PT_R17*8))(r31)
|
||||||
lfd fp16,(SIGCONTEXT_FP_REGS+(PT_R16*8))(r31)
|
lfd fp16,(SIGCONTEXT_FP_REGS+(PT_R16*8))(r31)
|
||||||
lfd fp15,(SIGCONTEXT_FP_REGS+(PT_R15*8))(r31)
|
lfd fp15,(SIGCONTEXT_FP_REGS+(PT_R15*8))(r31)
|
||||||
lfd fp14,(SIGCONTEXT_FP_REGS+(PT_R14*8))(r31)
|
lfd fp14,(SIGCONTEXT_FP_REGS+(PT_R14*8))(r31)
|
||||||
lfd fp13,(SIGCONTEXT_FP_REGS+(PT_R13*8))(r31)
|
lfd fp13,(SIGCONTEXT_FP_REGS+(PT_R13*8))(r31)
|
||||||
lfd fp12,(SIGCONTEXT_FP_REGS+(PT_R12*8))(r31)
|
lfd fp12,(SIGCONTEXT_FP_REGS+(PT_R12*8))(r31)
|
||||||
lfd fp11,(SIGCONTEXT_FP_REGS+(PT_R11*8))(r31)
|
lfd fp11,(SIGCONTEXT_FP_REGS+(PT_R11*8))(r31)
|
||||||
lfd fp10,(SIGCONTEXT_FP_REGS+(PT_R10*8))(r31)
|
lfd fp10,(SIGCONTEXT_FP_REGS+(PT_R10*8))(r31)
|
||||||
lfd fp9,(SIGCONTEXT_FP_REGS+(PT_R9*8))(r31)
|
lfd fp9,(SIGCONTEXT_FP_REGS+(PT_R9*8))(r31)
|
||||||
lfd fp8,(SIGCONTEXT_FP_REGS+(PT_R8*8))(r31)
|
lfd fp8,(SIGCONTEXT_FP_REGS+(PT_R8*8))(r31)
|
||||||
lfd fp7,(SIGCONTEXT_FP_REGS+(PT_R7*8))(r31)
|
lfd fp7,(SIGCONTEXT_FP_REGS+(PT_R7*8))(r31)
|
||||||
lfd fp6,(SIGCONTEXT_FP_REGS+(PT_R6*8))(r31)
|
lfd fp6,(SIGCONTEXT_FP_REGS+(PT_R6*8))(r31)
|
||||||
lfd fp5,(SIGCONTEXT_FP_REGS+(PT_R5*8))(r31)
|
lfd fp5,(SIGCONTEXT_FP_REGS+(PT_R5*8))(r31)
|
||||||
lfd fp4,(SIGCONTEXT_FP_REGS+(PT_R4*8))(r31)
|
lfd fp4,(SIGCONTEXT_FP_REGS+(PT_R4*8))(r31)
|
||||||
lfd fp3,(SIGCONTEXT_FP_REGS+(PT_R3*8))(r31)
|
lfd fp3,(SIGCONTEXT_FP_REGS+(PT_R3*8))(r31)
|
||||||
lfd fp2,(SIGCONTEXT_FP_REGS+(PT_R2*8))(r31)
|
lfd fp2,(SIGCONTEXT_FP_REGS+(PT_R2*8))(r31)
|
||||||
lfd fp1,(SIGCONTEXT_FP_REGS+(PT_R1*8))(r31)
|
lfd fp1,(SIGCONTEXT_FP_REGS+(PT_R1*8))(r31)
|
||||||
lfd fp0,(SIGCONTEXT_FP_REGS+(PT_R0*8))(r31)
|
lfd fp0,(SIGCONTEXT_FP_REGS+(PT_R0*8))(r31)
|
||||||
|
|
||||||
ld r0,(SIGCONTEXT_GP_REGS+(PT_LNK*8))(r31)
|
ld r0,(SIGCONTEXT_GP_REGS+(PT_LNK*8))(r31)
|
||||||
ld r1,(SIGCONTEXT_GP_REGS+(PT_R1*8))(r31)
|
ld r1,(SIGCONTEXT_GP_REGS+(PT_R1*8))(r31)
|
||||||
mtlr r0
|
mtlr r0
|
||||||
ld r2,(SIGCONTEXT_GP_REGS+(PT_R2*8))(r31)
|
ld r2,(SIGCONTEXT_GP_REGS+(PT_R2*8))(r31)
|
||||||
@ -224,33 +224,33 @@ ENTRY(__novec_swapcontext)
|
|||||||
ld r28,(SIGCONTEXT_GP_REGS+(PT_R28*8))(r31)
|
ld r28,(SIGCONTEXT_GP_REGS+(PT_R28*8))(r31)
|
||||||
ld r29,(SIGCONTEXT_GP_REGS+(PT_R29*8))(r31)
|
ld r29,(SIGCONTEXT_GP_REGS+(PT_R29*8))(r31)
|
||||||
ld r30,(SIGCONTEXT_GP_REGS+(PT_R30*8))(r31)
|
ld r30,(SIGCONTEXT_GP_REGS+(PT_R30*8))(r31)
|
||||||
|
|
||||||
/* Now we branch to the "Next Instruction Pointer" from the saved
|
/* Now we branch to the "Next Instruction Pointer" from the saved
|
||||||
context. With the powerpc64 instruction set there is no good way to
|
context. With the powerpc64 instruction set there is no good way to
|
||||||
do this (from user state) without clobbering either the LR or CTR.
|
do this (from user state) without clobbering either the LR or CTR.
|
||||||
The makecontext and swapcontext functions depend on the callers
|
The makecontext and swapcontext functions depend on the callers
|
||||||
LR being preserved so we use the CTR. */
|
LR being preserved so we use the CTR. */
|
||||||
ld r0,(SIGCONTEXT_GP_REGS+(PT_NIP*8))(r31)
|
ld r0,(SIGCONTEXT_GP_REGS+(PT_NIP*8))(r31)
|
||||||
mtctr r0
|
mtctr r0
|
||||||
ld r0,(SIGCONTEXT_GP_REGS+(PT_R0*8))(r31)
|
ld r0,(SIGCONTEXT_GP_REGS+(PT_R0*8))(r31)
|
||||||
ld r31,(SIGCONTEXT_GP_REGS+(PT_R31*8))(r31)
|
ld r31,(SIGCONTEXT_GP_REGS+(PT_R31*8))(r31)
|
||||||
bctr
|
bctr
|
||||||
|
|
||||||
L(nv_error_exit):
|
L(nv_error_exit):
|
||||||
ld r0,128+FRAME_LR_SAVE(r1)
|
ld r0,128+FRAME_LR_SAVE(r1)
|
||||||
addi r1,r1,128
|
addi r1,r1,128
|
||||||
mtlr r0
|
mtlr r0
|
||||||
ld r31,-8(r1)
|
ld r31,-8(r1)
|
||||||
blr
|
blr
|
||||||
|
|
||||||
/* At this point we assume that the ucontext was created by a
|
/* At this point we assume that the ucontext was created by a
|
||||||
rt_signal and we should use rt_sigreturn to restore the original
|
rt_signal and we should use rt_sigreturn to restore the original
|
||||||
state. As of the 2.4.21 kernel the ucontext is the first thing
|
state. As of the 2.4.21 kernel the ucontext is the first thing
|
||||||
(offset 0) in the rt_signal frame and rt_sigreturn expects the
|
(offset 0) in the rt_signal frame and rt_sigreturn expects the
|
||||||
ucontext address in R1. Normally the rt-signal trampoline handles
|
ucontext address in R1. Normally the rt-signal trampoline handles
|
||||||
this by popping dummy frame before the rt_signal syscall. In our
|
this by popping dummy frame before the rt_signal syscall. In our
|
||||||
case the stack may not be in its original (signal handler return with
|
case the stack may not be in its original (signal handler return with
|
||||||
R1 pointing at the dummy frame) state. We do have the ucontext
|
R1 pointing at the dummy frame) state. We do have the ucontext
|
||||||
address in R3, so simply copy R3 to R1 before the syscall. */
|
address in R3, so simply copy R3 to R1 before the syscall. */
|
||||||
L(nv_do_sigret):
|
L(nv_do_sigret):
|
||||||
mr r1,r3,
|
mr r1,r3,
|
||||||
@ -266,11 +266,11 @@ L(nv_do_sigret):
|
|||||||
bl JUMPTARGET(__syscall_error)
|
bl JUMPTARGET(__syscall_error)
|
||||||
nop
|
nop
|
||||||
li r3,-1
|
li r3,-1
|
||||||
ld r0,128+FRAME_LR_SAVE(r1)
|
ld r0,128+FRAME_LR_SAVE(r1)
|
||||||
addi r1,r1,128
|
addi r1,r1,128
|
||||||
mtlr r0
|
mtlr r0
|
||||||
blr
|
blr
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
PSEUDO_END(__novec_swapcontext)
|
PSEUDO_END(__novec_swapcontext)
|
||||||
|
|
||||||
@ -281,12 +281,12 @@ compat_symbol (libc, __novec_swapcontext, swapcontext, GLIBC_2_3)
|
|||||||
.section ".toc","aw"
|
.section ".toc","aw"
|
||||||
.LC__dl_hwcap:
|
.LC__dl_hwcap:
|
||||||
#ifdef SHARED
|
#ifdef SHARED
|
||||||
.tc _rtld_global[TC],_rtld_global
|
.tc _rtld_global_ro[TC],_rtld_global_ro
|
||||||
#else
|
#else
|
||||||
.tc _dl_hwcap[TC],_dl_hwcap
|
.tc _dl_hwcap[TC],_dl_hwcap
|
||||||
#endif
|
#endif
|
||||||
.section ".text"
|
.section ".text"
|
||||||
|
|
||||||
ENTRY(__swapcontext)
|
ENTRY(__swapcontext)
|
||||||
#ifdef __ASSUME_NEW_RT_SIGRETURN_SYSCALL
|
#ifdef __ASSUME_NEW_RT_SIGRETURN_SYSCALL
|
||||||
std r0,(SIGCONTEXT_GP_REGS+(PT_R0*8))(r3)
|
std r0,(SIGCONTEXT_GP_REGS+(PT_R0*8))(r3)
|
||||||
@ -332,12 +332,12 @@ ENTRY(__swapcontext)
|
|||||||
std r0,(SIGCONTEXT_GP_REGS+(PT_XER*8))(r3)
|
std r0,(SIGCONTEXT_GP_REGS+(PT_XER*8))(r3)
|
||||||
mfcr r0
|
mfcr r0
|
||||||
std r0,(SIGCONTEXT_GP_REGS+(PT_CCR*8))(r3)
|
std r0,(SIGCONTEXT_GP_REGS+(PT_CCR*8))(r3)
|
||||||
|
|
||||||
/* Set the return value of swapcontext to "success". R3 is the only
|
/* Set the return value of swapcontext to "success". R3 is the only
|
||||||
register whose value is not preserved in the saved context. */
|
register whose value is not preserved in the saved context. */
|
||||||
li r0,0
|
li r0,0
|
||||||
std r0,(SIGCONTEXT_GP_REGS+(PT_R3*8))(r3)
|
std r0,(SIGCONTEXT_GP_REGS+(PT_R3*8))(r3)
|
||||||
|
|
||||||
/* Zero fill fields that can't be set in user state or are unused. */
|
/* Zero fill fields that can't be set in user state or are unused. */
|
||||||
std r0,(SIGCONTEXT_GP_REGS+(PT_MSR*8))(r3)
|
std r0,(SIGCONTEXT_GP_REGS+(PT_MSR*8))(r3)
|
||||||
std r0,(SIGCONTEXT_GP_REGS+(34*8))(r3)
|
std r0,(SIGCONTEXT_GP_REGS+(34*8))(r3)
|
||||||
@ -346,14 +346,14 @@ ENTRY(__swapcontext)
|
|||||||
std r0,(SIGCONTEXT_GP_REGS+(41*8))(r3)
|
std r0,(SIGCONTEXT_GP_REGS+(41*8))(r3)
|
||||||
std r0,(SIGCONTEXT_GP_REGS+(42*8))(r3)
|
std r0,(SIGCONTEXT_GP_REGS+(42*8))(r3)
|
||||||
std r0,(SIGCONTEXT_GP_REGS+(PT_RESULT*8))(r3)
|
std r0,(SIGCONTEXT_GP_REGS+(PT_RESULT*8))(r3)
|
||||||
|
|
||||||
/* Set the PT_REGS pointer to the address of sigcontext gp_regs
|
/* Set the PT_REGS pointer to the address of sigcontext gp_regs
|
||||||
field. Struct pt_regs and elf_gregset_t are the same thing.
|
field. Struct pt_regs and elf_gregset_t are the same thing.
|
||||||
We kept the regs field for backwards compatibility with
|
We kept the regs field for backwards compatibility with
|
||||||
libraries built before we extended sigcontext. */
|
libraries built before we extended sigcontext. */
|
||||||
addi r0,r3,SIGCONTEXT_GP_REGS
|
addi r0,r3,SIGCONTEXT_GP_REGS
|
||||||
std r0,SIGCONTEXT_PT_REGS(r3)
|
std r0,SIGCONTEXT_PT_REGS(r3)
|
||||||
|
|
||||||
stfd fp0,(SIGCONTEXT_FP_REGS+(PT_R0*8))(r3)
|
stfd fp0,(SIGCONTEXT_FP_REGS+(PT_R0*8))(r3)
|
||||||
stfd fp1,(SIGCONTEXT_FP_REGS+(PT_R1*8))(r3)
|
stfd fp1,(SIGCONTEXT_FP_REGS+(PT_R1*8))(r3)
|
||||||
stfd fp2,(SIGCONTEXT_FP_REGS+(PT_R2*8))(r3)
|
stfd fp2,(SIGCONTEXT_FP_REGS+(PT_R2*8))(r3)
|
||||||
@ -388,115 +388,115 @@ ENTRY(__swapcontext)
|
|||||||
stfd fp30,(SIGCONTEXT_FP_REGS+(PT_R30*8))(r3)
|
stfd fp30,(SIGCONTEXT_FP_REGS+(PT_R30*8))(r3)
|
||||||
stfd fp31,(SIGCONTEXT_FP_REGS+(PT_R31*8))(r3)
|
stfd fp31,(SIGCONTEXT_FP_REGS+(PT_R31*8))(r3)
|
||||||
stfd fp0,(SIGCONTEXT_FP_REGS+(32*8))(r3)
|
stfd fp0,(SIGCONTEXT_FP_REGS+(32*8))(r3)
|
||||||
|
|
||||||
ld r8,.LC__dl_hwcap@toc(r2)
|
ld r8,.LC__dl_hwcap@toc(r2)
|
||||||
li r10,0
|
li r10,0
|
||||||
#ifdef SHARED
|
#ifdef SHARED
|
||||||
/* Load _rtld-global._dl_hwcap. */
|
/* Load _rtld-global._dl_hwcap. */
|
||||||
ld r8,RTLD_GLOBAL_DL_HWCAP_OFFSET(r8)
|
ld r8,RTLD_GLOBAL_DL_HWCAP_OFFSET(r8)
|
||||||
#else
|
#else
|
||||||
ld r8,0(r8) /* Load extern _dl_hwcap. */
|
ld r8,0(r8) /* Load extern _dl_hwcap. */
|
||||||
#endif
|
#endif
|
||||||
andis. r8,r8,(PPC_FEATURE_HAS_ALTIVEC >> 16)
|
andis. r8,r8,(PPC_FEATURE_HAS_ALTIVEC >> 16)
|
||||||
beq L(has_no_vec)
|
beq L(has_no_vec)
|
||||||
|
|
||||||
la r10,(SIGCONTEXT_V_RESERVE+8)(r3)
|
la r10,(SIGCONTEXT_V_RESERVE+8)(r3)
|
||||||
la r9,(SIGCONTEXT_V_RESERVE+24)(r3)
|
la r9,(SIGCONTEXT_V_RESERVE+24)(r3)
|
||||||
clrrdi r10,r10,4
|
clrrdi r10,r10,4
|
||||||
clrrdi r9,r9,4
|
clrrdi r9,r9,4
|
||||||
|
|
||||||
stvx v0,0,r10
|
stvx v0,0,r10
|
||||||
stvx v1,0,r9
|
stvx v1,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v2,0,r10
|
stvx v2,0,r10
|
||||||
stvx v3,0,r9
|
stvx v3,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v4,0,r10
|
stvx v4,0,r10
|
||||||
stvx v5,0,r9
|
stvx v5,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v6,0,r10
|
stvx v6,0,r10
|
||||||
stvx v7,0,r9
|
stvx v7,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v8,0,r10
|
stvx v8,0,r10
|
||||||
stvx v9,0,r9
|
stvx v9,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v10,0,r10
|
stvx v10,0,r10
|
||||||
stvx v11,0,r9
|
stvx v11,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v12,0,r10
|
stvx v12,0,r10
|
||||||
stvx v13,0,r9
|
stvx v13,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v14,0,r10
|
stvx v14,0,r10
|
||||||
stvx v15,0,r9
|
stvx v15,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v16,0,r10
|
stvx v16,0,r10
|
||||||
stvx v17,0,r9
|
stvx v17,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v18,0,r10
|
stvx v18,0,r10
|
||||||
stvx v11,0,r9
|
stvx v11,0,r9
|
||||||
addi r19,r10,32
|
addi r19,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v20,0,r10
|
stvx v20,0,r10
|
||||||
stvx v21,0,r9
|
stvx v21,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v22,0,r10
|
stvx v22,0,r10
|
||||||
stvx v23,0,r9
|
stvx v23,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v24,0,r10
|
stvx v24,0,r10
|
||||||
stvx v25,0,r9
|
stvx v25,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v26,0,r10
|
stvx v26,0,r10
|
||||||
stvx v27,0,r9
|
stvx v27,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v28,0,r10
|
stvx v28,0,r10
|
||||||
stvx v29,0,r9
|
stvx v29,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v30,0,r10
|
stvx v30,0,r10
|
||||||
stvx v31,0,r9
|
stvx v31,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
stvx v10,0,r10
|
stvx v10,0,r10
|
||||||
stvx v11,0,r9
|
stvx v11,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
mfvscr v0
|
mfvscr v0
|
||||||
mfspr r0,VRSAVE
|
mfspr r0,VRSAVE
|
||||||
stvx v0,0,r10
|
stvx v0,0,r10
|
||||||
stw r0,0(9)
|
stw r0,0(9)
|
||||||
|
|
||||||
L(has_no_vec):
|
L(has_no_vec):
|
||||||
/*
|
/*
|
||||||
Store either a NULL or a quadword aligned pointer to the Vector register
|
Store either a NULL or a quadword aligned pointer to the Vector register
|
||||||
array into *v_regs.
|
array into *v_regs.
|
||||||
*/
|
*/
|
||||||
@ -524,154 +524,154 @@ L(has_no_vec):
|
|||||||
lwz r0,(SIGCONTEXT_GP_REGS+(PT_MSR*8))(r31)
|
lwz r0,(SIGCONTEXT_GP_REGS+(PT_MSR*8))(r31)
|
||||||
cmpdi r0,0
|
cmpdi r0,0
|
||||||
bne L(do_sigret)
|
bne L(do_sigret)
|
||||||
|
|
||||||
ld r8,.LC__dl_hwcap@toc(r2)
|
ld r8,.LC__dl_hwcap@toc(r2)
|
||||||
ld r10,(SIGCONTEXT_V_REGS_PTR)(r31)
|
ld r10,(SIGCONTEXT_V_REGS_PTR)(r31)
|
||||||
#ifdef SHARED
|
#ifdef SHARED
|
||||||
/* Load _rtld-global._dl_hwcap. */
|
/* Load _rtld-global._dl_hwcap. */
|
||||||
ld r8,RTLD_GLOBAL_DL_HWCAP_OFFSET(r8)
|
ld r8,RTLD_GLOBAL_DL_HWCAP_OFFSET(r8)
|
||||||
#else
|
#else
|
||||||
ld r8,0(r8) /* Load extern _dl_hwcap. */
|
ld r8,0(r8) /* Load extern _dl_hwcap. */
|
||||||
#endif
|
#endif
|
||||||
andis. r8,r8,(PPC_FEATURE_HAS_ALTIVEC >> 16)
|
andis. r8,r8,(PPC_FEATURE_HAS_ALTIVEC >> 16)
|
||||||
beq L(has_no_vec2)
|
beq L(has_no_vec2)
|
||||||
|
|
||||||
cmpdi r10,0
|
cmpdi r10,0
|
||||||
beq L(has_no_vec2)
|
beq L(has_no_vec2)
|
||||||
lwz r0,(33*16)(r10)
|
lwz r0,(33*16)(r10)
|
||||||
|
|
||||||
li r9,(16*32)
|
li r9,(16*32)
|
||||||
mtspr VRSAVE,r0
|
mtspr VRSAVE,r0
|
||||||
cmpwi r0,0
|
cmpwi r0,0
|
||||||
beq L(has_no_vec2)
|
beq L(has_no_vec2)
|
||||||
|
|
||||||
lvx v19,r9,r10
|
lvx v19,r9,r10
|
||||||
la r9,(16)(r10)
|
la r9,(16)(r10)
|
||||||
|
|
||||||
lvx v0,0,r10
|
lvx v0,0,r10
|
||||||
lvx v1,0,r9
|
lvx v1,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
mtvscr v19
|
mtvscr v19
|
||||||
lvx v2,0,r10
|
lvx v2,0,r10
|
||||||
lvx v3,0,r9
|
lvx v3,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
lvx v4,0,r10
|
lvx v4,0,r10
|
||||||
lvx v5,0,r9
|
lvx v5,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
lvx v6,0,r10
|
lvx v6,0,r10
|
||||||
lvx v7,0,r9
|
lvx v7,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
lvx v8,0,r10
|
lvx v8,0,r10
|
||||||
lvx v9,0,r9
|
lvx v9,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
lvx v10,0,r10
|
lvx v10,0,r10
|
||||||
lvx v11,0,r9
|
lvx v11,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
lvx v12,0,r10
|
lvx v12,0,r10
|
||||||
lvx v13,0,r9
|
lvx v13,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
lvx v14,0,r10
|
lvx v14,0,r10
|
||||||
lvx v15,0,r9
|
lvx v15,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
lvx v16,0,r10
|
lvx v16,0,r10
|
||||||
lvx v17,0,r9
|
lvx v17,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
lvx v18,0,r10
|
lvx v18,0,r10
|
||||||
lvx v11,0,r9
|
lvx v11,0,r9
|
||||||
addi r19,r10,32
|
addi r19,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
lvx v20,0,r10
|
lvx v20,0,r10
|
||||||
lvx v21,0,r9
|
lvx v21,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
lvx v22,0,r10
|
lvx v22,0,r10
|
||||||
lvx v23,0,r9
|
lvx v23,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
lvx v24,0,r10
|
lvx v24,0,r10
|
||||||
lvx v25,0,r9
|
lvx v25,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
lvx v26,0,r10
|
lvx v26,0,r10
|
||||||
lvx v27,0,r9
|
lvx v27,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
lvx v28,0,r10
|
lvx v28,0,r10
|
||||||
lvx v29,0,r9
|
lvx v29,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
lvx v30,0,r10
|
lvx v30,0,r10
|
||||||
lvx v31,0,r9
|
lvx v31,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
lvx v10,0,r10
|
lvx v10,0,r10
|
||||||
lvx v11,0,r9
|
lvx v11,0,r9
|
||||||
addi r10,r10,32
|
addi r10,r10,32
|
||||||
addi r9,r9,32
|
addi r9,r9,32
|
||||||
|
|
||||||
L(has_no_vec2):
|
L(has_no_vec2):
|
||||||
|
|
||||||
lfd fp0,(SIGCONTEXT_FP_REGS+(32*8))(r31)
|
lfd fp0,(SIGCONTEXT_FP_REGS+(32*8))(r31)
|
||||||
lfd fp31,(SIGCONTEXT_FP_REGS+(PT_R31*8))(r31)
|
lfd fp31,(SIGCONTEXT_FP_REGS+(PT_R31*8))(r31)
|
||||||
lfd fp30,(SIGCONTEXT_FP_REGS+(PT_R30*8))(r31)
|
lfd fp30,(SIGCONTEXT_FP_REGS+(PT_R30*8))(r31)
|
||||||
mtfsf 0xff,fp0
|
mtfsf 0xff,fp0
|
||||||
lfd fp29,(SIGCONTEXT_FP_REGS+(PT_R29*8))(r31)
|
lfd fp29,(SIGCONTEXT_FP_REGS+(PT_R29*8))(r31)
|
||||||
lfd fp28,(SIGCONTEXT_FP_REGS+(PT_R28*8))(r31)
|
lfd fp28,(SIGCONTEXT_FP_REGS+(PT_R28*8))(r31)
|
||||||
lfd fp27,(SIGCONTEXT_FP_REGS+(PT_R27*8))(r31)
|
lfd fp27,(SIGCONTEXT_FP_REGS+(PT_R27*8))(r31)
|
||||||
lfd fp26,(SIGCONTEXT_FP_REGS+(PT_R26*8))(r31)
|
lfd fp26,(SIGCONTEXT_FP_REGS+(PT_R26*8))(r31)
|
||||||
lfd fp25,(SIGCONTEXT_FP_REGS+(PT_R25*8))(r31)
|
lfd fp25,(SIGCONTEXT_FP_REGS+(PT_R25*8))(r31)
|
||||||
lfd fp24,(SIGCONTEXT_FP_REGS+(PT_R24*8))(r31)
|
lfd fp24,(SIGCONTEXT_FP_REGS+(PT_R24*8))(r31)
|
||||||
lfd fp23,(SIGCONTEXT_FP_REGS+(PT_R23*8))(r31)
|
lfd fp23,(SIGCONTEXT_FP_REGS+(PT_R23*8))(r31)
|
||||||
lfd fp22,(SIGCONTEXT_FP_REGS+(PT_R22*8))(r31)
|
lfd fp22,(SIGCONTEXT_FP_REGS+(PT_R22*8))(r31)
|
||||||
lfd fp21,(SIGCONTEXT_FP_REGS+(PT_R21*8))(r31)
|
lfd fp21,(SIGCONTEXT_FP_REGS+(PT_R21*8))(r31)
|
||||||
lfd fp20,(SIGCONTEXT_FP_REGS+(PT_R20*8))(r31)
|
lfd fp20,(SIGCONTEXT_FP_REGS+(PT_R20*8))(r31)
|
||||||
lfd fp19,(SIGCONTEXT_FP_REGS+(PT_R19*8))(r31)
|
lfd fp19,(SIGCONTEXT_FP_REGS+(PT_R19*8))(r31)
|
||||||
lfd fp18,(SIGCONTEXT_FP_REGS+(PT_R18*8))(r31)
|
lfd fp18,(SIGCONTEXT_FP_REGS+(PT_R18*8))(r31)
|
||||||
lfd fp17,(SIGCONTEXT_FP_REGS+(PT_R17*8))(r31)
|
lfd fp17,(SIGCONTEXT_FP_REGS+(PT_R17*8))(r31)
|
||||||
lfd fp16,(SIGCONTEXT_FP_REGS+(PT_R16*8))(r31)
|
lfd fp16,(SIGCONTEXT_FP_REGS+(PT_R16*8))(r31)
|
||||||
lfd fp15,(SIGCONTEXT_FP_REGS+(PT_R15*8))(r31)
|
lfd fp15,(SIGCONTEXT_FP_REGS+(PT_R15*8))(r31)
|
||||||
lfd fp14,(SIGCONTEXT_FP_REGS+(PT_R14*8))(r31)
|
lfd fp14,(SIGCONTEXT_FP_REGS+(PT_R14*8))(r31)
|
||||||
lfd fp13,(SIGCONTEXT_FP_REGS+(PT_R13*8))(r31)
|
lfd fp13,(SIGCONTEXT_FP_REGS+(PT_R13*8))(r31)
|
||||||
lfd fp12,(SIGCONTEXT_FP_REGS+(PT_R12*8))(r31)
|
lfd fp12,(SIGCONTEXT_FP_REGS+(PT_R12*8))(r31)
|
||||||
lfd fp11,(SIGCONTEXT_FP_REGS+(PT_R11*8))(r31)
|
lfd fp11,(SIGCONTEXT_FP_REGS+(PT_R11*8))(r31)
|
||||||
lfd fp10,(SIGCONTEXT_FP_REGS+(PT_R10*8))(r31)
|
lfd fp10,(SIGCONTEXT_FP_REGS+(PT_R10*8))(r31)
|
||||||
lfd fp9,(SIGCONTEXT_FP_REGS+(PT_R9*8))(r31)
|
lfd fp9,(SIGCONTEXT_FP_REGS+(PT_R9*8))(r31)
|
||||||
lfd fp8,(SIGCONTEXT_FP_REGS+(PT_R8*8))(r31)
|
lfd fp8,(SIGCONTEXT_FP_REGS+(PT_R8*8))(r31)
|
||||||
lfd fp7,(SIGCONTEXT_FP_REGS+(PT_R7*8))(r31)
|
lfd fp7,(SIGCONTEXT_FP_REGS+(PT_R7*8))(r31)
|
||||||
lfd fp6,(SIGCONTEXT_FP_REGS+(PT_R6*8))(r31)
|
lfd fp6,(SIGCONTEXT_FP_REGS+(PT_R6*8))(r31)
|
||||||
lfd fp5,(SIGCONTEXT_FP_REGS+(PT_R5*8))(r31)
|
lfd fp5,(SIGCONTEXT_FP_REGS+(PT_R5*8))(r31)
|
||||||
lfd fp4,(SIGCONTEXT_FP_REGS+(PT_R4*8))(r31)
|
lfd fp4,(SIGCONTEXT_FP_REGS+(PT_R4*8))(r31)
|
||||||
lfd fp3,(SIGCONTEXT_FP_REGS+(PT_R3*8))(r31)
|
lfd fp3,(SIGCONTEXT_FP_REGS+(PT_R3*8))(r31)
|
||||||
lfd fp2,(SIGCONTEXT_FP_REGS+(PT_R2*8))(r31)
|
lfd fp2,(SIGCONTEXT_FP_REGS+(PT_R2*8))(r31)
|
||||||
lfd fp1,(SIGCONTEXT_FP_REGS+(PT_R1*8))(r31)
|
lfd fp1,(SIGCONTEXT_FP_REGS+(PT_R1*8))(r31)
|
||||||
lfd fp0,(SIGCONTEXT_FP_REGS+(PT_R0*8))(r31)
|
lfd fp0,(SIGCONTEXT_FP_REGS+(PT_R0*8))(r31)
|
||||||
|
|
||||||
ld r0,(SIGCONTEXT_GP_REGS+(PT_LNK*8))(r31)
|
ld r0,(SIGCONTEXT_GP_REGS+(PT_LNK*8))(r31)
|
||||||
ld r1,(SIGCONTEXT_GP_REGS+(PT_R1*8))(r31)
|
ld r1,(SIGCONTEXT_GP_REGS+(PT_R1*8))(r31)
|
||||||
mtlr r0
|
mtlr r0
|
||||||
ld r2,(SIGCONTEXT_GP_REGS+(PT_R2*8))(r31)
|
ld r2,(SIGCONTEXT_GP_REGS+(PT_R2*8))(r31)
|
||||||
@ -707,33 +707,33 @@ L(has_no_vec2):
|
|||||||
ld r28,(SIGCONTEXT_GP_REGS+(PT_R28*8))(r31)
|
ld r28,(SIGCONTEXT_GP_REGS+(PT_R28*8))(r31)
|
||||||
ld r29,(SIGCONTEXT_GP_REGS+(PT_R29*8))(r31)
|
ld r29,(SIGCONTEXT_GP_REGS+(PT_R29*8))(r31)
|
||||||
ld r30,(SIGCONTEXT_GP_REGS+(PT_R30*8))(r31)
|
ld r30,(SIGCONTEXT_GP_REGS+(PT_R30*8))(r31)
|
||||||
|
|
||||||
/* Now we branch to the "Next Instruction Pointer" from the saved
|
/* Now we branch to the "Next Instruction Pointer" from the saved
|
||||||
context. With the powerpc64 instruction set there is no good way to
|
context. With the powerpc64 instruction set there is no good way to
|
||||||
do this (from user state) without clobbering either the LR or CTR.
|
do this (from user state) without clobbering either the LR or CTR.
|
||||||
The makecontext and swapcontext functions depend on the callers
|
The makecontext and swapcontext functions depend on the callers
|
||||||
LR being preserved so we use the CTR. */
|
LR being preserved so we use the CTR. */
|
||||||
ld r0,(SIGCONTEXT_GP_REGS+(PT_NIP*8))(r31)
|
ld r0,(SIGCONTEXT_GP_REGS+(PT_NIP*8))(r31)
|
||||||
mtctr r0
|
mtctr r0
|
||||||
ld r0,(SIGCONTEXT_GP_REGS+(PT_R0*8))(r31)
|
ld r0,(SIGCONTEXT_GP_REGS+(PT_R0*8))(r31)
|
||||||
ld r31,(SIGCONTEXT_GP_REGS+(PT_R31*8))(r31)
|
ld r31,(SIGCONTEXT_GP_REGS+(PT_R31*8))(r31)
|
||||||
bctr
|
bctr
|
||||||
|
|
||||||
L(error_exit):
|
L(error_exit):
|
||||||
ld r0,128+FRAME_LR_SAVE(r1)
|
ld r0,128+FRAME_LR_SAVE(r1)
|
||||||
addi r1,r1,128
|
addi r1,r1,128
|
||||||
mtlr r0
|
mtlr r0
|
||||||
ld r31,-8(r1)
|
ld r31,-8(r1)
|
||||||
blr
|
blr
|
||||||
|
|
||||||
/* At this point we assume that the ucontext was created by a
|
/* At this point we assume that the ucontext was created by a
|
||||||
rt_signal and we should use rt_sigreturn to restore the original
|
rt_signal and we should use rt_sigreturn to restore the original
|
||||||
state. As of the 2.4.21 kernel the ucontext is the first thing
|
state. As of the 2.4.21 kernel the ucontext is the first thing
|
||||||
(offset 0) in the rt_signal frame and rt_sigreturn expects the
|
(offset 0) in the rt_signal frame and rt_sigreturn expects the
|
||||||
ucontext address in R1. Normally the rt-signal trampoline handles
|
ucontext address in R1. Normally the rt-signal trampoline handles
|
||||||
this by popping dummy frame before the rt_signal syscall. In our
|
this by popping dummy frame before the rt_signal syscall. In our
|
||||||
case the stack may not be in its original (signal handler return with
|
case the stack may not be in its original (signal handler return with
|
||||||
R1 pointing at the dummy frame) state. We do have the ucontext
|
R1 pointing at the dummy frame) state. We do have the ucontext
|
||||||
address in R3, so simply copy R3 to R1 before the syscall. */
|
address in R3, so simply copy R3 to R1 before the syscall. */
|
||||||
L(do_sigret):
|
L(do_sigret):
|
||||||
mr r1,r3,
|
mr r1,r3,
|
||||||
@ -749,11 +749,11 @@ L(do_sigret):
|
|||||||
bl JUMPTARGET(__syscall_error)
|
bl JUMPTARGET(__syscall_error)
|
||||||
nop
|
nop
|
||||||
li r3,-1
|
li r3,-1
|
||||||
ld r0,128+FRAME_LR_SAVE(r1)
|
ld r0,128+FRAME_LR_SAVE(r1)
|
||||||
addi r1,r1,128
|
addi r1,r1,128
|
||||||
mtlr r0
|
mtlr r0
|
||||||
blr
|
blr
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
PSEUDO_END(__swapcontext)
|
PSEUDO_END(__swapcontext)
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Determine realtime clock frequency.
|
/* Determine realtime clock frequency.
|
||||||
Copyright (C) 2003 Free Software Foundation, Inc.
|
Copyright (C) 2003, 2004 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -27,10 +27,10 @@ int
|
|||||||
__profile_frequency (void)
|
__profile_frequency (void)
|
||||||
{
|
{
|
||||||
#ifdef __ASSUME_AT_CLKTCK
|
#ifdef __ASSUME_AT_CLKTCK
|
||||||
return GL(dl_clktck);
|
return GLRO(dl_clktck);
|
||||||
#else
|
#else
|
||||||
if (GL(dl_clktck) != 0)
|
if (GLRO(dl_clktck) != 0)
|
||||||
return GL(dl_clktck);
|
return GLRO(dl_clktck);
|
||||||
|
|
||||||
struct itimerval tim;
|
struct itimerval tim;
|
||||||
|
|
||||||
|
@ -116,7 +116,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
|
|||||||
{
|
{
|
||||||
got[2] = (Elf64_Addr) &_dl_runtime_profile;
|
got[2] = (Elf64_Addr) &_dl_runtime_profile;
|
||||||
|
|
||||||
if (_dl_name_match_p (GL(dl_profile), l))
|
if (_dl_name_match_p (GLRO(dl_profile), l))
|
||||||
/* This is the object we are looking for. Say that we really
|
/* This is the object we are looking for. Say that we really
|
||||||
want profiling and the timers are started. */
|
want profiling and the timers are started. */
|
||||||
GL(dl_profile_map) = l;
|
GL(dl_profile_map) = l;
|
||||||
@ -326,9 +326,9 @@ _dl_start_user:\n\
|
|||||||
static inline void __attribute__ ((unused))
|
static inline void __attribute__ ((unused))
|
||||||
dl_platform_init (void)
|
dl_platform_init (void)
|
||||||
{
|
{
|
||||||
if (GL(dl_platform) != NULL && *GL(dl_platform) == '\0')
|
if (GLRO(dl_platform) != NULL && *GLRO(dl_platform) == '\0')
|
||||||
/* Avoid an empty string which would disturb us. */
|
/* Avoid an empty string which would disturb us. */
|
||||||
GL(dl_platform) = NULL;
|
GLRO(dl_platform) = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline Elf64_Addr
|
static inline Elf64_Addr
|
||||||
@ -497,7 +497,7 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
|
|||||||
break;
|
break;
|
||||||
if (__builtin_expect (sym->st_size > refsym->st_size, 0)
|
if (__builtin_expect (sym->st_size > refsym->st_size, 0)
|
||||||
|| (__builtin_expect (sym->st_size < refsym->st_size, 0)
|
|| (__builtin_expect (sym->st_size < refsym->st_size, 0)
|
||||||
&& GL(dl_verbose)))
|
&& GLRO(dl_verbose)))
|
||||||
{
|
{
|
||||||
const char *strtab;
|
const char *strtab;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user