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.
This commit is contained in:
Victor L. Do Nascimento 2022-12-21 11:25:36 +00:00 committed by Richard Earnshaw
parent db30cbee41
commit 60a50c2846
1 changed files with 24 additions and 9 deletions

View File

@ -46,6 +46,8 @@
__OPT_BIG_BLOCK_SIZE: Size of big block in words. Default to 64. __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. __OPT_MID_BLOCK_SIZE: Size of big block in words. Default to 16.
*/ */
#include "arm_asm.h"
#ifndef __OPT_BIG_BLOCK_SIZE #ifndef __OPT_BIG_BLOCK_SIZE
#define __OPT_BIG_BLOCK_SIZE (4 * 16) #define __OPT_BIG_BLOCK_SIZE (4 * 16)
#endif #endif
@ -85,6 +87,8 @@
.global memcpy .global memcpy
.thumb .thumb
.thumb_func .thumb_func
.fnstart
.cfi_startproc
.type memcpy, %function .type memcpy, %function
memcpy: memcpy:
@ r0: dst @ r0: dst
@ -93,10 +97,11 @@ memcpy:
#ifdef __ARM_FEATURE_UNALIGNED #ifdef __ARM_FEATURE_UNALIGNED
/* In case of UNALIGNED access supported, ip is not used in /* In case of UNALIGNED access supported, ip is not used in
function body. */ function body. */
prologue push_ip=HAVE_PAC_LEAF
mov ip, r0 mov ip, r0
#else #else
push {r0} prologue 0 push_ip=HAVE_PAC_LEAF
#endif #endif /* __ARM_FEATURE_UNALIGNED */
orr r3, r1, r0 orr r3, r1, r0
ands r3, r3, #3 ands r3, r3, #3
bne .Lmisaligned_copy bne .Lmisaligned_copy
@ -178,15 +183,17 @@ memcpy:
#endif /* __ARM_FEATURE_UNALIGNED */ #endif /* __ARM_FEATURE_UNALIGNED */
.Ldone: .Ldone:
.cfi_remember_state
#ifdef __ARM_FEATURE_UNALIGNED #ifdef __ARM_FEATURE_UNALIGNED
mov r0, ip mov r0, ip
epilogue push_ip=HAVE_PAC_LEAF
#else #else
pop {r0} epilogue 0 push_ip=HAVE_PAC_LEAF
#endif #endif /* __ARM_FEATURE_UNALIGNED */
bx lr
.align 2 .align 2
.Lmisaligned_copy: .Lmisaligned_copy:
.cfi_restore_state
#ifdef __ARM_FEATURE_UNALIGNED #ifdef __ARM_FEATURE_UNALIGNED
/* Define label DST_ALIGNED to BIG_BLOCK. It will go to aligned copy /* Define label DST_ALIGNED to BIG_BLOCK. It will go to aligned copy
once destination is adjusted to aligned. */ once destination is adjusted to aligned. */
@ -247,6 +254,9 @@ memcpy:
/* dst is aligned, but src isn't. Misaligned copy. */ /* dst is aligned, but src isn't. Misaligned copy. */
push {r4, r5} push {r4, r5}
.cfi_adjust_cfa_offset 8
.cfi_rel_offset 4, 0
.cfi_rel_offset 5, 4
subs r2, #4 subs r2, #4
/* Backward r1 by misaligned bytes, to make r1 aligned. /* Backward r1 by misaligned bytes, to make r1 aligned.
@ -299,6 +309,9 @@ memcpy:
adds r2, #4 adds r2, #4
subs r1, ip subs r1, ip
pop {r4, r5} pop {r4, r5}
.cfi_restore 4
.cfi_restore 5
.cfi_adjust_cfa_offset -8
#endif /* __ARM_FEATURE_UNALIGNED */ #endif /* __ARM_FEATURE_UNALIGNED */
@ -321,9 +334,11 @@ memcpy:
#ifdef __ARM_FEATURE_UNALIGNED #ifdef __ARM_FEATURE_UNALIGNED
mov r0, ip mov r0, ip
epilogue push_ip=HAVE_PAC_LEAF
#else #else
pop {r0} epilogue 0 push_ip=HAVE_PAC_LEAF
#endif #endif /* __ARM_FEATURE_UNALIGNED */
bx lr .cfi_endproc
.cantunwind
.fnend
.size memcpy, .-memcpy .size memcpy, .-memcpy