From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 18543 invoked by alias); 10 Dec 2013 17:28:17 -0000 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 Received: (qmail 18531 invoked by uid 89); 10 Dec 2013 17:28:16 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=1.1 required=5.0 tests=AWL,BAYES_05,KAM_STOCKGEN,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=no version=3.3.2 X-HELO: mail-ea0-f170.google.com Received: from Unknown (HELO mail-ea0-f170.google.com) (209.85.215.170) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Tue, 10 Dec 2013 17:28:15 +0000 Received: by mail-ea0-f170.google.com with SMTP id k10so2382077eaj.15 for ; Tue, 10 Dec 2013 09:28:06 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:date:from:user-agent:mime-version:to :cc:subject:content-type:content-transfer-encoding; bh=YUkvtLKmvwe4PIFkgRvSXI9wDVeDA+FB/dB1c+eTQ2k=; b=d2t7s45hSDN1/6kVd1K0aNfxSjTM8ON/szdjWWKqiZ/ENmZNGdJDL6HHcTT1B3NysG B4iSUlza8zql2RE/Htlx3ceuka470j9mF12A3c0mJoIl4Nyt5sZVJw75TCzRgsC6OT+f wUR9NCi6dJnPzZXN2IQGCBUBW7Gqy9LxH1t1rRdi44TG4NEiuK2Zbq9AgHy1aa9RdEci s9+R0uLCDt3lpmt4/LDChygVpnF3SgFzsnxOT32Cp4ZhNJpqxX2rIA5KrAQEyysF+fYg U5Y+mrBS+RkDKZeYEKfHLCmj7Ya0+sFEFkJGN00JxwhHXh6hj//05raPRb9kBlbiromX EgFw== X-Gm-Message-State: ALoCoQnmKrXC6ILQtWM608OKUY4ItGQbcIl4phBXVfgAJ3DuyTSBRtftmpe+q0MtAt1f9aSNji9k X-Received: by 10.15.74.200 with SMTP id j48mr9609004eey.102.1386696486564; Tue, 10 Dec 2013 09:28:06 -0800 (PST) Received: from localhost.localdomain (cpc6-seac21-2-0-cust453.7-2.cable.virginm.net. [82.1.113.198]) by mx.google.com with ESMTPSA id o47sm43701092eem.21.2013.12.10.09.28.04 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Tue, 10 Dec 2013 09:28:05 -0800 (PST) Message-ID: <52A74F24.8000805@linaro.org> Date: Tue, 10 Dec 2013 17:28:00 -0000 From: Will Newton User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.0 MIME-Version: 1.0 To: libc-ports@sourceware.org CC: Patch Tracking Subject: [PATCH] ARM: Don't apply pointer encryption to the frame pointer Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-IsSubscribed: yes X-SW-Source: 2013-12/txt/msg00006.txt.bz2 The frame pointer register is rarely used for that purpose on ARM and applications that look at the contents of the jmp_buf may be relying on reading the value. Ruby uses the contents of jmp_buf to find the root set for garbage collection so relies on this pointer value being unencrypted. ports/ChangeLog.arm: 2013-12-10 Will Newton * sysdeps/arm/__longjmp.S: Don't apply pointer encryption to fp register. * sysdeps/arm/setjmp.S: Likewise. * sysdeps/arm/include/bits/setjmp.h (JMP_BUF_REGLIST): Add fp to register list, remove a4. * sysdeps/unix/sysv/linux/arm/sysdep.h: (PTR_MANGLE_LOAD): New macro. --- ports/sysdeps/arm/__longjmp.S | 4 +--- ports/sysdeps/arm/include/bits/setjmp.h | 5 ++--- ports/sysdeps/arm/setjmp.S | 4 +--- ports/sysdeps/unix/sysv/linux/arm/sysdep.h | 8 ++++++-- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/ports/sysdeps/arm/__longjmp.S b/ports/sysdeps/arm/__longjmp.S index 894c121..aaa2d3d 100644 --- a/ports/sysdeps/arm/__longjmp.S +++ b/ports/sysdeps/arm/__longjmp.S @@ -41,14 +41,12 @@ ENTRY (__longjmp) sfi_sp sfi_breg ip, \ ldmia \B!, JMP_BUF_REGLIST #ifdef PTR_DEMANGLE - PTR_DEMANGLE (fp, a4, a3, a2) ldr a4, [ip], #4 - PTR_DEMANGLE2 (a4, a4, a3) + PTR_DEMANGLE (a4, a4, a3, a2) mov sp, a4 ldr a4, [ip], #4 PTR_DEMANGLE2 (lr, a4, a3) #else - mov fp, a4 ldr sp, [ip], #4 ldr lr, [ip], #4 #endif diff --git a/ports/sysdeps/arm/include/bits/setjmp.h b/ports/sysdeps/arm/include/bits/setjmp.h index 64505dc..7bb4f00 100644 --- a/ports/sysdeps/arm/include/bits/setjmp.h +++ b/ports/sysdeps/arm/include/bits/setjmp.h @@ -26,9 +26,8 @@ #ifndef _ISOMAC /* Register list for a ldm/stm instruction to load/store - the general registers from a __jmp_buf. The a4 register - contains fp at this point. */ -# define JMP_BUF_REGLIST {a4, v1-v6, sl} + the general registers from a __jmp_buf. */ +# define JMP_BUF_REGLIST {v1-v6, sl, fp} /* Index of __jmp_buf where the sp register resides. */ # define __JMP_BUF_SP 8 diff --git a/ports/sysdeps/arm/setjmp.S b/ports/sysdeps/arm/setjmp.S index fedd994..803591e 100644 --- a/ports/sysdeps/arm/setjmp.S +++ b/ports/sysdeps/arm/setjmp.S @@ -23,9 +23,7 @@ ENTRY (__sigsetjmp) #ifdef PTR_MANGLE - PTR_MANGLE (a4, fp, a3, ip) -#else - mov a4, fp + PTR_MANGLE_LOAD (a3, ip) #endif mov ip, r0 diff --git a/ports/sysdeps/unix/sysv/linux/arm/sysdep.h b/ports/sysdeps/unix/sysv/linux/arm/sysdep.h index 6cfe4e0..ccab57e 100644 --- a/ports/sysdeps/unix/sysv/linux/arm/sysdep.h +++ b/ports/sysdeps/unix/sysv/linux/arm/sysdep.h @@ -439,8 +439,10 @@ __local_syscall_error: \ #if (defined NOT_IN_libc && defined IS_IN_rtld) || \ (!defined SHARED && (!defined NOT_IN_libc || defined IS_IN_libpthread)) # ifdef __ASSEMBLER__ +# define PTR_MANGLE_LOAD(guard, tmp) \ + LDST_PCREL(ldr, guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard_local)); # define PTR_MANGLE(dst, src, guard, tmp) \ - LDST_PCREL(ldr, guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard_local)); \ + PTR_MANGLE_LOAD(guard, tmp); \ PTR_MANGLE2(dst, src, guard) /* Use PTR_MANGLE2 for efficiency if guard is already loaded. */ # define PTR_MANGLE2(dst, src, guard) \ @@ -457,8 +459,10 @@ extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden; # endif #else # ifdef __ASSEMBLER__ +# define PTR_MANGLE_LOAD(guard, tmp) \ + LDST_GLOBAL(ldr, guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard)); # define PTR_MANGLE(dst, src, guard, tmp) \ - LDST_GLOBAL(ldr, guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard)); \ + PTR_MANGLE_LOAD(guard, tmp); \ PTR_MANGLE2(dst, src, guard) /* Use PTR_MANGLE2 for efficiency if guard is already loaded. */ # define PTR_MANGLE2(dst, src, guard) \ -- 1.8.1.4