[PATCH v15 6/8] nptl: Move the rseq area to the 'extra TLS' block

Florian Weimer fweimer@redhat.com
Wed Jan 8 17:06:05 GMT 2025


* Michael Jeanson:

> On 2025-01-08 04:40, Florian Weimer wrote:
>> * Michael Jeanson:
>> 
>>> +#if TLS_TCB_AT_TP
>>> +  /* The rseq area block should come before the thread pointer and be at least
>>> +     32 bytes. */
>>> +  TEST_VERIFY (__rseq_offset <= -RSEQ_AREA_SIZE_INITIAL);
>>> +#elif TLS_DTV_AT_TP
>>> +  /* The rseq area block should come after the thread pointer. */
>>> +  TEST_VERIFY (__rseq_offset + TLS_TP_OFFSET >= 0);
>> 
>> I think the TLS_TP_OFFSET is redudant here.  It's supposed have already
>> been folded into __rseq_offset.  It certainly was before because a
>> pointer difference was used to compute it.
>
> I should have updated the comment here, I'm testing that the rseq area
> comes after the TCB on TLS_DTV_AT_TP architectures, my first iteration
> looked like this:
>
>   TEST_VERIFY (__rseq_offset >= -TLS_TP_OFFSET);
>
> but I felt it was not very readable.
>
> Would this be better?
>
>  +  /* The rseq area block should come after the TCB, add the TLS block
>  +     offset to the rseq offset to get a value relative to the TCB and
>  +     test that it's positive.  */
>  +  TEST_VERIFY (__rseq_offset + TLS_TP_OFFSET >= 0);

The comment helps, but it should say non-negative to match the actual
comparison?

In addition you could define a variable

static __thread char thread_var __attribute__ ((tls_model ("initial-exec")));

and check that the effective rseq address is greater than &thread_var.

Thanks,
Florian



More information about the Libc-alpha mailing list