From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.org/gmane.linux.lib.musl.general/13135 Path: news.gmane.org!.POSTED!not-for-mail From: Rich Felker Newsgroups: gmane.linux.lib.musl.general Subject: Re: [PATCH v2] fix tls access on arm targets before armv6k Date: Fri, 24 Aug 2018 16:17:36 -0400 Message-ID: <20180824201736.GN1878@brightrain.aerifal.cx> References: <20180823141029.GB4418@port70.net> <20180824192749.GC4418@port70.net> Reply-To: musl@lists.openwall.com NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: blaine.gmane.org 1535141757 19836 195.159.176.226 (24 Aug 2018 20:15:57 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Fri, 24 Aug 2018 20:15:57 +0000 (UTC) User-Agent: Mutt/1.5.21 (2010-09-15) To: musl@lists.openwall.com Original-X-From: musl-return-13151-gllmg-musl=m.gmane.org@lists.openwall.com Fri Aug 24 22:15:53 2018 Return-path: Envelope-to: gllmg-musl@m.gmane.org Original-Received: from mother.openwall.net ([195.42.179.200]) by blaine.gmane.org with smtp (Exim 4.84_2) (envelope-from ) id 1ftIUq-000504-7r for gllmg-musl@m.gmane.org; Fri, 24 Aug 2018 22:15:52 +0200 Original-Received: (qmail 29902 invoked by uid 550); 24 Aug 2018 20:17:56 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-ID: Original-Received: (qmail 29884 invoked from network); 24 Aug 2018 20:17:55 -0000 Content-Disposition: inline In-Reply-To: <20180824192749.GC4418@port70.net> Original-Sender: Rich Felker Xref: news.gmane.org gmane.linux.lib.musl.general:13135 Archived-At: On Fri, Aug 24, 2018 at 09:27:50PM +0200, Szabolcs Nagy wrote: > rewrote it in asm to fix a runtime-abi issue. I've already queued the previous fix. I could replace it since it's not pushed, but I'd kinda prefer to make this change independent from the bugfix since it's already been done in 2 steps anyway; normally I don't like to mix bugfixes with refactoring except when it would be hard to do the bugfix independently first. > >From 90da0eb3d0e92203d822ef9d5f96ef0e4e276ca2 Mon Sep 17 00:00:00 2001 > From: Szabolcs Nagy > Date: Thu, 23 Aug 2018 10:57:34 +0000 > Subject: [PATCH] fix tls access on arm targets before armv6k > > commit 610c5a8524c3d6cd3ac5a5f1231422e7648a3791 changed the thread > pointer setup so tp points at the end of the pthread struct on arm, > but failed to update __aeabi_read_tp so it was off by 8. > > this broke tls access in code that is compiled with -mtp=soft, which > is the default when target arch is pre armv6k or thumb1. > > __aeabi_read_tp used to call c code, but that was incorrect as the > arm runtime abi specifies special pcs for this function: it is only > allowed to clobber r0, ip, lr and cpsr. Maybe keep just this paragraph if factoring as 2 commits? > if musl is compiled for a target with hardware tp then the code can > be further optimized so __aeabi_read_tp is an alias to __a_gettp_cp15, > but that requires preprocessed asm with conditionals, for now this > is a minimal bug fix. I think this optimization isn't so important since, if the user is compiling for a higher ISA level, they won't even be generating calls to __aeabi_read_tp. It would marginally help the case where you compile an optimized-for-native-cpu libc.so but use low-baseline application binaries, but I doubt that's a case many users care about. > --- > src/thread/arm/__aeabi_read_tp.s | 10 ++++++---- > src/thread/arm/__aeabi_read_tp_c.c | 8 -------- > 2 files changed, 6 insertions(+), 12 deletions(-) > delete mode 100644 src/thread/arm/__aeabi_read_tp_c.c > > diff --git a/src/thread/arm/__aeabi_read_tp.s b/src/thread/arm/__aeabi_read_tp.s > index 9d0cd311..2585620c 100644 > --- a/src/thread/arm/__aeabi_read_tp.s > +++ b/src/thread/arm/__aeabi_read_tp.s > @@ -2,7 +2,9 @@ > .global __aeabi_read_tp > .type __aeabi_read_tp,%function > __aeabi_read_tp: > - push {r1,r2,r3,lr} > - bl __aeabi_read_tp_c > - pop {r1,r2,r3,lr} > - bx lr > + ldr r0,1f > + add r0,r0,pc > + ldr r0,[r0] > +2: bx r0 > + .align 2 > +1: .word __a_gettp_ptr - 2b Isn't there an idiomatic "adr" pseudo-mnemonic preferable to use instead of the explicit pc arithmetic here? Or is that necessarily less efficient? > diff --git a/src/thread/arm/__aeabi_read_tp_c.c b/src/thread/arm/__aeabi_read_tp_c.c > deleted file mode 100644 > index 654bdc57..00000000 > --- a/src/thread/arm/__aeabi_read_tp_c.c > +++ /dev/null > @@ -1,8 +0,0 @@ > -#include "pthread_impl.h" > -#include > - > -__attribute__((__visibility__("hidden"))) > -void *__aeabi_read_tp_c(void) > -{ > - return (void *)((uintptr_t)__pthread_self()-8+sizeof(struct pthread)); > -} > -- > 2.18.0 >