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 | ||
| multiarch | ||
| nptl | ||
| sys | ||
| Implies | ||
| Makefile | ||
| Versions | ||
| __alloc_gcs.c | ||
| __arm_za_disable.S | ||
| __longjmp.S | ||
| __mtag_tag_region.S | ||
| __mtag_tag_zero_region.S | ||
| aarch64-gcs.h | ||
| abort-instr.h | ||
| atomic-machine.h | ||
| bsd-_setjmp.c | ||
| bsd-setjmp.c | ||
| configure | ||
| configure.ac | ||
| cpu-features.h | ||
| crti.S | ||
| crtn.S | ||
| dl-audit-check.h | ||
| dl-bti.c | ||
| dl-diagnostics-cpu.c | ||
| dl-dtprocnum.h | ||
| dl-gcs.c | ||
| dl-irel.h | ||
| dl-link.sym | ||
| dl-lookupcfg.h | ||
| dl-machine.h | ||
| dl-prop.h | ||
| dl-start.S | ||
| dl-tlsdesc.S | ||
| dl-tlsdesc.h | ||
| dl-trampoline.S | ||
| dl-tunables.list | ||
| e_sqrtl.c | ||
| elf-initfini.h | ||
| hp-timing.h | ||
| jmpbuf-offsets.h | ||
| jmpbuf-unwind.h | ||
| ldsodefs.h | ||
| libc-mtag.h | ||
| libc-start.c | ||
| libc-tls.c | ||
| linkmap.h | ||
| machine-gmon.h | ||
| math-tests-trap.h | ||
| math-use-builtins-ffs.h | ||
| mcount.c | ||
| memchr.S | ||
| memcmp.S | ||
| memcpy.S | ||
| memmove.c | ||
| memrchr.S | ||
| memset.S | ||
| preconfigure | ||
| rawmemchr.S | ||
| rtld-global-offsets.sym | ||
| setjmp.S | ||
| sfp-machine.h | ||
| sotruss-lib.c | ||
| start.S | ||
| stpcpy.S | ||
| strchr.S | ||
| strchrnul.S | ||
| strcmp.S | ||
| strcpy.S | ||
| strlen.S | ||
| strncmp.S | ||
| strnlen.S | ||
| strrchr.S | ||
| sysdep.h | ||
| tlsdesc.c | ||
| tlsdesc.sym | ||
| tst-audit.h | ||
| tst-audit26.c | ||
| tst-audit26mod.c | ||
| tst-audit26mod.h | ||
| tst-audit27.c | ||
| tst-audit27mod.c | ||
| tst-audit27mod.h | ||
| tst-auditmod26.c | ||
| tst-auditmod27.c | ||
| tst-ifunc-arg-1.c | ||
| tst-ifunc-arg-2.c | ||
| tst-ifunc-arg-3.c | ||
| tst-ifunc-arg-4.c | ||
| tst-sme-helper.h | ||
| tst-sme-jmp.c | ||
| tst-sme-za-state.c | ||
| tst-vpcs-mod.S | ||
| tst-vpcs.c | ||
| wordcopy.c | ||