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_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
|
||||||
|
|
Loading…
Reference in New Issue