mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-28 00:21:52 +03:00
* sysdeps/sparc/sparc32/dl-machine.h (elf_machine_runtime_setup): No
need to check GLRO(dl_hwcap) & HWCAP_SPARC_FLUSH on sparcv9. (sparc_fixup_plt): Add do_flush argument instead of figuring whether flush should be used or not inside of the function. (elf_machine_fixup_plt, elf_machine_rela): Adjust caller. * sysdeps/unix/sysv/linux/sparc/sparc32/clone.S (__clone, __thread_start): Use HIDDEN_JUMPTARGET. * sysdeps/unix/sysv/linux/sparc/sparc64/clone.S (__clone, __thread_start): Likewise. * sysdeps/unix/sysv/linux/sparc/sysdep.h (JUMPTARGET): Define. nptl/ * sysdeps/unix/sysv/linux/lowlevellock.c: Comment fix. * sysdeps/unix/sysv/linux/sparc/sparc32/lowlevellock.c (__lll_timedwait_tid): Pass LLL_SHARED as 4th argument to lll_futex_timed_wait. * sysdeps/sparc/sparc32/dl-machine.h (elf_machine_runtime_setup): No need to check GLRO(dl_hwcap) & HWCAP_SPARC_FLUSH on sparcv9. (sparc_fixup_plt): Add do_flush argument instead of figuring whether flush should be used or not inside of the function. (elf_machine_fixup_plt, elf_machine_rela): Adjust caller. * sysdeps/unix/sysv/linux/sparc/sparc32/clone.S (__clone, __thread_start): Use HIDDEN_JUMPTARGET. * sysdeps/unix/sysv/linux/sparc/sparc64/clone.S (__clone, __thread_start): Likewise. * sysdeps/unix/sysv/linux/sparc/sysdep.h (JUMPTARGET): Define.
This commit is contained in:
12
ChangeLog
12
ChangeLog
@ -1,5 +1,17 @@
|
|||||||
2007-08-14 Jakub Jelinek <jakub@redhat.com>
|
2007-08-14 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
* sysdeps/sparc/sparc32/dl-machine.h (elf_machine_runtime_setup): No
|
||||||
|
need to check GLRO(dl_hwcap) & HWCAP_SPARC_FLUSH on sparcv9.
|
||||||
|
(sparc_fixup_plt): Add do_flush argument instead of figuring whether
|
||||||
|
flush should be used or not inside of the function.
|
||||||
|
(elf_machine_fixup_plt, elf_machine_rela): Adjust caller.
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/sparc/sparc32/clone.S (__clone,
|
||||||
|
__thread_start): Use HIDDEN_JUMPTARGET.
|
||||||
|
* sysdeps/unix/sysv/linux/sparc/sparc64/clone.S (__clone,
|
||||||
|
__thread_start): Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/sparc/sysdep.h (JUMPTARGET): Define.
|
||||||
|
|
||||||
* sysdeps/ieee754/ldbl-64-128/strtold_l.c (__STRTOF): Declare.
|
* sysdeps/ieee754/ldbl-64-128/strtold_l.c (__STRTOF): Declare.
|
||||||
Add libc_hidden_proto.
|
Add libc_hidden_proto.
|
||||||
(STRTOF): Add libc_hidden_proto.
|
(STRTOF): Add libc_hidden_proto.
|
||||||
|
@ -1,5 +1,10 @@
|
|||||||
2007-08-14 Jakub Jelinek <jakub@redhat.com>
|
2007-08-14 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/lowlevellock.c: Comment fix.
|
||||||
|
* sysdeps/unix/sysv/linux/sparc/sparc32/lowlevellock.c
|
||||||
|
(__lll_timedwait_tid): Pass LLL_SHARED as 4th argument to
|
||||||
|
lll_futex_timed_wait.
|
||||||
|
|
||||||
* sysdeps/unix/sysv/linux/alpha/lowlevellock.h (__lll_unlock,
|
* sysdeps/unix/sysv/linux/alpha/lowlevellock.h (__lll_unlock,
|
||||||
__lll_robust_unlock): Rewrite as macros instead of inline functions.
|
__lll_robust_unlock): Rewrite as macros instead of inline functions.
|
||||||
* sysdeps/unix/sysv/linux/s390/lowlevellock.h (__lll_unlock,
|
* sysdeps/unix/sysv/linux/s390/lowlevellock.h (__lll_unlock,
|
||||||
|
@ -37,7 +37,7 @@ __lll_lock_wait_private (int *futex)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* These functions doesn't get included in libc.so */
|
/* These functions don't get included in libc.so */
|
||||||
#ifdef IS_IN_libpthread
|
#ifdef IS_IN_libpthread
|
||||||
void
|
void
|
||||||
__lll_lock_wait (int *futex, int private)
|
__lll_lock_wait (int *futex, int private)
|
||||||
|
@ -36,9 +36,9 @@ __lll_lock_wait_private (int *futex)
|
|||||||
while (atomic_compare_and_exchange_val_24_acq (futex, 2, 0) != 0);
|
while (atomic_compare_and_exchange_val_24_acq (futex, 2, 0) != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef IS_IN_libpthread
|
|
||||||
/* These functions don't get included in libc.so */
|
|
||||||
|
|
||||||
|
/* These functions don't get included in libc.so */
|
||||||
|
#ifdef IS_IN_libpthread
|
||||||
void
|
void
|
||||||
__lll_lock_wait (int *futex, int private)
|
__lll_lock_wait (int *futex, int private)
|
||||||
{
|
{
|
||||||
@ -121,8 +121,9 @@ __lll_timedwait_tid (int *tidp, const struct timespec *abstime)
|
|||||||
if (rt.tv_sec < 0)
|
if (rt.tv_sec < 0)
|
||||||
return ETIMEDOUT;
|
return ETIMEDOUT;
|
||||||
|
|
||||||
/* Wait until thread terminates. */
|
/* Wait until thread terminates. The kernel so far does not use
|
||||||
if (lll_futex_timed_wait (tidp, tid, &rt) == -ETIMEDOUT)
|
the private futex operations for this. */
|
||||||
|
if (lll_futex_timed_wait (tidp, tid, &rt, LLL_SHARED) == -ETIMEDOUT)
|
||||||
return ETIMEDOUT;
|
return ETIMEDOUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
/* Machine-dependent ELF dynamic relocation inline functions. SPARC version.
|
/* Machine-dependent ELF dynamic relocation inline functions. SPARC version.
|
||||||
Copyright (C) 1996-2003, 2004, 2005, 2006 Free Software Foundation, Inc.
|
Copyright (C) 1996-2003, 2004, 2005, 2006, 2007
|
||||||
|
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
|
||||||
@ -155,12 +156,18 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
|
|||||||
|| __builtin_expect (l->l_info [VALIDX (DT_GNU_LIBLISTSZ)] != NULL, 0))
|
|| __builtin_expect (l->l_info [VALIDX (DT_GNU_LIBLISTSZ)] != NULL, 0))
|
||||||
{
|
{
|
||||||
/* Need to reinitialize .plt to undo prelinking. */
|
/* Need to reinitialize .plt to undo prelinking. */
|
||||||
int do_flush;
|
|
||||||
Elf32_Rela *rela = (Elf32_Rela *) D_PTR (l, l_info[DT_JMPREL]);
|
Elf32_Rela *rela = (Elf32_Rela *) D_PTR (l, l_info[DT_JMPREL]);
|
||||||
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 = GLRO(dl_hwcap) & HWCAP_SPARC_FLUSH;
|
#if !defined RTLD_BOOTSTRAP && !defined __sparc_v9__
|
||||||
|
/* Note that we don't mask the hwcap here, as the flush is
|
||||||
|
essential to functionality on those cpu's that implement it.
|
||||||
|
For sparcv9 we can assume flush is present. */
|
||||||
|
const int do_flush = GLRO(dl_hwcap) & HWCAP_SPARC_FLUSH;
|
||||||
|
#else
|
||||||
|
const int do_flush = 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* 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. */
|
||||||
@ -305,20 +312,11 @@ _dl_start_user:\n\
|
|||||||
.size _dl_start_user, . - _dl_start_user\n\
|
.size _dl_start_user, . - _dl_start_user\n\
|
||||||
.previous");
|
.previous");
|
||||||
|
|
||||||
static inline Elf32_Addr
|
static inline __attribute__ ((always_inline)) Elf32_Addr
|
||||||
sparc_fixup_plt (const Elf32_Rela *reloc, Elf32_Addr *reloc_addr,
|
sparc_fixup_plt (const Elf32_Rela *reloc, Elf32_Addr *reloc_addr,
|
||||||
Elf32_Addr value, int t)
|
Elf32_Addr value, int t, int do_flush)
|
||||||
{
|
{
|
||||||
Elf32_Sword disp = value - (Elf32_Addr) reloc_addr;
|
Elf32_Sword disp = value - (Elf32_Addr) reloc_addr;
|
||||||
#ifndef RTLD_BOOTSTRAP
|
|
||||||
/* Note that we don't mask the hwcap here, as the flush is essential to
|
|
||||||
functionality on those cpu's that implement it. */
|
|
||||||
int do_flush = GLRO(dl_hwcap) & HWCAP_SPARC_FLUSH;
|
|
||||||
#else
|
|
||||||
/* Unfortunately, this is necessary, so that we can ensure
|
|
||||||
ld.so will not execute corrupt PLT entry instructions. */
|
|
||||||
const int do_flush = 1;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (0 && disp >= -0x800000 && disp < 0x800000)
|
if (0 && disp >= -0x800000 && disp < 0x800000)
|
||||||
{
|
{
|
||||||
@ -354,7 +352,15 @@ elf_machine_fixup_plt (struct link_map *map, lookup_t t,
|
|||||||
const Elf32_Rela *reloc,
|
const Elf32_Rela *reloc,
|
||||||
Elf32_Addr *reloc_addr, Elf32_Addr value)
|
Elf32_Addr *reloc_addr, Elf32_Addr value)
|
||||||
{
|
{
|
||||||
return sparc_fixup_plt (reloc, reloc_addr, value, 1);
|
#ifdef __sparc_v9__
|
||||||
|
/* Sparc v9 can assume flush is always present. */
|
||||||
|
const int do_flush = 1;
|
||||||
|
#else
|
||||||
|
/* Note that we don't mask the hwcap here, as the flush is essential to
|
||||||
|
functionality on those cpu's that implement it. */
|
||||||
|
const int do_flush = GLRO(dl_hwcap) & HWCAP_SPARC_FLUSH;
|
||||||
|
#endif
|
||||||
|
return sparc_fixup_plt (reloc, reloc_addr, value, 1, do_flush);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the final value of a plt relocation. */
|
/* Return the final value of a plt relocation. */
|
||||||
@ -455,9 +461,21 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
|
|||||||
*reloc_addr = value;
|
*reloc_addr = value;
|
||||||
break;
|
break;
|
||||||
case R_SPARC_JMP_SLOT:
|
case R_SPARC_JMP_SLOT:
|
||||||
/* At this point we don't need to bother with thread safety,
|
{
|
||||||
so we can optimize the first instruction of .plt out. */
|
#if !defined RTLD_BOOTSTRAP && !defined __sparc_v9__
|
||||||
sparc_fixup_plt (reloc, reloc_addr, value, 0);
|
/* Note that we don't mask the hwcap here, as the flush is
|
||||||
|
essential to functionality on those cpu's that implement
|
||||||
|
it. For sparcv9 we can assume flush is present. */
|
||||||
|
const int do_flush = GLRO(dl_hwcap) & HWCAP_SPARC_FLUSH;
|
||||||
|
#else
|
||||||
|
/* Unfortunately, this is necessary, so that we can ensure
|
||||||
|
ld.so will not execute corrupt PLT entry instructions. */
|
||||||
|
const int do_flush = 1;
|
||||||
|
#endif
|
||||||
|
/* At this point we don't need to bother with thread safety,
|
||||||
|
so we can optimize the first instruction of .plt out. */
|
||||||
|
sparc_fixup_plt (reloc, reloc_addr, value, 0, do_flush);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
#if (!defined RTLD_BOOTSTRAP || USE___THREAD) \
|
#if (!defined RTLD_BOOTSTRAP || USE___THREAD) \
|
||||||
&& !defined RESOLVE_CONFLICT_FIND_MAP
|
&& !defined RESOLVE_CONFLICT_FIND_MAP
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1996, 1997, 1998, 2000, 2003, 2004
|
/* Copyright (C) 1996, 1997, 1998, 2000, 2003, 2004, 2007
|
||||||
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.
|
||||||
Contributed by Richard Henderson (rth@tamu.edu).
|
Contributed by Richard Henderson (rth@tamu.edu).
|
||||||
@ -71,7 +71,7 @@ ENTRY (__clone)
|
|||||||
restore %o0,%g0,%o0
|
restore %o0,%g0,%o0
|
||||||
|
|
||||||
.Lerror:
|
.Lerror:
|
||||||
call __errno_location
|
call HIDDEN_JUMPTARGET(__errno_location)
|
||||||
or %g0,EINVAL,%i0
|
or %g0,EINVAL,%i0
|
||||||
st %i0,[%o0]
|
st %i0,[%o0]
|
||||||
jmpl %i7 + 8, %g0
|
jmpl %i7 + 8, %g0
|
||||||
@ -99,7 +99,7 @@ __thread_start:
|
|||||||
mov %g0, %fp /* terminate backtrace */
|
mov %g0, %fp /* terminate backtrace */
|
||||||
call %g2
|
call %g2
|
||||||
mov %g3,%o0
|
mov %g3,%o0
|
||||||
call _exit,0
|
call HIDDEN_JUMPTARGET(_exit),0
|
||||||
nop
|
nop
|
||||||
|
|
||||||
cfi_endproc
|
cfi_endproc
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1997, 2000 Free Software Foundation, Inc.
|
/* Copyright (C) 1997, 2000, 2007 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Richard Henderson (rth@tamu.edu).
|
Contributed by Richard Henderson (rth@tamu.edu).
|
||||||
|
|
||||||
@ -85,7 +85,7 @@ ENTRY (__clone)
|
|||||||
st %i0, [%g2+%lo(errno)]
|
st %i0, [%g2+%lo(errno)]
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
call __errno_location
|
call HIDDEN_JUMPTARGET(__errno_location)
|
||||||
nop
|
nop
|
||||||
st %i0, [%o0]
|
st %i0, [%o0]
|
||||||
#endif
|
#endif
|
||||||
@ -112,7 +112,7 @@ __thread_start:
|
|||||||
mov %g0, %fp /* terminate backtrace */
|
mov %g0, %fp /* terminate backtrace */
|
||||||
call %g2
|
call %g2
|
||||||
mov %g3,%o0
|
mov %g3,%o0
|
||||||
call _exit,0
|
call HIDDEN_JUMPTARGET(_exit),0
|
||||||
nop
|
nop
|
||||||
cfi_endproc
|
cfi_endproc
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2000, 2002, 2003, 2004 Free Software Foundation, Inc.
|
/* Copyright (C) 2000, 2002, 2003, 2004, 2007 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>, 2000.
|
Contributed by Jakub Jelinek <jakub@redhat.com>, 2000.
|
||||||
|
|
||||||
@ -149,5 +149,8 @@
|
|||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __ASSEMBLER__
|
||||||
|
# define JUMPTARGET(sym) sym
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* _LINUX_SPARC_SYSDEP_H */
|
#endif /* _LINUX_SPARC_SYSDEP_H */
|
||||||
|
Reference in New Issue
Block a user