2012-11-09 17:53:51 +00:00
|
|
|
/* Thread-local storage handling in the ELF dynamic linker.
|
|
|
|
AArch64 version.
|
2024-01-01 18:12:26 +00:00
|
|
|
Copyright (C) 2011-2024 Free Software Foundation, Inc.
|
2012-11-09 17:53:51 +00:00
|
|
|
|
|
|
|
This file is part of the GNU C Library.
|
|
|
|
|
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
|
|
|
modify it under the terms of the GNU Lesser General Public
|
|
|
|
License as published by the Free Software Foundation; either
|
|
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
|
|
|
|
The GNU C Library is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
Lesser General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
|
|
License along with the GNU C Library; if not, see
|
Prefer https to http for gnu.org and fsf.org URLs
Also, change sources.redhat.com to sourceware.org.
This patch was automatically generated by running the following shell
script, which uses GNU sed, and which avoids modifying files imported
from upstream:
sed -ri '
s,(http|ftp)(://(.*\.)?(gnu|fsf|sourceware)\.org($|[^.]|\.[^a-z])),https\2,g
s,(http|ftp)(://(.*\.)?)sources\.redhat\.com($|[^.]|\.[^a-z]),https\2sourceware.org\4,g
' \
$(find $(git ls-files) -prune -type f \
! -name '*.po' \
! -name 'ChangeLog*' \
! -path COPYING ! -path COPYING.LIB \
! -path manual/fdl-1.3.texi ! -path manual/lgpl-2.1.texi \
! -path manual/texinfo.tex ! -path scripts/config.guess \
! -path scripts/config.sub ! -path scripts/install-sh \
! -path scripts/mkinstalldirs ! -path scripts/move-if-change \
! -path INSTALL ! -path locale/programs/charmap-kw.h \
! -path po/libc.pot ! -path sysdeps/gnu/errlist.c \
! '(' -name configure \
-execdir test -f configure.ac -o -f configure.in ';' ')' \
! '(' -name preconfigure \
-execdir test -f preconfigure.ac ';' ')' \
-print)
and then by running 'make dist-prepare' to regenerate files built
from the altered files, and then executing the following to cleanup:
chmod a+x sysdeps/unix/sysv/linux/riscv/configure
# Omit irrelevant whitespace and comment-only changes,
# perhaps from a slightly-different Autoconf version.
git checkout -f \
sysdeps/csky/configure \
sysdeps/hppa/configure \
sysdeps/riscv/configure \
sysdeps/unix/sysv/linux/csky/configure
# Omit changes that caused a pre-commit check to fail like this:
# remote: *** error: sysdeps/powerpc/powerpc64/ppc-mcount.S: trailing lines
git checkout -f \
sysdeps/powerpc/powerpc64/ppc-mcount.S \
sysdeps/unix/sysv/linux/s390/s390-64/syscall.S
# Omit change that caused a pre-commit check to fail like this:
# remote: *** error: sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S: last line does not end in newline
git checkout -f sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S
2019-09-07 05:40:42 +00:00
|
|
|
<https://www.gnu.org/licenses/>. */
|
2012-11-09 17:53:51 +00:00
|
|
|
|
|
|
|
#include <sysdep.h>
|
|
|
|
#include <tls.h>
|
|
|
|
#include "tlsdesc.h"
|
|
|
|
|
|
|
|
#define NSAVEDQREGPAIRS 16
|
|
|
|
#define SAVE_Q_REGISTERS \
|
|
|
|
stp q0, q1, [sp, #-32*NSAVEDQREGPAIRS]!; \
|
|
|
|
cfi_adjust_cfa_offset (32*NSAVEDQREGPAIRS); \
|
|
|
|
stp q2, q3, [sp, #32*1]; \
|
|
|
|
stp q4, q5, [sp, #32*2]; \
|
|
|
|
stp q6, q7, [sp, #32*3]; \
|
|
|
|
stp q8, q9, [sp, #32*4]; \
|
|
|
|
stp q10, q11, [sp, #32*5]; \
|
|
|
|
stp q12, q13, [sp, #32*6]; \
|
|
|
|
stp q14, q15, [sp, #32*7]; \
|
|
|
|
stp q16, q17, [sp, #32*8]; \
|
|
|
|
stp q18, q19, [sp, #32*9]; \
|
|
|
|
stp q20, q21, [sp, #32*10]; \
|
|
|
|
stp q22, q23, [sp, #32*11]; \
|
|
|
|
stp q24, q25, [sp, #32*12]; \
|
|
|
|
stp q26, q27, [sp, #32*13]; \
|
|
|
|
stp q28, q29, [sp, #32*14]; \
|
|
|
|
stp q30, q31, [sp, #32*15];
|
|
|
|
|
|
|
|
#define RESTORE_Q_REGISTERS \
|
|
|
|
ldp q2, q3, [sp, #32*1]; \
|
|
|
|
ldp q4, q5, [sp, #32*2]; \
|
|
|
|
ldp q6, q7, [sp, #32*3]; \
|
|
|
|
ldp q8, q9, [sp, #32*4]; \
|
|
|
|
ldp q10, q11, [sp, #32*5]; \
|
|
|
|
ldp q12, q13, [sp, #32*6]; \
|
|
|
|
ldp q14, q15, [sp, #32*7]; \
|
|
|
|
ldp q16, q17, [sp, #32*8]; \
|
|
|
|
ldp q18, q19, [sp, #32*9]; \
|
|
|
|
ldp q20, q21, [sp, #32*10]; \
|
|
|
|
ldp q22, q23, [sp, #32*11]; \
|
|
|
|
ldp q24, q25, [sp, #32*12]; \
|
|
|
|
ldp q26, q27, [sp, #32*13]; \
|
|
|
|
ldp q28, q29, [sp, #32*14]; \
|
|
|
|
ldp q30, q31, [sp, #32*15]; \
|
|
|
|
ldp q0, q1, [sp], #32*NSAVEDQREGPAIRS; \
|
|
|
|
cfi_adjust_cfa_offset (-32*NSAVEDQREGPAIRS);
|
|
|
|
|
|
|
|
.text
|
|
|
|
|
|
|
|
/* Compute the thread pointer offset for symbols in the static
|
|
|
|
TLS block. The offset is the same for all threads.
|
|
|
|
Prototype:
|
|
|
|
_dl_tlsdesc_return (tlsdesc *) ;
|
|
|
|
*/
|
|
|
|
.hidden _dl_tlsdesc_return
|
|
|
|
.global _dl_tlsdesc_return
|
|
|
|
.type _dl_tlsdesc_return,%function
|
|
|
|
cfi_startproc
|
|
|
|
.align 2
|
|
|
|
_dl_tlsdesc_return:
|
2020-03-17 15:44:18 +00:00
|
|
|
BTI_C
|
2020-12-17 10:03:05 +00:00
|
|
|
PTR_ARG (0)
|
Partial ILP32 support for aarch64.
* sysdeps/aarch64/crti.S: Add include of sysdep.h.
(call_weak_fn): Use PTR_REG to get correct reg name in ILP32.
* sysdeps/aarch64/dl-irel.h: Add include of sysdep.h.
(elf_irela): Use AARCH64_R macro to get correct relocation in ILP32.
* sysdeps/aarch64/dl-machine.h: Add include of sysdep.h.
(elf_machine_load_address, RTLD_START, RTLD_START_1, RTLD_START,
elf_machine_type_class, ELF_MACHINE_JMP_SLOT, elf_machine_rela,
elf_machine_lazy_rel): Add ifdef's for ILP32 support.
* sysdeps/aarch64/dl-tlsdesc.S (_dl_tlsdesc_return,
_dl_tlsdesc_return_lazy, _dl_tlsdesc_dynamic,
_dl_tlsdesc_resolve_hold): Extend pointers in ILP32, use PTR_REG
to get correct reg name for ILP32.
* sysdeps/aarch64/dl-trampoline.S (ip01): New Macro.
(RELA_SIZE): New Macro.
(_dl_runtime_resolve, _dl_runtime_profile): Use new macros and PTR_REG
to support ILP32.
* sysdeps/aarch64/jmpbuf-unwind.h (_JMPBUF_CFA_UNWINDS_ADJ): Add
cast for ILP32 mode.
* sysdeps/aarch64/memcmp.S (memcmp): Extend arg pointers for ILP32 mode.
* sysdeps/aarch64/memcpy.S (memmove, memcpy): Ditto.
* sysdeps/aarch64/memset.S (__memset): Ditto.
* sysdeps/aarch64/strchr.S (strchr): Ditto.
* sysdeps/aarch64/strchrnul.S (__strchrnul): Ditto.
* sysdeps/aarch64/strcmp.S (strcmp): Ditto.
* sysdeps/aarch64/strcpy.S (strcpy): Ditto.
* sysdeps/aarch64/strlen.S (__strlen): Ditto.
* sysdeps/aarch64/strncmp.S (strncmp): Ditto.
* sysdeps/aarch64/strnlen.S (strnlen): Ditto.
* sysdeps/aarch64/strrchr.S (strrchr): Ditto.
* sysdeps/unix/sysv/linux/aarch64/clone.S: Ditto.
* sysdeps/unix/sysv/linux/aarch64/setcontext.S (__setcontext): Ditto.
* sysdeps/unix/sysv/linux/aarch64/swapcontext.S (__swapcontext): Ditto.
* sysdeps/aarch64/__longjmp.S (__longjmp): Extend pointers in ILP32,
change PTR_MANGLE call to use register numbers instead of names.
* sysdeps/unix/sysv/linux/aarch64/getcontext.S (__getcontext): Ditto.
* sysdeps/aarch64/setjmp.S (__sigsetjmp): Extend arg pointers for
ILP32 mode, change PTR_MANGLE calls to use register numbers.
* sysdeps/aarch64/start.S (_start): Ditto.
* sysdeps/aarch64/nptl/bits/pthreadtypes.h
(__PTHREAD_RWLOCK_INT_FLAGS_SHARED): New define.
(__SIZEOF_PTHREAD_ATTR_T, __SIZEOF_PTHREAD_MUTEX_T,
__SIZEOF_PTHREAD_MUTEXATTR_T, __SIZEOF_PTHREAD_COND_T,
__SIZEOF_PTHREAD_COND_COMPAT_T, __SIZEOF_PTHREAD_CONDATTR_T,
__SIZEOF_PTHREAD_RWLOCK_T, __SIZEOF_PTHREAD_RWLOCKATTR_T,
__SIZEOF_PTHREAD_BARRIER_T, __SIZEOF_PTHREAD_BARRIERATTR_T):
Make defined values dependent on __ILP32__.
* sysdeps/aarch64/nptl/bits/semaphore.h (__SIZEOF_SEM_T): Change define.
(sem_t): Change __align type.
* sysdeps/aarch64/sysdep.h (AARCH64_R, PTR_REG, PTR_LOG_SIZE, DELOUSE,
PTR_SIZE): New Macros.
(LDST_PCREL, LDST_GLOBAL) Update to use PTR_REG.
* sysdeps/unix/sysv/linux/aarch64/bits/fcntl.h (O_LARGEFILE):
Set when in ILP32 mode.
(F_GETLK64, F_SETLK64, F_SETLKW64): Only set in LP64 mode.
* sysdeps/unix/sysv/linux/aarch64/dl-cache.h (DL_CACHE_DEFAULT_ID):
Set elf flags for ILP32.
(add_system_dir): Set ILP32 library directories.
* sysdeps/unix/sysv/linux/aarch64/init-first.c
(_libc_vdso_platform_setup): Set minimum kernel version for ILP32.
* sysdeps/unix/sysv/linux/aarch64/ldconfig.h
(SYSDEP_KNOWN_INTERPRETER_NAMES): Add ILP32 names.
* sysdeps/unix/sysv/linux/aarch64/sigcontextinfo.h (GET_PC, SET_PC):
New Macros.
* sysdeps/unix/sysv/linux/aarch64/sysdep.h: Handle ILP32 pointers.
2016-11-28 17:01:23 +00:00
|
|
|
ldr PTR_REG (0), [x0, #PTR_SIZE]
|
2012-11-09 17:53:51 +00:00
|
|
|
RET
|
|
|
|
cfi_endproc
|
|
|
|
.size _dl_tlsdesc_return, .-_dl_tlsdesc_return
|
|
|
|
|
|
|
|
/* Handler for undefined weak TLS symbols.
|
|
|
|
Prototype:
|
|
|
|
_dl_tlsdesc_undefweak (tlsdesc *);
|
|
|
|
|
|
|
|
The second word of the descriptor contains the addend.
|
|
|
|
Return the addend minus the thread pointer. This ensures
|
|
|
|
that when the caller adds on the thread pointer it gets back
|
|
|
|
the addend. */
|
|
|
|
|
|
|
|
.hidden _dl_tlsdesc_undefweak
|
|
|
|
.global _dl_tlsdesc_undefweak
|
|
|
|
.type _dl_tlsdesc_undefweak,%function
|
|
|
|
cfi_startproc
|
|
|
|
.align 2
|
|
|
|
_dl_tlsdesc_undefweak:
|
2020-03-17 15:44:18 +00:00
|
|
|
BTI_C
|
2012-11-09 17:53:51 +00:00
|
|
|
str x1, [sp, #-16]!
|
2015-06-17 11:44:53 +00:00
|
|
|
cfi_adjust_cfa_offset (16)
|
2020-12-17 10:03:05 +00:00
|
|
|
PTR_ARG (0)
|
Partial ILP32 support for aarch64.
* sysdeps/aarch64/crti.S: Add include of sysdep.h.
(call_weak_fn): Use PTR_REG to get correct reg name in ILP32.
* sysdeps/aarch64/dl-irel.h: Add include of sysdep.h.
(elf_irela): Use AARCH64_R macro to get correct relocation in ILP32.
* sysdeps/aarch64/dl-machine.h: Add include of sysdep.h.
(elf_machine_load_address, RTLD_START, RTLD_START_1, RTLD_START,
elf_machine_type_class, ELF_MACHINE_JMP_SLOT, elf_machine_rela,
elf_machine_lazy_rel): Add ifdef's for ILP32 support.
* sysdeps/aarch64/dl-tlsdesc.S (_dl_tlsdesc_return,
_dl_tlsdesc_return_lazy, _dl_tlsdesc_dynamic,
_dl_tlsdesc_resolve_hold): Extend pointers in ILP32, use PTR_REG
to get correct reg name for ILP32.
* sysdeps/aarch64/dl-trampoline.S (ip01): New Macro.
(RELA_SIZE): New Macro.
(_dl_runtime_resolve, _dl_runtime_profile): Use new macros and PTR_REG
to support ILP32.
* sysdeps/aarch64/jmpbuf-unwind.h (_JMPBUF_CFA_UNWINDS_ADJ): Add
cast for ILP32 mode.
* sysdeps/aarch64/memcmp.S (memcmp): Extend arg pointers for ILP32 mode.
* sysdeps/aarch64/memcpy.S (memmove, memcpy): Ditto.
* sysdeps/aarch64/memset.S (__memset): Ditto.
* sysdeps/aarch64/strchr.S (strchr): Ditto.
* sysdeps/aarch64/strchrnul.S (__strchrnul): Ditto.
* sysdeps/aarch64/strcmp.S (strcmp): Ditto.
* sysdeps/aarch64/strcpy.S (strcpy): Ditto.
* sysdeps/aarch64/strlen.S (__strlen): Ditto.
* sysdeps/aarch64/strncmp.S (strncmp): Ditto.
* sysdeps/aarch64/strnlen.S (strnlen): Ditto.
* sysdeps/aarch64/strrchr.S (strrchr): Ditto.
* sysdeps/unix/sysv/linux/aarch64/clone.S: Ditto.
* sysdeps/unix/sysv/linux/aarch64/setcontext.S (__setcontext): Ditto.
* sysdeps/unix/sysv/linux/aarch64/swapcontext.S (__swapcontext): Ditto.
* sysdeps/aarch64/__longjmp.S (__longjmp): Extend pointers in ILP32,
change PTR_MANGLE call to use register numbers instead of names.
* sysdeps/unix/sysv/linux/aarch64/getcontext.S (__getcontext): Ditto.
* sysdeps/aarch64/setjmp.S (__sigsetjmp): Extend arg pointers for
ILP32 mode, change PTR_MANGLE calls to use register numbers.
* sysdeps/aarch64/start.S (_start): Ditto.
* sysdeps/aarch64/nptl/bits/pthreadtypes.h
(__PTHREAD_RWLOCK_INT_FLAGS_SHARED): New define.
(__SIZEOF_PTHREAD_ATTR_T, __SIZEOF_PTHREAD_MUTEX_T,
__SIZEOF_PTHREAD_MUTEXATTR_T, __SIZEOF_PTHREAD_COND_T,
__SIZEOF_PTHREAD_COND_COMPAT_T, __SIZEOF_PTHREAD_CONDATTR_T,
__SIZEOF_PTHREAD_RWLOCK_T, __SIZEOF_PTHREAD_RWLOCKATTR_T,
__SIZEOF_PTHREAD_BARRIER_T, __SIZEOF_PTHREAD_BARRIERATTR_T):
Make defined values dependent on __ILP32__.
* sysdeps/aarch64/nptl/bits/semaphore.h (__SIZEOF_SEM_T): Change define.
(sem_t): Change __align type.
* sysdeps/aarch64/sysdep.h (AARCH64_R, PTR_REG, PTR_LOG_SIZE, DELOUSE,
PTR_SIZE): New Macros.
(LDST_PCREL, LDST_GLOBAL) Update to use PTR_REG.
* sysdeps/unix/sysv/linux/aarch64/bits/fcntl.h (O_LARGEFILE):
Set when in ILP32 mode.
(F_GETLK64, F_SETLK64, F_SETLKW64): Only set in LP64 mode.
* sysdeps/unix/sysv/linux/aarch64/dl-cache.h (DL_CACHE_DEFAULT_ID):
Set elf flags for ILP32.
(add_system_dir): Set ILP32 library directories.
* sysdeps/unix/sysv/linux/aarch64/init-first.c
(_libc_vdso_platform_setup): Set minimum kernel version for ILP32.
* sysdeps/unix/sysv/linux/aarch64/ldconfig.h
(SYSDEP_KNOWN_INTERPRETER_NAMES): Add ILP32 names.
* sysdeps/unix/sysv/linux/aarch64/sigcontextinfo.h (GET_PC, SET_PC):
New Macros.
* sysdeps/unix/sysv/linux/aarch64/sysdep.h: Handle ILP32 pointers.
2016-11-28 17:01:23 +00:00
|
|
|
ldr PTR_REG (0), [x0, #PTR_SIZE]
|
2012-11-09 17:53:51 +00:00
|
|
|
mrs x1, tpidr_el0
|
Partial ILP32 support for aarch64.
* sysdeps/aarch64/crti.S: Add include of sysdep.h.
(call_weak_fn): Use PTR_REG to get correct reg name in ILP32.
* sysdeps/aarch64/dl-irel.h: Add include of sysdep.h.
(elf_irela): Use AARCH64_R macro to get correct relocation in ILP32.
* sysdeps/aarch64/dl-machine.h: Add include of sysdep.h.
(elf_machine_load_address, RTLD_START, RTLD_START_1, RTLD_START,
elf_machine_type_class, ELF_MACHINE_JMP_SLOT, elf_machine_rela,
elf_machine_lazy_rel): Add ifdef's for ILP32 support.
* sysdeps/aarch64/dl-tlsdesc.S (_dl_tlsdesc_return,
_dl_tlsdesc_return_lazy, _dl_tlsdesc_dynamic,
_dl_tlsdesc_resolve_hold): Extend pointers in ILP32, use PTR_REG
to get correct reg name for ILP32.
* sysdeps/aarch64/dl-trampoline.S (ip01): New Macro.
(RELA_SIZE): New Macro.
(_dl_runtime_resolve, _dl_runtime_profile): Use new macros and PTR_REG
to support ILP32.
* sysdeps/aarch64/jmpbuf-unwind.h (_JMPBUF_CFA_UNWINDS_ADJ): Add
cast for ILP32 mode.
* sysdeps/aarch64/memcmp.S (memcmp): Extend arg pointers for ILP32 mode.
* sysdeps/aarch64/memcpy.S (memmove, memcpy): Ditto.
* sysdeps/aarch64/memset.S (__memset): Ditto.
* sysdeps/aarch64/strchr.S (strchr): Ditto.
* sysdeps/aarch64/strchrnul.S (__strchrnul): Ditto.
* sysdeps/aarch64/strcmp.S (strcmp): Ditto.
* sysdeps/aarch64/strcpy.S (strcpy): Ditto.
* sysdeps/aarch64/strlen.S (__strlen): Ditto.
* sysdeps/aarch64/strncmp.S (strncmp): Ditto.
* sysdeps/aarch64/strnlen.S (strnlen): Ditto.
* sysdeps/aarch64/strrchr.S (strrchr): Ditto.
* sysdeps/unix/sysv/linux/aarch64/clone.S: Ditto.
* sysdeps/unix/sysv/linux/aarch64/setcontext.S (__setcontext): Ditto.
* sysdeps/unix/sysv/linux/aarch64/swapcontext.S (__swapcontext): Ditto.
* sysdeps/aarch64/__longjmp.S (__longjmp): Extend pointers in ILP32,
change PTR_MANGLE call to use register numbers instead of names.
* sysdeps/unix/sysv/linux/aarch64/getcontext.S (__getcontext): Ditto.
* sysdeps/aarch64/setjmp.S (__sigsetjmp): Extend arg pointers for
ILP32 mode, change PTR_MANGLE calls to use register numbers.
* sysdeps/aarch64/start.S (_start): Ditto.
* sysdeps/aarch64/nptl/bits/pthreadtypes.h
(__PTHREAD_RWLOCK_INT_FLAGS_SHARED): New define.
(__SIZEOF_PTHREAD_ATTR_T, __SIZEOF_PTHREAD_MUTEX_T,
__SIZEOF_PTHREAD_MUTEXATTR_T, __SIZEOF_PTHREAD_COND_T,
__SIZEOF_PTHREAD_COND_COMPAT_T, __SIZEOF_PTHREAD_CONDATTR_T,
__SIZEOF_PTHREAD_RWLOCK_T, __SIZEOF_PTHREAD_RWLOCKATTR_T,
__SIZEOF_PTHREAD_BARRIER_T, __SIZEOF_PTHREAD_BARRIERATTR_T):
Make defined values dependent on __ILP32__.
* sysdeps/aarch64/nptl/bits/semaphore.h (__SIZEOF_SEM_T): Change define.
(sem_t): Change __align type.
* sysdeps/aarch64/sysdep.h (AARCH64_R, PTR_REG, PTR_LOG_SIZE, DELOUSE,
PTR_SIZE): New Macros.
(LDST_PCREL, LDST_GLOBAL) Update to use PTR_REG.
* sysdeps/unix/sysv/linux/aarch64/bits/fcntl.h (O_LARGEFILE):
Set when in ILP32 mode.
(F_GETLK64, F_SETLK64, F_SETLKW64): Only set in LP64 mode.
* sysdeps/unix/sysv/linux/aarch64/dl-cache.h (DL_CACHE_DEFAULT_ID):
Set elf flags for ILP32.
(add_system_dir): Set ILP32 library directories.
* sysdeps/unix/sysv/linux/aarch64/init-first.c
(_libc_vdso_platform_setup): Set minimum kernel version for ILP32.
* sysdeps/unix/sysv/linux/aarch64/ldconfig.h
(SYSDEP_KNOWN_INTERPRETER_NAMES): Add ILP32 names.
* sysdeps/unix/sysv/linux/aarch64/sigcontextinfo.h (GET_PC, SET_PC):
New Macros.
* sysdeps/unix/sysv/linux/aarch64/sysdep.h: Handle ILP32 pointers.
2016-11-28 17:01:23 +00:00
|
|
|
sub PTR_REG (0), PTR_REG (0), PTR_REG (1)
|
2012-11-09 17:53:51 +00:00
|
|
|
ldr x1, [sp], #16
|
2015-06-17 11:44:53 +00:00
|
|
|
cfi_adjust_cfa_offset (-16)
|
2012-11-09 17:53:51 +00:00
|
|
|
RET
|
|
|
|
cfi_endproc
|
|
|
|
.size _dl_tlsdesc_undefweak, .-_dl_tlsdesc_undefweak
|
|
|
|
|
|
|
|
#ifdef SHARED
|
|
|
|
/* Handler for dynamic TLS symbols.
|
|
|
|
Prototype:
|
|
|
|
_dl_tlsdesc_dynamic (tlsdesc *) ;
|
|
|
|
|
|
|
|
The second word of the descriptor points to a
|
|
|
|
tlsdesc_dynamic_arg structure.
|
|
|
|
|
|
|
|
Returns the offset between the thread pointer and the
|
|
|
|
object referenced by the argument.
|
|
|
|
|
|
|
|
ptrdiff_t
|
|
|
|
__attribute__ ((__regparm__ (1)))
|
|
|
|
_dl_tlsdesc_dynamic (struct tlsdesc *tdp)
|
|
|
|
{
|
|
|
|
struct tlsdesc_dynamic_arg *td = tdp->arg;
|
aarch64: Use explicit offsets in _dl_tlsdesc_dynamic
Commit 389d1f1b232b3d6b9d73ee2c50e543ace6675621 (“Partial ILP32
support for aarch64”) broke dynamic TLS support because a load
offset changed:
0000000000000030 <_dl_tlsdesc_dynamic>:
30: a9bc7bfd stp x29, x30, [sp,#-64]!
34: 910003fd mov x29, sp
38: a9020be1 stp x1, x2, [sp,#32]
3c: a90313e3 stp x3, x4, [sp,#48]
40: d53bd044 mrs x4, tpidr_el0
44: c8dffc1f ldar xzr, [x0]
48: f9400401 ldr x1, [x0,#8]
4c: f9400080 ldr x0, [x4]
50: f9400823 ldr x3, [x1,#16]
54: f9400002 ldr x2, [x0]
58: eb02007f cmp x3, x2
5c: 540001a8 b.hi 90 <_dl_tlsdesc_dynamic+0x60>
60: f9400022 ldr x2, [x1]
64: 8b021000 add x0, x0, x2, lsl #4
68: f9400000 ldr x0, [x0]
6c: b100041f cmn x0, #0x1
70: 54000100 b.eq 90 <_dl_tlsdesc_dynamic+0x60>
- 74: f9400421 ldr x1, [x1,#8]
+ 74: f9400821 ldr x1, [x1,#16]
78: 8b010000 add x0, x0, x1
…
This commit introduces explicit struct offsets, generated
from the C headers, fixing the regression.
2016-12-02 15:52:57 +00:00
|
|
|
dtv_t *dtv = *(dtv_t **)((char *)__thread_pointer + TCBHEAD_DTV);
|
2012-11-09 17:53:51 +00:00
|
|
|
if (__builtin_expect (td->gen_count <= dtv[0].counter
|
|
|
|
&& (dtv[td->tlsinfo.ti_module].pointer.val
|
|
|
|
!= TLS_DTV_UNALLOCATED),
|
|
|
|
1))
|
|
|
|
return dtv[td->tlsinfo.ti_module].pointer.val
|
|
|
|
+ td->tlsinfo.ti_offset
|
|
|
|
- __thread_pointer;
|
|
|
|
|
|
|
|
return ___tls_get_addr (&td->tlsinfo) - __thread_pointer;
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
|
|
|
|
.hidden _dl_tlsdesc_dynamic
|
|
|
|
.global _dl_tlsdesc_dynamic
|
|
|
|
.type _dl_tlsdesc_dynamic,%function
|
|
|
|
cfi_startproc
|
|
|
|
.align 2
|
|
|
|
_dl_tlsdesc_dynamic:
|
2020-03-17 15:44:18 +00:00
|
|
|
BTI_C
|
2020-12-17 10:03:05 +00:00
|
|
|
PTR_ARG (0)
|
2012-11-09 17:53:51 +00:00
|
|
|
|
|
|
|
/* Save just enough registers to support fast path, if we fall
|
|
|
|
into slow path we will save additional registers. */
|
2017-10-24 16:49:14 +00:00
|
|
|
stp x1, x2, [sp, #-32]!
|
|
|
|
cfi_adjust_cfa_offset (32)
|
aarch64: fix stack missing after sp is updated
After sp is updated, the CFA offset should be set before next instruction.
Tested in glibc-2.28:
Thread 2 "xxxxxxx" hit Breakpoint 1, _dl_tlsdesc_dynamic () at ../sysdeps/aarch64/dl-tlsdesc.S:149
149 stp x1, x2, [sp, #-32]!
Missing separate debuginfos, use: dnf debuginfo-install libgcc-7.3.0-20190804.h24.aarch64
(gdb) bt
#0 _dl_tlsdesc_dynamic () at ../sysdeps/aarch64/dl-tlsdesc.S:149
#1 0x0000ffffbe4fbb44 in OurFunction (threadId=3194870184)
at /home/test/test_function.c:30
#2 0x0000000000400c08 in initaaa () at thread.c:58
#3 0x0000000000400c50 in thread_proc (param=0x0) at thread.c:71
#4 0x0000ffffbf6918bc in start_thread (arg=0xfffffffff29f) at pthread_create.c:486
#5 0x0000ffffbf5669ec in thread_start () at ../sysdeps/unix/sysv/linux/aarch64/clone.S:78
(gdb) ni
_dl_tlsdesc_dynamic () at ../sysdeps/aarch64/dl-tlsdesc.S:150
150 stp x3, x4, [sp, #16]
(gdb) bt
#0 _dl_tlsdesc_dynamic () at ../sysdeps/aarch64/dl-tlsdesc.S:150
#1 0x0000ffffbe4fbb44 in OurFunction (threadId=3194870184)
at /home/test/test_function.c:30
#2 0x0000000000000000 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(gdb) ni
_dl_tlsdesc_dynamic () at ../sysdeps/aarch64/dl-tlsdesc.S:157
157 mrs x4, tpidr_el0
(gdb) bt
#0 _dl_tlsdesc_dynamic () at ../sysdeps/aarch64/dl-tlsdesc.S:157
#1 0x0000ffffbe4fbb44 in OurFunction (threadId=3194870184)
at /home/test/test_function.c:30
#2 0x0000000000400c08 in initaaa () at thread.c:58
#3 0x0000000000400c50 in thread_proc (param=0x0) at thread.c:71
#4 0x0000ffffbf6918bc in start_thread (arg=0xfffffffff29f) at pthread_create.c:486
#5 0x0000ffffbf5669ec in thread_start () at ../sysdeps/unix/sysv/linux/aarch64/clone.S:78
Signed-off-by: liqingqing <liqingqing3@huawei.com>
Signed-off-by: Shuo Wang <wangshuo47@huawei.com>
2021-01-04 12:42:52 +00:00
|
|
|
stp x3, x4, [sp, #16]
|
2017-10-24 16:49:14 +00:00
|
|
|
cfi_rel_offset (x1, 0)
|
|
|
|
cfi_rel_offset (x2, 8)
|
|
|
|
cfi_rel_offset (x3, 16)
|
|
|
|
cfi_rel_offset (x4, 24)
|
2012-11-09 17:53:51 +00:00
|
|
|
|
|
|
|
mrs x4, tpidr_el0
|
aarch64: Use explicit offsets in _dl_tlsdesc_dynamic
Commit 389d1f1b232b3d6b9d73ee2c50e543ace6675621 (“Partial ILP32
support for aarch64”) broke dynamic TLS support because a load
offset changed:
0000000000000030 <_dl_tlsdesc_dynamic>:
30: a9bc7bfd stp x29, x30, [sp,#-64]!
34: 910003fd mov x29, sp
38: a9020be1 stp x1, x2, [sp,#32]
3c: a90313e3 stp x3, x4, [sp,#48]
40: d53bd044 mrs x4, tpidr_el0
44: c8dffc1f ldar xzr, [x0]
48: f9400401 ldr x1, [x0,#8]
4c: f9400080 ldr x0, [x4]
50: f9400823 ldr x3, [x1,#16]
54: f9400002 ldr x2, [x0]
58: eb02007f cmp x3, x2
5c: 540001a8 b.hi 90 <_dl_tlsdesc_dynamic+0x60>
60: f9400022 ldr x2, [x1]
64: 8b021000 add x0, x0, x2, lsl #4
68: f9400000 ldr x0, [x0]
6c: b100041f cmn x0, #0x1
70: 54000100 b.eq 90 <_dl_tlsdesc_dynamic+0x60>
- 74: f9400421 ldr x1, [x1,#8]
+ 74: f9400821 ldr x1, [x1,#16]
78: 8b010000 add x0, x0, x1
…
This commit introduces explicit struct offsets, generated
from the C headers, fixing the regression.
2016-12-02 15:52:57 +00:00
|
|
|
ldr PTR_REG (1), [x0,#TLSDESC_ARG]
|
|
|
|
ldr PTR_REG (0), [x4,#TCBHEAD_DTV]
|
|
|
|
ldr PTR_REG (3), [x1,#TLSDESC_GEN_COUNT]
|
|
|
|
ldr PTR_REG (2), [x0,#DTV_COUNTER]
|
Partial ILP32 support for aarch64.
* sysdeps/aarch64/crti.S: Add include of sysdep.h.
(call_weak_fn): Use PTR_REG to get correct reg name in ILP32.
* sysdeps/aarch64/dl-irel.h: Add include of sysdep.h.
(elf_irela): Use AARCH64_R macro to get correct relocation in ILP32.
* sysdeps/aarch64/dl-machine.h: Add include of sysdep.h.
(elf_machine_load_address, RTLD_START, RTLD_START_1, RTLD_START,
elf_machine_type_class, ELF_MACHINE_JMP_SLOT, elf_machine_rela,
elf_machine_lazy_rel): Add ifdef's for ILP32 support.
* sysdeps/aarch64/dl-tlsdesc.S (_dl_tlsdesc_return,
_dl_tlsdesc_return_lazy, _dl_tlsdesc_dynamic,
_dl_tlsdesc_resolve_hold): Extend pointers in ILP32, use PTR_REG
to get correct reg name for ILP32.
* sysdeps/aarch64/dl-trampoline.S (ip01): New Macro.
(RELA_SIZE): New Macro.
(_dl_runtime_resolve, _dl_runtime_profile): Use new macros and PTR_REG
to support ILP32.
* sysdeps/aarch64/jmpbuf-unwind.h (_JMPBUF_CFA_UNWINDS_ADJ): Add
cast for ILP32 mode.
* sysdeps/aarch64/memcmp.S (memcmp): Extend arg pointers for ILP32 mode.
* sysdeps/aarch64/memcpy.S (memmove, memcpy): Ditto.
* sysdeps/aarch64/memset.S (__memset): Ditto.
* sysdeps/aarch64/strchr.S (strchr): Ditto.
* sysdeps/aarch64/strchrnul.S (__strchrnul): Ditto.
* sysdeps/aarch64/strcmp.S (strcmp): Ditto.
* sysdeps/aarch64/strcpy.S (strcpy): Ditto.
* sysdeps/aarch64/strlen.S (__strlen): Ditto.
* sysdeps/aarch64/strncmp.S (strncmp): Ditto.
* sysdeps/aarch64/strnlen.S (strnlen): Ditto.
* sysdeps/aarch64/strrchr.S (strrchr): Ditto.
* sysdeps/unix/sysv/linux/aarch64/clone.S: Ditto.
* sysdeps/unix/sysv/linux/aarch64/setcontext.S (__setcontext): Ditto.
* sysdeps/unix/sysv/linux/aarch64/swapcontext.S (__swapcontext): Ditto.
* sysdeps/aarch64/__longjmp.S (__longjmp): Extend pointers in ILP32,
change PTR_MANGLE call to use register numbers instead of names.
* sysdeps/unix/sysv/linux/aarch64/getcontext.S (__getcontext): Ditto.
* sysdeps/aarch64/setjmp.S (__sigsetjmp): Extend arg pointers for
ILP32 mode, change PTR_MANGLE calls to use register numbers.
* sysdeps/aarch64/start.S (_start): Ditto.
* sysdeps/aarch64/nptl/bits/pthreadtypes.h
(__PTHREAD_RWLOCK_INT_FLAGS_SHARED): New define.
(__SIZEOF_PTHREAD_ATTR_T, __SIZEOF_PTHREAD_MUTEX_T,
__SIZEOF_PTHREAD_MUTEXATTR_T, __SIZEOF_PTHREAD_COND_T,
__SIZEOF_PTHREAD_COND_COMPAT_T, __SIZEOF_PTHREAD_CONDATTR_T,
__SIZEOF_PTHREAD_RWLOCK_T, __SIZEOF_PTHREAD_RWLOCKATTR_T,
__SIZEOF_PTHREAD_BARRIER_T, __SIZEOF_PTHREAD_BARRIERATTR_T):
Make defined values dependent on __ILP32__.
* sysdeps/aarch64/nptl/bits/semaphore.h (__SIZEOF_SEM_T): Change define.
(sem_t): Change __align type.
* sysdeps/aarch64/sysdep.h (AARCH64_R, PTR_REG, PTR_LOG_SIZE, DELOUSE,
PTR_SIZE): New Macros.
(LDST_PCREL, LDST_GLOBAL) Update to use PTR_REG.
* sysdeps/unix/sysv/linux/aarch64/bits/fcntl.h (O_LARGEFILE):
Set when in ILP32 mode.
(F_GETLK64, F_SETLK64, F_SETLKW64): Only set in LP64 mode.
* sysdeps/unix/sysv/linux/aarch64/dl-cache.h (DL_CACHE_DEFAULT_ID):
Set elf flags for ILP32.
(add_system_dir): Set ILP32 library directories.
* sysdeps/unix/sysv/linux/aarch64/init-first.c
(_libc_vdso_platform_setup): Set minimum kernel version for ILP32.
* sysdeps/unix/sysv/linux/aarch64/ldconfig.h
(SYSDEP_KNOWN_INTERPRETER_NAMES): Add ILP32 names.
* sysdeps/unix/sysv/linux/aarch64/sigcontextinfo.h (GET_PC, SET_PC):
New Macros.
* sysdeps/unix/sysv/linux/aarch64/sysdep.h: Handle ILP32 pointers.
2016-11-28 17:01:23 +00:00
|
|
|
cmp PTR_REG (3), PTR_REG (2)
|
2012-11-09 17:53:51 +00:00
|
|
|
b.hi 2f
|
2017-10-24 16:49:14 +00:00
|
|
|
/* Load r2 = td->tlsinfo.ti_module and r3 = td->tlsinfo.ti_offset. */
|
|
|
|
ldp PTR_REG (2), PTR_REG (3), [x1,#TLSDESC_MODID]
|
Partial ILP32 support for aarch64.
* sysdeps/aarch64/crti.S: Add include of sysdep.h.
(call_weak_fn): Use PTR_REG to get correct reg name in ILP32.
* sysdeps/aarch64/dl-irel.h: Add include of sysdep.h.
(elf_irela): Use AARCH64_R macro to get correct relocation in ILP32.
* sysdeps/aarch64/dl-machine.h: Add include of sysdep.h.
(elf_machine_load_address, RTLD_START, RTLD_START_1, RTLD_START,
elf_machine_type_class, ELF_MACHINE_JMP_SLOT, elf_machine_rela,
elf_machine_lazy_rel): Add ifdef's for ILP32 support.
* sysdeps/aarch64/dl-tlsdesc.S (_dl_tlsdesc_return,
_dl_tlsdesc_return_lazy, _dl_tlsdesc_dynamic,
_dl_tlsdesc_resolve_hold): Extend pointers in ILP32, use PTR_REG
to get correct reg name for ILP32.
* sysdeps/aarch64/dl-trampoline.S (ip01): New Macro.
(RELA_SIZE): New Macro.
(_dl_runtime_resolve, _dl_runtime_profile): Use new macros and PTR_REG
to support ILP32.
* sysdeps/aarch64/jmpbuf-unwind.h (_JMPBUF_CFA_UNWINDS_ADJ): Add
cast for ILP32 mode.
* sysdeps/aarch64/memcmp.S (memcmp): Extend arg pointers for ILP32 mode.
* sysdeps/aarch64/memcpy.S (memmove, memcpy): Ditto.
* sysdeps/aarch64/memset.S (__memset): Ditto.
* sysdeps/aarch64/strchr.S (strchr): Ditto.
* sysdeps/aarch64/strchrnul.S (__strchrnul): Ditto.
* sysdeps/aarch64/strcmp.S (strcmp): Ditto.
* sysdeps/aarch64/strcpy.S (strcpy): Ditto.
* sysdeps/aarch64/strlen.S (__strlen): Ditto.
* sysdeps/aarch64/strncmp.S (strncmp): Ditto.
* sysdeps/aarch64/strnlen.S (strnlen): Ditto.
* sysdeps/aarch64/strrchr.S (strrchr): Ditto.
* sysdeps/unix/sysv/linux/aarch64/clone.S: Ditto.
* sysdeps/unix/sysv/linux/aarch64/setcontext.S (__setcontext): Ditto.
* sysdeps/unix/sysv/linux/aarch64/swapcontext.S (__swapcontext): Ditto.
* sysdeps/aarch64/__longjmp.S (__longjmp): Extend pointers in ILP32,
change PTR_MANGLE call to use register numbers instead of names.
* sysdeps/unix/sysv/linux/aarch64/getcontext.S (__getcontext): Ditto.
* sysdeps/aarch64/setjmp.S (__sigsetjmp): Extend arg pointers for
ILP32 mode, change PTR_MANGLE calls to use register numbers.
* sysdeps/aarch64/start.S (_start): Ditto.
* sysdeps/aarch64/nptl/bits/pthreadtypes.h
(__PTHREAD_RWLOCK_INT_FLAGS_SHARED): New define.
(__SIZEOF_PTHREAD_ATTR_T, __SIZEOF_PTHREAD_MUTEX_T,
__SIZEOF_PTHREAD_MUTEXATTR_T, __SIZEOF_PTHREAD_COND_T,
__SIZEOF_PTHREAD_COND_COMPAT_T, __SIZEOF_PTHREAD_CONDATTR_T,
__SIZEOF_PTHREAD_RWLOCK_T, __SIZEOF_PTHREAD_RWLOCKATTR_T,
__SIZEOF_PTHREAD_BARRIER_T, __SIZEOF_PTHREAD_BARRIERATTR_T):
Make defined values dependent on __ILP32__.
* sysdeps/aarch64/nptl/bits/semaphore.h (__SIZEOF_SEM_T): Change define.
(sem_t): Change __align type.
* sysdeps/aarch64/sysdep.h (AARCH64_R, PTR_REG, PTR_LOG_SIZE, DELOUSE,
PTR_SIZE): New Macros.
(LDST_PCREL, LDST_GLOBAL) Update to use PTR_REG.
* sysdeps/unix/sysv/linux/aarch64/bits/fcntl.h (O_LARGEFILE):
Set when in ILP32 mode.
(F_GETLK64, F_SETLK64, F_SETLKW64): Only set in LP64 mode.
* sysdeps/unix/sysv/linux/aarch64/dl-cache.h (DL_CACHE_DEFAULT_ID):
Set elf flags for ILP32.
(add_system_dir): Set ILP32 library directories.
* sysdeps/unix/sysv/linux/aarch64/init-first.c
(_libc_vdso_platform_setup): Set minimum kernel version for ILP32.
* sysdeps/unix/sysv/linux/aarch64/ldconfig.h
(SYSDEP_KNOWN_INTERPRETER_NAMES): Add ILP32 names.
* sysdeps/unix/sysv/linux/aarch64/sigcontextinfo.h (GET_PC, SET_PC):
New Macros.
* sysdeps/unix/sysv/linux/aarch64/sysdep.h: Handle ILP32 pointers.
2016-11-28 17:01:23 +00:00
|
|
|
add PTR_REG (0), PTR_REG (0), PTR_REG (2), lsl #(PTR_LOG_SIZE + 1)
|
aarch64: Use explicit offsets in _dl_tlsdesc_dynamic
Commit 389d1f1b232b3d6b9d73ee2c50e543ace6675621 (“Partial ILP32
support for aarch64”) broke dynamic TLS support because a load
offset changed:
0000000000000030 <_dl_tlsdesc_dynamic>:
30: a9bc7bfd stp x29, x30, [sp,#-64]!
34: 910003fd mov x29, sp
38: a9020be1 stp x1, x2, [sp,#32]
3c: a90313e3 stp x3, x4, [sp,#48]
40: d53bd044 mrs x4, tpidr_el0
44: c8dffc1f ldar xzr, [x0]
48: f9400401 ldr x1, [x0,#8]
4c: f9400080 ldr x0, [x4]
50: f9400823 ldr x3, [x1,#16]
54: f9400002 ldr x2, [x0]
58: eb02007f cmp x3, x2
5c: 540001a8 b.hi 90 <_dl_tlsdesc_dynamic+0x60>
60: f9400022 ldr x2, [x1]
64: 8b021000 add x0, x0, x2, lsl #4
68: f9400000 ldr x0, [x0]
6c: b100041f cmn x0, #0x1
70: 54000100 b.eq 90 <_dl_tlsdesc_dynamic+0x60>
- 74: f9400421 ldr x1, [x1,#8]
+ 74: f9400821 ldr x1, [x1,#16]
78: 8b010000 add x0, x0, x1
…
This commit introduces explicit struct offsets, generated
from the C headers, fixing the regression.
2016-12-02 15:52:57 +00:00
|
|
|
ldr PTR_REG (0), [x0] /* Load val member of DTV entry. */
|
2017-08-22 23:22:05 +00:00
|
|
|
cmp PTR_REG (0), #TLS_DTV_UNALLOCATED
|
2012-11-09 17:53:51 +00:00
|
|
|
b.eq 2f
|
aarch64: push the set of rules before falling into slow path
It is supposed to save the rules for the instructions before falling into slow path.
Tested in glibc-2.28 before fixing:
Thread 2 "xxxxxxx" hit Breakpoint 1, _dl_tlsdesc_dynamic () at ../sysdeps/aarch64/dl-tlsdesc.S:149
149 stp x1, x2, [sp, #-32]!
Missing separate debuginfos, use: dnf debuginfo-install libgcc-7.3.0-20190804.h24.aarch64
(gdb) ni
_dl_tlsdesc_dynamic () at ../sysdeps/aarch64/dl-tlsdesc.S:150
150 stp x3, x4, [sp, #16]
(gdb)
_dl_tlsdesc_dynamic () at ../sysdeps/aarch64/dl-tlsdesc.S:157
157 mrs x4, tpidr_el0
(gdb)
158 ldr PTR_REG (1), [x0,#TLSDESC_ARG]
(gdb)
159 ldr PTR_REG (0), [x4,#TCBHEAD_DTV]
(gdb)
160 ldr PTR_REG (3), [x1,#TLSDESC_GEN_COUNT]
(gdb)
161 ldr PTR_REG (2), [x0,#DTV_COUNTER]
(gdb)
162 cmp PTR_REG (3), PTR_REG (2)
(gdb)
163 b.hi 2f
(gdb)
165 ldp PTR_REG (2), PTR_REG (3), [x1,#TLSDESC_MODID]
(gdb)
166 add PTR_REG (0), PTR_REG (0), PTR_REG (2), lsl #(PTR_LOG_SIZE + 1)
(gdb)
167 ldr PTR_REG (0), [x0] /* Load val member of DTV entry. */
(gdb)
168 cmp PTR_REG (0), #TLS_DTV_UNALLOCATED
(gdb)
169 b.eq 2f
(gdb) bt
#0 _dl_tlsdesc_dynamic () at ../sysdeps/aarch64/dl-tlsdesc.S:169
#1 0x0000ffffbe4fbb44 in OurFunction (threadId=4294967295)
at /home/test/test_function.c:30
#2 0x0000000000400c08 in initaaa () at thread.c:58
#3 0x0000000000400c50 in thread_proc (param=0x0) at thread.c:71
#4 0x0000ffffbf6918bc in start_thread (arg=0xfffffffff29f) at pthread_create.c:486
#5 0x0000ffffbf5669ec in thread_start () at ../sysdeps/unix/sysv/linux/aarch64/clone.S:78
(gdb) ni
_dl_tlsdesc_dynamic () at ../sysdeps/aarch64/dl-tlsdesc.S:184
184 stp x29, x30, [sp,#-16*NSAVEXREGPAIRS]!
(gdb) bt
#0 _dl_tlsdesc_dynamic () at ../sysdeps/aarch64/dl-tlsdesc.S:184
#1 0x0000ffffbe4fbb44 in OurFunction (threadId=4294967295)
at /home/test/test_function.c:30
#2 0x0000000000000000 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
Co-authored-by: liqingqing <liqingqing3@huawei.com>
2021-01-05 02:04:12 +00:00
|
|
|
cfi_remember_state
|
2017-10-24 16:49:14 +00:00
|
|
|
sub PTR_REG (3), PTR_REG (3), PTR_REG (4)
|
|
|
|
add PTR_REG (0), PTR_REG (0), PTR_REG (3)
|
2012-11-09 17:53:51 +00:00
|
|
|
1:
|
2017-10-24 16:49:14 +00:00
|
|
|
ldp x3, x4, [sp, #16]
|
|
|
|
ldp x1, x2, [sp], #32
|
|
|
|
cfi_adjust_cfa_offset (-32)
|
2012-11-09 17:53:51 +00:00
|
|
|
RET
|
|
|
|
2:
|
|
|
|
/* This is the slow path. We need to call __tls_get_addr() which
|
|
|
|
means we need to save and restore all the register that the
|
|
|
|
callee will trash. */
|
|
|
|
|
|
|
|
/* Save the remaining registers that we must treat as caller save. */
|
aarch64: push the set of rules before falling into slow path
It is supposed to save the rules for the instructions before falling into slow path.
Tested in glibc-2.28 before fixing:
Thread 2 "xxxxxxx" hit Breakpoint 1, _dl_tlsdesc_dynamic () at ../sysdeps/aarch64/dl-tlsdesc.S:149
149 stp x1, x2, [sp, #-32]!
Missing separate debuginfos, use: dnf debuginfo-install libgcc-7.3.0-20190804.h24.aarch64
(gdb) ni
_dl_tlsdesc_dynamic () at ../sysdeps/aarch64/dl-tlsdesc.S:150
150 stp x3, x4, [sp, #16]
(gdb)
_dl_tlsdesc_dynamic () at ../sysdeps/aarch64/dl-tlsdesc.S:157
157 mrs x4, tpidr_el0
(gdb)
158 ldr PTR_REG (1), [x0,#TLSDESC_ARG]
(gdb)
159 ldr PTR_REG (0), [x4,#TCBHEAD_DTV]
(gdb)
160 ldr PTR_REG (3), [x1,#TLSDESC_GEN_COUNT]
(gdb)
161 ldr PTR_REG (2), [x0,#DTV_COUNTER]
(gdb)
162 cmp PTR_REG (3), PTR_REG (2)
(gdb)
163 b.hi 2f
(gdb)
165 ldp PTR_REG (2), PTR_REG (3), [x1,#TLSDESC_MODID]
(gdb)
166 add PTR_REG (0), PTR_REG (0), PTR_REG (2), lsl #(PTR_LOG_SIZE + 1)
(gdb)
167 ldr PTR_REG (0), [x0] /* Load val member of DTV entry. */
(gdb)
168 cmp PTR_REG (0), #TLS_DTV_UNALLOCATED
(gdb)
169 b.eq 2f
(gdb) bt
#0 _dl_tlsdesc_dynamic () at ../sysdeps/aarch64/dl-tlsdesc.S:169
#1 0x0000ffffbe4fbb44 in OurFunction (threadId=4294967295)
at /home/test/test_function.c:30
#2 0x0000000000400c08 in initaaa () at thread.c:58
#3 0x0000000000400c50 in thread_proc (param=0x0) at thread.c:71
#4 0x0000ffffbf6918bc in start_thread (arg=0xfffffffff29f) at pthread_create.c:486
#5 0x0000ffffbf5669ec in thread_start () at ../sysdeps/unix/sysv/linux/aarch64/clone.S:78
(gdb) ni
_dl_tlsdesc_dynamic () at ../sysdeps/aarch64/dl-tlsdesc.S:184
184 stp x29, x30, [sp,#-16*NSAVEXREGPAIRS]!
(gdb) bt
#0 _dl_tlsdesc_dynamic () at ../sysdeps/aarch64/dl-tlsdesc.S:184
#1 0x0000ffffbe4fbb44 in OurFunction (threadId=4294967295)
at /home/test/test_function.c:30
#2 0x0000000000000000 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
Co-authored-by: liqingqing <liqingqing3@huawei.com>
2021-01-05 02:04:12 +00:00
|
|
|
cfi_restore_state
|
2020-04-29 10:49:20 +00:00
|
|
|
# if HAVE_AARCH64_PAC_RET
|
|
|
|
PACIASP
|
|
|
|
cfi_window_save
|
|
|
|
# endif
|
2017-10-24 16:49:14 +00:00
|
|
|
# define NSAVEXREGPAIRS 8
|
|
|
|
stp x29, x30, [sp,#-16*NSAVEXREGPAIRS]!
|
2012-11-09 17:53:51 +00:00
|
|
|
cfi_adjust_cfa_offset (16*NSAVEXREGPAIRS)
|
2017-10-24 16:49:14 +00:00
|
|
|
cfi_rel_offset (x29, 0)
|
|
|
|
cfi_rel_offset (x30, 8)
|
|
|
|
mov x29, sp
|
|
|
|
stp x5, x6, [sp, #16*1]
|
|
|
|
stp x7, x8, [sp, #16*2]
|
|
|
|
stp x9, x10, [sp, #16*3]
|
|
|
|
stp x11, x12, [sp, #16*4]
|
|
|
|
stp x13, x14, [sp, #16*5]
|
|
|
|
stp x15, x16, [sp, #16*6]
|
|
|
|
stp x17, x18, [sp, #16*7]
|
|
|
|
cfi_rel_offset (x5, 16*1)
|
|
|
|
cfi_rel_offset (x6, 16*1+8)
|
|
|
|
cfi_rel_offset (x7, 16*2)
|
|
|
|
cfi_rel_offset (x8, 16*2+8)
|
|
|
|
cfi_rel_offset (x9, 16*3)
|
|
|
|
cfi_rel_offset (x10, 16*3+8)
|
|
|
|
cfi_rel_offset (x11, 16*4)
|
|
|
|
cfi_rel_offset (x12, 16*4+8)
|
|
|
|
cfi_rel_offset (x13, 16*5)
|
|
|
|
cfi_rel_offset (x14, 16*5+8)
|
|
|
|
cfi_rel_offset (x15, 16*6)
|
|
|
|
cfi_rel_offset (x16, 16*6+8)
|
|
|
|
cfi_rel_offset (x17, 16*7)
|
|
|
|
cfi_rel_offset (x18, 16*7+8)
|
2012-11-09 17:53:51 +00:00
|
|
|
|
|
|
|
SAVE_Q_REGISTERS
|
|
|
|
|
|
|
|
mov x0, x1
|
2024-04-04 20:02:32 +00:00
|
|
|
bl HIDDEN_JUMPTARGET(__tls_get_addr)
|
2012-11-09 17:53:51 +00:00
|
|
|
|
|
|
|
mrs x1, tpidr_el0
|
Partial ILP32 support for aarch64.
* sysdeps/aarch64/crti.S: Add include of sysdep.h.
(call_weak_fn): Use PTR_REG to get correct reg name in ILP32.
* sysdeps/aarch64/dl-irel.h: Add include of sysdep.h.
(elf_irela): Use AARCH64_R macro to get correct relocation in ILP32.
* sysdeps/aarch64/dl-machine.h: Add include of sysdep.h.
(elf_machine_load_address, RTLD_START, RTLD_START_1, RTLD_START,
elf_machine_type_class, ELF_MACHINE_JMP_SLOT, elf_machine_rela,
elf_machine_lazy_rel): Add ifdef's for ILP32 support.
* sysdeps/aarch64/dl-tlsdesc.S (_dl_tlsdesc_return,
_dl_tlsdesc_return_lazy, _dl_tlsdesc_dynamic,
_dl_tlsdesc_resolve_hold): Extend pointers in ILP32, use PTR_REG
to get correct reg name for ILP32.
* sysdeps/aarch64/dl-trampoline.S (ip01): New Macro.
(RELA_SIZE): New Macro.
(_dl_runtime_resolve, _dl_runtime_profile): Use new macros and PTR_REG
to support ILP32.
* sysdeps/aarch64/jmpbuf-unwind.h (_JMPBUF_CFA_UNWINDS_ADJ): Add
cast for ILP32 mode.
* sysdeps/aarch64/memcmp.S (memcmp): Extend arg pointers for ILP32 mode.
* sysdeps/aarch64/memcpy.S (memmove, memcpy): Ditto.
* sysdeps/aarch64/memset.S (__memset): Ditto.
* sysdeps/aarch64/strchr.S (strchr): Ditto.
* sysdeps/aarch64/strchrnul.S (__strchrnul): Ditto.
* sysdeps/aarch64/strcmp.S (strcmp): Ditto.
* sysdeps/aarch64/strcpy.S (strcpy): Ditto.
* sysdeps/aarch64/strlen.S (__strlen): Ditto.
* sysdeps/aarch64/strncmp.S (strncmp): Ditto.
* sysdeps/aarch64/strnlen.S (strnlen): Ditto.
* sysdeps/aarch64/strrchr.S (strrchr): Ditto.
* sysdeps/unix/sysv/linux/aarch64/clone.S: Ditto.
* sysdeps/unix/sysv/linux/aarch64/setcontext.S (__setcontext): Ditto.
* sysdeps/unix/sysv/linux/aarch64/swapcontext.S (__swapcontext): Ditto.
* sysdeps/aarch64/__longjmp.S (__longjmp): Extend pointers in ILP32,
change PTR_MANGLE call to use register numbers instead of names.
* sysdeps/unix/sysv/linux/aarch64/getcontext.S (__getcontext): Ditto.
* sysdeps/aarch64/setjmp.S (__sigsetjmp): Extend arg pointers for
ILP32 mode, change PTR_MANGLE calls to use register numbers.
* sysdeps/aarch64/start.S (_start): Ditto.
* sysdeps/aarch64/nptl/bits/pthreadtypes.h
(__PTHREAD_RWLOCK_INT_FLAGS_SHARED): New define.
(__SIZEOF_PTHREAD_ATTR_T, __SIZEOF_PTHREAD_MUTEX_T,
__SIZEOF_PTHREAD_MUTEXATTR_T, __SIZEOF_PTHREAD_COND_T,
__SIZEOF_PTHREAD_COND_COMPAT_T, __SIZEOF_PTHREAD_CONDATTR_T,
__SIZEOF_PTHREAD_RWLOCK_T, __SIZEOF_PTHREAD_RWLOCKATTR_T,
__SIZEOF_PTHREAD_BARRIER_T, __SIZEOF_PTHREAD_BARRIERATTR_T):
Make defined values dependent on __ILP32__.
* sysdeps/aarch64/nptl/bits/semaphore.h (__SIZEOF_SEM_T): Change define.
(sem_t): Change __align type.
* sysdeps/aarch64/sysdep.h (AARCH64_R, PTR_REG, PTR_LOG_SIZE, DELOUSE,
PTR_SIZE): New Macros.
(LDST_PCREL, LDST_GLOBAL) Update to use PTR_REG.
* sysdeps/unix/sysv/linux/aarch64/bits/fcntl.h (O_LARGEFILE):
Set when in ILP32 mode.
(F_GETLK64, F_SETLK64, F_SETLKW64): Only set in LP64 mode.
* sysdeps/unix/sysv/linux/aarch64/dl-cache.h (DL_CACHE_DEFAULT_ID):
Set elf flags for ILP32.
(add_system_dir): Set ILP32 library directories.
* sysdeps/unix/sysv/linux/aarch64/init-first.c
(_libc_vdso_platform_setup): Set minimum kernel version for ILP32.
* sysdeps/unix/sysv/linux/aarch64/ldconfig.h
(SYSDEP_KNOWN_INTERPRETER_NAMES): Add ILP32 names.
* sysdeps/unix/sysv/linux/aarch64/sigcontextinfo.h (GET_PC, SET_PC):
New Macros.
* sysdeps/unix/sysv/linux/aarch64/sysdep.h: Handle ILP32 pointers.
2016-11-28 17:01:23 +00:00
|
|
|
sub PTR_REG (0), PTR_REG (0), PTR_REG (1)
|
2012-11-09 17:53:51 +00:00
|
|
|
|
|
|
|
RESTORE_Q_REGISTERS
|
|
|
|
|
2017-10-24 16:49:14 +00:00
|
|
|
ldp x5, x6, [sp, #16*1]
|
|
|
|
ldp x7, x8, [sp, #16*2]
|
|
|
|
ldp x9, x10, [sp, #16*3]
|
|
|
|
ldp x11, x12, [sp, #16*4]
|
|
|
|
ldp x13, x14, [sp, #16*5]
|
|
|
|
ldp x15, x16, [sp, #16*6]
|
|
|
|
ldp x17, x18, [sp, #16*7]
|
|
|
|
|
|
|
|
ldp x29, x30, [sp], #16*NSAVEXREGPAIRS
|
2012-11-09 17:53:51 +00:00
|
|
|
cfi_adjust_cfa_offset (-16*NSAVEXREGPAIRS)
|
2017-10-24 16:49:14 +00:00
|
|
|
cfi_restore (x29)
|
|
|
|
cfi_restore (x30)
|
2020-04-29 10:49:20 +00:00
|
|
|
# if HAVE_AARCH64_PAC_RET
|
|
|
|
AUTIASP
|
|
|
|
cfi_window_save
|
|
|
|
# endif
|
2012-11-09 17:53:51 +00:00
|
|
|
b 1b
|
|
|
|
cfi_endproc
|
|
|
|
.size _dl_tlsdesc_dynamic, .-_dl_tlsdesc_dynamic
|
2024-04-04 20:02:32 +00:00
|
|
|
.hidden HIDDEN_JUMPTARGET(__tls_get_addr)
|
2012-11-09 17:53:51 +00:00
|
|
|
# undef NSAVEXREGPAIRS
|
|
|
|
#endif
|