[PATCH v2] x32: Use THREAD_SELF for RSEQ_* accessors
H.J. Lu
hjl.tools@gmail.com
Sat Aug 23 21:15:30 GMT 2025
On Sat, Aug 23, 2025 at 1:34 AM Uros Bizjak <ubizjak@gmail.com> wrote:
>
> On Fri, Aug 22, 2025 at 10:19 PM H.J. Lu <hjl.tools@gmail.com> wrote:
> >
> > Use THREAD_SELF to get the %fs register to work around the GCC bug:
> >
> > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121613
> >
> > with the negative offset from the %fs register. Comparing against the
> > asm statements, for RSEQ_GETMEM_ONCE in sched_getcpu:
> >
> > asm statements C with THREAD_SELF
> > endbr64 endbr64
> > subl $40, %esp subl $40, %esp
> > > movl __rseq_offset(%rip),
> > movl %fs:24, %eax movl %fs:24, %eax
> > movl %eax, 28(%rsp) movl %eax, 28(%rsp)
> > movslq __rseq_offset(%rip), | movl %fs:8, %eax
> > movl %fs:4(%rax),%eax | leal 4(%rax,%rdx), %eax
> > > movl (%eax), %eax
>
> So, instead of one memory access:
>
> movl %fs:4(%rax),%eax
>
> we now have two:
>
> movl %fs:8, %eax
> movl (%eax), %eax
>
> for *every* access to the RSEQ area. This nullifies all optimization
> efforts to use direct %fs references to TCB, and is IMO too high a
> price to pay for a more readable source. For this workaround, assembly
> is hands down a better choice, and the eventual GCC fix will also be
> similar: sign-extend the non-const value to a temporary DImode
> register
>
> IMO the approach that creates direct %fs reference with assembly
> outweighs the slightly more complex source. Also, please note that the
> current assembler implementation lacks "memory" clobber, for which I
> am preparing a patch.
I dropped my patch. I will wait for your updated patch.
> An alternative approach would be to figure why is __rseq_offset
> negative. One would expect that since %fs points to the beginning of
> the TCB block, then all offsets from %fs should be positive. Perhaps
> the RSEQ area could be placed elsewhere in the TCB block to guarantee
> positive offset?
I think it is done on purpose to keep the TCB size unchanged.
--
H.J.
More information about the Libc-alpha
mailing list