![]() |
|
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.