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:
parent
db30cbee41
commit
60a50c2846
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue