mirror of git://sourceware.org/git/glibc.git
Compiler generates the following instruction sequence for dynamic TLS
access:
leal tls_var@tlsgd(,%ebx,1), %eax
call ___tls_get_addr@PLT
CALL instruction is transparent to compiler which assumes all registers,
except for EFLAGS, AX, CX, and DX, are unchanged after CALL. But
___tls_get_addr is a normal function which doesn't preserve any vector
registers.
1. Rename the generic __tls_get_addr function to ___tls_get_addr_internal.
2. Change ___tls_get_addr to a wrapper function with implementations for
FNSAVE, FXSAVE, XSAVE and XSAVEC to save and restore all vector registers.
3. dl-tlsdesc-dynamic.h has:
_dl_tlsdesc_dynamic:
/* Like all TLS resolvers, preserve call-clobbered registers.
We need two scratch regs anyway. */
subl $32, %esp
cfi_adjust_cfa_offset (32)
It is wrong to use
movl %ebx, -28(%esp)
movl %esp, %ebx
cfi_def_cfa_register(%ebx)
...
mov %ebx, %esp
cfi_def_cfa_register(%esp)
movl -28(%esp), %ebx
to preserve EBX on stack. Fix it with:
movl %ebx, 28(%esp)
movl %esp, %ebx
cfi_def_cfa_register(%ebx)
...
mov %ebx, %esp
cfi_def_cfa_register(%esp)
movl 28(%esp), %ebx
4. Update _dl_tlsdesc_dynamic to call ___tls_get_addr_internal directly.
5. Add have-test-mtls-traditional to compile tst-tls23-mod.c with
traditional TLS variant to verify the fix.
6. Define DL_RUNTIME_RESOLVE_REALIGN_STACK in sysdeps/x86/sysdep.h.
This fixes BZ #32996.
Co-Authored-By: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
(cherry picked from commit
|
||
|---|---|---|
| .. | ||
| bits | ||
| fpu | ||
| lp64 | ||
| nofpu | ||
| nptl | ||
| sys | ||
| Implies | ||
| Makefile | ||
| __longjmp.S | ||
| abort-instr.h | ||
| bsd-_setjmp.c | ||
| bsd-setjmp.c | ||
| configure | ||
| configure.ac | ||
| cpu-tunables.c | ||
| dl-audit-check.h | ||
| dl-get-cpu-features.c | ||
| dl-irel.h | ||
| dl-link.sym | ||
| dl-machine.h | ||
| dl-tls.h | ||
| dl-tlsdesc-dynamic.h | ||
| dl-tlsdesc.S | ||
| dl-tlsdesc.h | ||
| dl-trampoline.S | ||
| dl-trampoline.h | ||
| dl-tunables.list | ||
| e_sqrtl.c | ||
| fpu_control.h | ||
| hp-timing.h | ||
| jmpbuf-offsets.h | ||
| jmpbuf-unwind.h | ||
| ldsodefs.h | ||
| libc-tls.c | ||
| linkmap.h | ||
| machine-gmon.h | ||
| math-use-builtins-ffs.h | ||
| math_private.h | ||
| preconfigure | ||
| preconfigure.ac | ||
| setjmp.S | ||
| sfp-machine.h | ||
| sotruss-lib.c | ||
| start.S | ||
| thread_pointer.h | ||
| tininess.h | ||
| tlsdesc.c | ||
| tlsdesc.sym | ||
| tst-audit.h | ||
| tst-gnu2-tls2.h | ||
| tst-hwcap-tunables.c | ||