[PATCH v2] i386: Update ___tls_get_addr to preserve vector registers

H.J. Lu hjl.tools@gmail.com
Mon Jun 9 21:25:17 GMT 2025


On Mon, Jun 9, 2025 at 1:47 PM H.J. Lu <hjl.tools@gmail.com> wrote:
>
> 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:
>
> _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.
>
> This fixes BZ #32996.
>

Here is the v2 patch to add have-test-mtls-traditional to compile
tst-tls23-mod.c
with traditional TLS variant to verify the fix.

-- 
H.J.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: v2-0001-i386-Update-___tls_get_addr-to-preserve-vector-re.patch
Type: application/x-patch
Size: 34980 bytes
Desc: not available
URL: <https://sourceware.org/pipermail/libc-alpha/attachments/20250610/8a353f85/attachment-0001.bin>


More information about the Libc-alpha mailing list