about summary refs log tree commit diff
path: root/ports/sysdeps/arm/setjmp.S
diff options
context:
space:
mode:
authorWill Newton <will.newton@linaro.org>2013-08-07 13:55:30 +0100
committerWill Newton <will.newton@linaro.org>2013-10-03 11:35:50 +0100
commitb7f2d27dbd85f6a0966dc389ad4f8205085b7ae8 (patch)
tree5d08889f9d642580e01d529303ed56409982a221 /ports/sysdeps/arm/setjmp.S
parent29c793b3c2947badd9d05e45736e406fb12021e8 (diff)
downloadglibc-b7f2d27dbd85f6a0966dc389ad4f8205085b7ae8.tar.gz
glibc-b7f2d27dbd85f6a0966dc389ad4f8205085b7ae8.tar.xz
glibc-b7f2d27dbd85f6a0966dc389ad4f8205085b7ae8.zip
ARM: Add pointer encryption support.
Add support for pointer encryption in glibc internal structures in C
and assembler code. Pointer encryption is a glibc security feature
described here:

https://sourceware.org/glibc/wiki/PointerEncryption

The ARM implementation uses global variables instead of thread pointer
relative accesses to get the value of the pointer encryption guard
because accessing the thread pointer can be very expensive on older
ARM cores.

ports/ChangeLog.arm:

2013-10-03  Will Newton  <will.newton@linaro.org>

	* sysdeps/arm/__longjmp.S (__longjmp): Demangle fp, sp
	and lr when restoring register values.
	* sysdeps/arm/include/bits/setjmp.h (JMP_BUF_REGLIST): Remove
	sp and lr from list and replace fp with a4.
	* sysdeps/arm/jmpbuf-unwind.h (_jmpbuf_sp): New function.
	(_JMPBUF_UNWINDS_ADJ): Call _jmpbuf_sp.
	* sysdeps/arm/setjmp.S (__sigsetjmp): Mangle fp, sp and lr
	before storing register values.
	* sysdeps/arm/sysdep.h (LDST_GLOBAL): New macro.
	* sysdeps/unix/sysv/linux/arm/sysdep.h (PTR_MANGLE): New macro.
	(PTR_DEMANGLE): Likewise. (PTR_MANGLE2): Likewise.
	(PTR_DEMANGLE2): Likewise.
Diffstat (limited to 'ports/sysdeps/arm/setjmp.S')
-rw-r--r--ports/sysdeps/arm/setjmp.S14
1 files changed, 14 insertions, 0 deletions
diff --git a/ports/sysdeps/arm/setjmp.S b/ports/sysdeps/arm/setjmp.S
index a6c161db54..b38b919af0 100644
--- a/ports/sysdeps/arm/setjmp.S
+++ b/ports/sysdeps/arm/setjmp.S
@@ -24,11 +24,25 @@
 #include <arm-features.h>
 
 ENTRY (__sigsetjmp)
+#ifdef PTR_MANGLE
+	PTR_MANGLE (a4, fp, a3, ip)
+#else
+	mov	a4, fp
+#endif
 	mov	ip, r0
 
 	/* Save registers */
 	sfi_breg ip, \
 	stmia	\B!, JMP_BUF_REGLIST
+#ifdef PTR_MANGLE
+	PTR_MANGLE2 (a4, sp, a3)
+	str	a4, [ip], #4
+	PTR_MANGLE2 (a4, lr, a3)
+	str	a4, [ip], #4
+#else
+	str	sp, [ip], #4
+	str	lr, [ip], #4
+#endif
 
 #if !defined ARM_ASSUME_NO_IWMMXT || defined __SOFTFP__
 # define NEED_HWCAP 1