From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20452 invoked by alias); 15 Mar 2013 21:10:45 -0000 Received: (qmail 20439 invoked by uid 22791); 15 Mar 2013 21:10:44 -0000 X-SWARE-Spam-Status: No, hits=-2.3 required=5.0 tests=AWL,BAYES_00 X-Spam-Check-By: sourceware.org Received: from toast.topped-with-meat.com (HELO topped-with-meat.com) (204.197.218.159) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 15 Mar 2013 21:10:31 +0000 Received: by topped-with-meat.com (Postfix, from userid 5281) id 58D7F2C0B4; Fri, 15 Mar 2013 14:10:30 -0700 (PDT) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit From: Roland McGrath To: "Joseph S. Myers" CC: libc-ports@sourceware.org Subject: [PATCH roland/arm-sfi-tlsdesc] ARM: Make dl-tlsdesc.S use sfi_breg, respect ARM_ALWAYS_BX and ARM_NO_INDEX_REGISTER. Message-Id: <20130315211030.58D7F2C0B4@topped-with-meat.com> Date: Fri, 15 Mar 2013 21:10:00 -0000 X-CMAE-Score: 0 X-CMAE-Analysis: v=2.1 cv=LYSvtFvi c=1 sm=1 tr=0 a=WkljmVdYkabdwxfqvArNOQ==:117 a=14OXPxybAAAA:8 a=5CUw4P69PUwA:10 a=Z6MIti7PxpgA:10 a=kj9zAlcOel0A:10 a=hOe2yjtxAAAA:8 a=BFSqgXEHPfMA:10 a=mDV3o1hIAAAA:8 a=mNdIWyprdU9ReaabLfQA:9 a=CjuIK1q_8ugA:10 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/msg00144.txt.bz2 Verified on armv7l-linux-gnueabihf that no object code changes. There is lots more nontrivial work involved in making dynamic linking work for arm-nacl and I'm not tackling that yet. But it was easy enough to hack up dl-tlsdesc.S in isolation, so I did it early. Thanks, Roland ports/ChangeLog.arm 2013-03-15 Roland McGrath * sysdeps/arm/dl-tlsdesc.S: Include . Use sfi_breg macro throughout. (_dl_tlsdesc_dynamic) [!ARM_NO_INDEX_REGISTER]: Avoid two-register addressing mode. (_dl_tlsdesc_dynamic) [ARM_ALWAYS_BX]: Don't pop into pc. * sysdeps/arm/arm-features.h: Add comment for ARM_NO_INDEX_REGISTER. --- a/ports/sysdeps/arm/arm-features.h +++ b/ports/sysdeps/arm/arm-features.h @@ -53,4 +53,7 @@ # define ARM_BX_ALIGN_LOG2 2 #endif +/* An OS-specific arm-features.h file may define ARM_NO_INDEX_REGISTER to + indicate that the two-register addressing modes must never be used. */ + #endif /* arm-features.h */ --- a/ports/sysdeps/arm/dl-tlsdesc.S +++ b/ports/sysdeps/arm/dl-tlsdesc.S @@ -17,6 +17,7 @@ . */ #include +#include #include #include "tlsdesc.h" @@ -31,7 +32,8 @@ .fnstart .align 2 _dl_tlsdesc_return: - ldr r0, [r0] + sfi_breg r0, \ + ldr r0, [\B] BX (lr) .fnend cfi_endproc @@ -90,16 +92,27 @@ _dl_tlsdesc_dynamic: cfi_rel_offset (r3,4) cfi_rel_offset (r4,8) cfi_rel_offset (lr,12) - ldr r1, [r0] /* td */ + sfi_breg r0, \ + ldr r1, [\B] /* td */ GET_TLS (lr) mov r4, r0 /* r4 = tp */ - ldr r0, [r0] - ldr r2, [r1, #8] /* gen_count */ - ldr r3, [r0] + sfi_breg r0, \ + ldr r0, [\B] + sfi_breg r1, \ + ldr r2, [\B, #8] /* gen_count */ + sfi_breg r0, \ + ldr r3, [\B] cmp r2, r3 bhi 1f - ldr r3, [r1] + sfi_breg r1, \ + ldr r3, [\B] +#ifndef ARM_NO_INDEX_REGISTER ldr r2, [r0, r3, lsl #3] +#else + add lr, r0, r3, lsl #3 + sfi_breg lr, \ + ldr r2, [\B] +#endif cmn r2, #1 ittt ne ldrne r3, [r1, #4] @@ -110,7 +123,8 @@ _dl_tlsdesc_dynamic: bl __tls_get_addr rsb r0, r4, r0 2: -#if defined (__ARM_ARCH_4T__) && defined (__THUMB_INTERWORK__) +#if ((defined (__ARM_ARCH_4T__) && defined (__THUMB_INTERWORK__)) \ + || defined (ARM_ALWAYS_BX)) pop {r2,r3,r4, lr} cfi_adjust_cfa_offset (-16) cfi_restore (lr) @@ -163,7 +177,8 @@ _dl_tlsdesc_lazy_resolver: pop {r2} cfi_adjust_cfa_offset (-4) cfi_restore (r2) - ldr r1, [r0, #4] + sfi_breg r0, \ + ldr r1, [\B, #4] BX (r1) .fnend cfi_endproc @@ -202,7 +217,8 @@ _dl_tlsdesc_resolve_hold: pop {r2} cfi_adjust_cfa_offset (-4) cfi_restore (r2) - ldr r1, [r0, #4] + sfi_breg r0, \ + ldr r1, [\B, #4] BX (r1) .fnend cfi_endproc