[PATCH v2 5/8] newlib: libc: memcpy M-profile PACBTI-enablement

Victor Do Nascimento <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <[email protected]>
Add function prologue/epilogue to conditionally add BTI landing pads
and/or PAC code generation & authentication instructions depending on
compilation flags.
---
 newlib/libc/machine/arm/memcpy-armv7m.S | 74 ++++++++++++++++++++++---
 1 file changed, 66 insertions(+), 8 deletions(-)

diff --git a/newlib/libc/machine/arm/memcpy-armv7m.S b/newlib/libc/machine/arm/memcpy-armv7m.S
index c8bff36f6..d9b9e4984 100644
--- a/newlib/libc/machine/arm/memcpy-armv7m.S
+++ b/newlib/libc/machine/arm/memcpy-armv7m.S
@@ -46,6 +46,8 @@
      __OPT_BIG_BLOCK_SIZE: Size of big block in words.  Default to 64.
      __OPT_MID_BLOCK_SIZE: Size of big block in words.  Default to 16.
  */
+#include "pacbti.h"
+
 #ifndef __OPT_BIG_BLOCK_SIZE
 #define __OPT_BIG_BLOCK_SIZE (4 * 16)
 #endif
@@ -85,6 +87,8 @@
 	.global	memcpy
 	.thumb
 	.thumb_func
+	.fnstart
+	.cfi_startproc
 	.type	memcpy, %function
 memcpy:
 	@ r0: dst
@@ -93,10 +97,31 @@ memcpy:
 #ifdef __ARM_FEATURE_UNALIGNED
 	/* In case of UNALIGNED access supported, ip is not used in
 	   function body.  */
+	pacbti_prologue
 	mov	ip, r0
 #else
+#if __HAVE_PAC_LEAF
+#if __ARM_FEATURE_BTI_DEFAULT
+	pacbti	ip, lr, sp
+#else
+	pac	ip, lr, sp
+#endif /* __ARM_FEATURE_BTI_DEFAULT */
+	.cfi_register 143, 12
+	push	{r0, ip}
+	.save	{r0, ra_auth_code}
+	.cfi_def_cfa_offset 8
+	.cfi_offset 0, -8
+	.cfi_offset 143, -4
+#else
+#if __ARM_FEATURE_BTI_DEFAULT
+	bti
+#endif /* __ARM_FEATURE_BTI_DEFAULT */
 	push	{r0}
-#endif
+	.save	{r0}
+	.cfi_adjust_cfa_offset 4
+	.cfi_offset 0, -4
+#endif /* __HAVE_PAC_LEAF */
+#endif /* __ARM_FEATURE_UNALIGNED */
 	orr	r3, r1, r0
 	ands	r3, r3, #3
 	bne	.Lmisaligned_copy
@@ -135,13 +160,13 @@ memcpy:
 	ldr	r3, [r1], #4
 	str	r3, [r0], #4
 	END_UNROLL
-#else /* __ARM_ARCH_7M__ */
+#else
 	ldr	r3, [r1, \offset]
 	str	r3, [r0, \offset]
 	END_UNROLL
 	adds    r0, __OPT_MID_BLOCK_SIZE
 	adds    r1, __OPT_MID_BLOCK_SIZE
-#endif
+#endif /* __ARM_ARCH_7M__ */
 	subs	r2, __OPT_MID_BLOCK_SIZE
 	bhs	.Lmid_block_loop
 
@@ -180,10 +205,21 @@ memcpy:
 .Ldone:
 #ifdef __ARM_FEATURE_UNALIGNED
 	mov	r0, ip
+	pacbti_epilogue
+#else
+#if __HAVE_PAC_LEAF
+	pop	{r0, ra_auth_code}
+	.cfi_restore 0
+	.cfi_restore 143
+	.cfi_def_cfa_offset 0
+	aut ip, lr, sp
 #else
 	pop	{r0}
-#endif
-	bx	lr
+	.cfi_restore 0
+	.cfi_def_cfa_offset 0
+#endif /* __HAVE_PAC_LEAF */
+	bx lr
+#endif /*  __ARM_FEATURE_UNALIGNED */
 
 	.align 2
 .Lmisaligned_copy:
@@ -247,6 +283,15 @@ memcpy:
 	/* dst is aligned, but src isn't.  Misaligned copy.  */
 
 	push	{r4, r5}
+	.save   {r4, r5}
+	.cfi_adjust_cfa_offset 8
+#if __HAVE_PAC_LEAF /* we pushed just the pac code.  */
+	.cfi_offset 4, -12
+	.cfi_offset 5, -8
+#else /* we haven't pushed anything to stack.  */
+	.cfi_offset 4, -8
+	.cfi_offset 5, -4
+#endif /* __HAVE_PAC_LEAF */
 	subs	r2, #4
 
 	/* Backward r1 by misaligned bytes, to make r1 aligned.
@@ -299,6 +344,7 @@ memcpy:
 	adds	r2, #4
 	subs	r1, ip
 	pop	{r4, r5}
+	.cfi_adjust_cfa_offset -8
 
 #endif /* __ARM_FEATURE_UNALIGNED */
 
@@ -321,9 +367,21 @@ memcpy:
 
 #ifdef __ARM_FEATURE_UNALIGNED
 	mov	r0, ip
+	pacbti_epilogue
+#else
+#if __HAVE_PAC_LEAF
+	pop	{r0, ra_auth_code}
+	.cfi_restore 0
+	.cfi_restore 143
+	.cfi_def_cfa_offset 0
+	aut ip, lr, sp
 #else
 	pop	{r0}
-#endif
-	bx	lr
-
+	.cfi_restore 0
+	.cfi_def_cfa_offset 0
+#endif /* __HAVE_PAC_LEAF */
+	bx lr
+#endif /* __ARM_FEATURE_UNALIGNED */
+	.cfi_endproc
+	.fnend
 	.size	memcpy, .-memcpy
-- 
2.36.1
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.