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> |
||
|---|---|---|
| .. | ||
| 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 | ||
| fenv_private.h | ||
| 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 | ||
| 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 | ||