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 | ||
| nofpu | ||
| nptl | ||
| power4 | ||
| power6 | ||
| powerpc32 | ||
| powerpc64 | ||
| sys/platform | ||
| Makefile | ||
| Versions | ||
| abort-instr.h | ||
| atomic-machine.h | ||
| dl-diagnostics-cpu.c | ||
| dl-lookupcfg.h | ||
| dl-procinfo.c | ||
| dl-tls.c | ||
| dl-tls.h | ||
| dl-tunables.list | ||
| elf-initfini.h | ||
| fpu_control.h | ||
| gccframe.h | ||
| hwcapinfo.c | ||
| hwcapinfo.h | ||
| ifunc-sel.h | ||
| jmpbuf-offsets.h | ||
| jmpbuf-unwind.h | ||
| ldsodefs.h | ||
| libc-tls.c | ||
| locale-defines.sym | ||
| longjmp.c | ||
| machine-gmon.h | ||
| math-tests-snan-cast.h | ||
| math-use-builtins-ffs.h | ||
| mod-cache-ppc.c | ||
| mod-tlsopt-powerpc.c | ||
| mp_clz_tab.c | ||
| novmx-longjmp.c | ||
| novmx-sigjmp.c | ||
| novmxsetjmp.h | ||
| preconfigure | ||
| preconfigure.ac | ||
| rtld-global-offsets.sym | ||
| sigjmp.c | ||
| sotruss-lib.c | ||
| string-fza.h | ||
| sysdep.h | ||
| test-arith.c | ||
| test-arithf.c | ||
| test-get_hwcap-static.c | ||
| test-get_hwcap.c | ||
| test-gettimebase.c | ||
| thread_pointer.h | ||
| tst-cache-ppc-static-dlopen.c | ||
| tst-cache-ppc-static.c | ||
| tst-cache-ppc.c | ||
| tst-set_ppr.c | ||
| tst-stack-align.h | ||
| tst-tlsifunc-static.c | ||
| tst-tlsifunc.c | ||
| tst-tlsopt-powerpc.c | ||
| utmp-size.h | ||