From 60a50c2846f9ad259631598604a7410bee502c70 Mon Sep 17 00:00:00 2001 From: "Victor L. Do Nascimento" Date: Wed, 21 Dec 2022 11:25:36 +0000 Subject: [PATCH] newlib: libc: memcpy M-profile PACBTI-enablement 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 | 33 ++++++++++++++++++------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/newlib/libc/machine/arm/memcpy-armv7m.S b/newlib/libc/machine/arm/memcpy-armv7m.S index c8bff36f6..ec1ad6485 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 "arm_asm.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,11 @@ memcpy: #ifdef __ARM_FEATURE_UNALIGNED /* In case of UNALIGNED access supported, ip is not used in function body. */ + prologue push_ip=HAVE_PAC_LEAF mov ip, r0 #else - push {r0} -#endif + prologue 0 push_ip=HAVE_PAC_LEAF +#endif /* __ARM_FEATURE_UNALIGNED */ orr r3, r1, r0 ands r3, r3, #3 bne .Lmisaligned_copy @@ -178,15 +183,17 @@ memcpy: #endif /* __ARM_FEATURE_UNALIGNED */ .Ldone: + .cfi_remember_state #ifdef __ARM_FEATURE_UNALIGNED mov r0, ip + epilogue push_ip=HAVE_PAC_LEAF #else - pop {r0} -#endif - bx lr + epilogue 0 push_ip=HAVE_PAC_LEAF +#endif /* __ARM_FEATURE_UNALIGNED */ .align 2 .Lmisaligned_copy: + .cfi_restore_state #ifdef __ARM_FEATURE_UNALIGNED /* Define label DST_ALIGNED to BIG_BLOCK. It will go to aligned copy once destination is adjusted to aligned. */ @@ -247,6 +254,9 @@ memcpy: /* dst is aligned, but src isn't. Misaligned copy. */ push {r4, r5} + .cfi_adjust_cfa_offset 8 + .cfi_rel_offset 4, 0 + .cfi_rel_offset 5, 4 subs r2, #4 /* Backward r1 by misaligned bytes, to make r1 aligned. @@ -299,6 +309,9 @@ memcpy: adds r2, #4 subs r1, ip pop {r4, r5} + .cfi_restore 4 + .cfi_restore 5 + .cfi_adjust_cfa_offset -8 #endif /* __ARM_FEATURE_UNALIGNED */ @@ -321,9 +334,11 @@ memcpy: #ifdef __ARM_FEATURE_UNALIGNED mov r0, ip + epilogue push_ip=HAVE_PAC_LEAF #else - pop {r0} -#endif - bx lr - + epilogue 0 push_ip=HAVE_PAC_LEAF +#endif /* __ARM_FEATURE_UNALIGNED */ + .cfi_endproc + .cantunwind + .fnend .size memcpy, .-memcpy -- 2.43.5