From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26812 invoked by alias); 1 Mar 2013 17:36:18 -0000 Received: (qmail 26347 invoked by uid 22791); 1 Mar 2013 17:36:03 -0000 X-SWARE-Spam-Status: No, hits=-5.3 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,KHOP_RCVD_TRUST,KHOP_THREADED,RCVD_IN_DNSWL_LOW,RCVD_IN_HOSTKARMA_YE,TW_BL,TW_OV X-Spam-Check-By: sourceware.org Received: from mail-pa0-f51.google.com (HELO mail-pa0-f51.google.com) (209.85.220.51) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 01 Mar 2013 17:35:53 +0000 Received: by mail-pa0-f51.google.com with SMTP id hz1so1930299pad.24 for ; Fri, 01 Mar 2013 09:35:53 -0800 (PST) X-Received: by 10.66.144.165 with SMTP id sn5mr19689013pab.40.1362159352945; Fri, 01 Mar 2013 09:35:52 -0800 (PST) Received: from fremont.twiddle.net (50-194-63-110-static.hfc.comcastbusiness.net. [50.194.63.110]) by mx.google.com with ESMTPS id kl4sm12679430pbc.31.2013.03.01.09.35.51 (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Fri, 01 Mar 2013 09:35:52 -0800 (PST) From: Richard Henderson To: libc-ports@sourceware.org Cc: joseph@codesourcery.com Subject: [PATCH v2 10/14] arm: Implement hard-tp for GET_TLS Date: Fri, 01 Mar 2013 17:36:00 -0000 Message-Id: <1362159320-5934-11-git-send-email-rth@twiddle.net> In-Reply-To: <1362159320-5934-1-git-send-email-rth@twiddle.net> References: <1362159320-5934-1-git-send-email-rth@twiddle.net> X-IsSubscribed: yes Mailing-List: contact libc-ports-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: libc-ports-owner@sourceware.org X-SW-Source: 2013-03/txt/msg00013.txt.bz2 --- * sysdeps/arm/sysdep.h (ARCH_HAS_HARD_TP): New macro. (GET_TLS): Use hard-tp if ARCH_HAS_HARD_TP. * sysdeps/unix/sysv/linux/arm/aeabi_read_tp.S: Likewise. * sysdeps/unix/sysv/linux/arm/sysdep.h (GET_TLS): Don't override the default definition if ARCH_HAS_HARD_TP. --- ports/sysdeps/arm/sysdep.h | 14 +++++++++++--- ports/sysdeps/unix/sysv/linux/arm/aeabi_read_tp.S | 5 ++++- ports/sysdeps/unix/sysv/linux/arm/sysdep.h | 16 +++++++++------- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/ports/sysdeps/arm/sysdep.h b/ports/sysdeps/arm/sysdep.h index c09e680..03739a4 100644 --- a/ports/sysdeps/arm/sysdep.h +++ b/ports/sysdeps/arm/sysdep.h @@ -47,6 +47,9 @@ #if __ARM_ARCH > 4 # define ARCH_HAS_BLX #endif +#if __ARM_ARCH > 6 || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6ZK__) +# define ARCH_HAS_HARD_TP +#endif #if __ARM_ARCH > 6 || defined(__ARM_ARCH_6T2__) # define ARCH_HAS_T2 #endif @@ -184,10 +187,14 @@ /* Helper to get the TLS base pointer. The interface is that TMP is a register that may be used to hold the LR, if necessary. TMP may be LR itself to indicate that LR need not be saved. The base pointer - is returned in R0. Only R0 and TMP are modified. + is returned in R0. Only R0 and TMP are modified. */ - At this generic level we have no tricks to pull. Call the ABI routine. */ -# define GET_TLS(TMP) \ +# ifdef ARCH_HAS_HARD_TP +/* If the cpu has cp15 available, use it. */ +# define GET_TLS(TMP) mrc p15, 0, r0, c13, c0, 3 +# else +/* At this generic level we have no tricks to pull. Call the ABI routine. */ +# define GET_TLS(TMP) \ push { r1, r2, r3, lr }; \ cfi_remember_state; \ cfi_adjust_cfa_offset (16); \ @@ -198,6 +205,7 @@ bl __aeabi_read_tp; \ pop { r1, r2, r3, lr }; \ cfi_restore_state +# endif /* ARCH_HAS_HARD_TP */ #endif /* __ASSEMBLER__ */ diff --git a/ports/sysdeps/unix/sysv/linux/arm/aeabi_read_tp.S b/ports/sysdeps/unix/sysv/linux/arm/aeabi_read_tp.S index ecdc322..21e3229 100644 --- a/ports/sysdeps/unix/sysv/linux/arm/aeabi_read_tp.S +++ b/ports/sysdeps/unix/sysv/linux/arm/aeabi_read_tp.S @@ -41,7 +41,10 @@ .hidden __aeabi_read_tp ENTRY (__aeabi_read_tp) -#ifdef __thumb2__ +#ifdef ARCH_HAS_HARD_TP + mrc p15, 0, r0, c13, c0, 3 + bx lr +#elif defined(__thumb2__) movw r0, #0x0fe0 movt r0, #0xffff bx r0 diff --git a/ports/sysdeps/unix/sysv/linux/arm/sysdep.h b/ports/sysdeps/unix/sysv/linux/arm/sysdep.h index 39872b8..89fea7a 100644 --- a/ports/sysdeps/unix/sysv/linux/arm/sysdep.h +++ b/ports/sysdeps/unix/sysv/linux/arm/sysdep.h @@ -45,26 +45,27 @@ #ifdef __ASSEMBLER__ +#ifndef ARCH_HAS_HARD_TP /* Internal macro calling the linux kernel kuser_get_tls helper. Note that in thumb mode, a constant pool break is often out of range, so we always expand the constant inline. */ -#ifdef __thumb2__ -# define GET_TLS_BODY \ +# ifdef __thumb2__ +# define GET_TLS_BODY \ movw r0, #0x0fe0; \ movt r0, #0xffff; \ blx r0 -#else -# define GET_TLS_BODY \ +# else +# define GET_TLS_BODY \ mov r0, #0xffff0fff; /* Point to the high page. */ \ mov lr, pc; /* Save our return address. */ \ sub pc, r0, #31 /* Jump to the TLS entry. */ -#endif +# endif /* Helper to get the TLS base pointer. Save LR in TMP, return in R0, and no other registers clobbered. TMP may be LR itself to indicate that no save is necessary. */ -#undef GET_TLS -#define GET_TLS(TMP) \ +# undef GET_TLS +# define GET_TLS(TMP) \ .ifnc TMP, lr; \ mov TMP, lr; \ cfi_register (lr, TMP); \ @@ -74,6 +75,7 @@ .else; \ GET_TLS_BODY; \ .endif +#endif /* ARCH_HAS_HARD_TP */ /* Linux uses a negative return value to indicate syscall errors, unlike most Unices, which use the condition codes' carry flag. -- 1.8.1.2