Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <7341b4d8-dbf0-4ccb-9d90-e53cec5327d0@app.fastmail.com>
Date: Sun, 12 Oct 2025 04:56:02 +0200
From: Alex Rønne Petersen <alex@...xrp.com>
To: "Rich Felker" <dalias@...c.org>
Cc: musl@...ts.openwall.com
Subject: Re: [PATCH] s390x: manually inline __tls_get_addr in __tls_get_offset

On Sun, Oct 12, 2025, at 04:46, Rich Felker wrote:
> On Fri, Jan 24, 2025 at 06:12:13AM +0100, Alex Rønne Petersen wrote:
>> Calling __tls_get_addr with brasl is not valid since it's a global symbol; doing
>> so results in an R_390_PC32DBL relocation error from lld. We could fix this by
>> marking __tls_get_addr hidden since it is not part of the s390x ABI, or by using
>> a different instruction. However, given its simplicity, it makes more sense to
>> just manually inline it into __tls_get_offset for performance.
>> 
>> The patch has been tested by applying to Zig's bundled musl copy and running the
>> full Zig test suite under qemu-s390x.
>> ---
>>  src/thread/s390x/__tls_get_offset.s | 20 ++++++++++----------
>>  1 file changed, 10 insertions(+), 10 deletions(-)
>> 
>> diff --git a/src/thread/s390x/__tls_get_offset.s b/src/thread/s390x/__tls_get_offset.s
>> index 8ee92de8..405f118b 100644
>> --- a/src/thread/s390x/__tls_get_offset.s
>> +++ b/src/thread/s390x/__tls_get_offset.s
>> @@ -1,17 +1,17 @@
>>  	.global __tls_get_offset
>>  	.type __tls_get_offset,%function
>>  __tls_get_offset:
>> -	stmg  %r14, %r15, 112(%r15)
>> -	aghi  %r15, -160
>> +	ear   %r0, %a0
>> +	sllg  %r0, %r0, 32
>> +	ear   %r0, %a1
>>  
>> -	la    %r2, 0(%r2, %r12)
>> -	brasl %r14, __tls_get_addr
>> +	la    %r1, 0(%r2, %r12)
>>  
>> -	ear   %r1, %a0
>> -	sllg  %r1, %r1, 32
>> -	ear   %r1, %a1
>> +	lg    %r3, 0(%r1)
>> +	sllg  %r4, %r3, 3
>> +	lg    %r5, 8(%r0)
>> +	lg    %r2, 0(%r4, %r5)
>> +	ag    %r2, 8(%r1)
>> +	sgr   %r2, %r0
>>  
>> -	sgr   %r2, %r1
>> -
>> -	lmg   %r14, %r15, 272(%r15)
>>  	br    %r14
>> -- 
>> 2.43.0
>
> This must not have been covered by tests because it doesn't work. The
> problem is that there is apparently no such thing as 8(%r0); it looks
> like r0 is special in addressing and means constant zero. So it should
> be fixable just shuffling around which registers are used for what.
>
> I can try to prepare a fix if you don't have time for it.

Oh, yikes, yes; I actually got bit by this exact s390x quirk recently in an unrelated context while working on Zig: https://github.com/ziglang/zig/commit/7b92d5f4052be651e9bc5cd4ad78a69ccbee865d

And indeed, another thing I've since discovered is that our test suite has rather poor coverage of TLS usage. Something we'll definitely need work on.

Sorry for the trouble; I'll send a v2 of this patch shortly.

Regards,
Alex

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.