newlib: libc: memchr 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
5582536896
commit
db30cbee41
|
@ -76,6 +76,7 @@
|
||||||
.syntax unified
|
.syntax unified
|
||||||
|
|
||||||
#include "acle-compat.h"
|
#include "acle-compat.h"
|
||||||
|
#include "arm_asm.h"
|
||||||
|
|
||||||
@ NOTE: This ifdef MUST match the one in memchr-stub.c
|
@ NOTE: This ifdef MUST match the one in memchr-stub.c
|
||||||
#if defined (__ARM_NEON__) || defined (__ARM_NEON)
|
#if defined (__ARM_NEON__) || defined (__ARM_NEON)
|
||||||
|
@ -267,10 +268,14 @@ memchr:
|
||||||
#elif __ARM_ARCH_ISA_THUMB >= 2 && defined (__ARM_FEATURE_DSP)
|
#elif __ARM_ARCH_ISA_THUMB >= 2 && defined (__ARM_FEATURE_DSP)
|
||||||
|
|
||||||
#if __ARM_ARCH_PROFILE == 'M'
|
#if __ARM_ARCH_PROFILE == 'M'
|
||||||
.arch armv7e-m
|
#if __ARM_ARCH >= 8
|
||||||
|
/* keep config inherited from -march=. */
|
||||||
#else
|
#else
|
||||||
.arch armv6t2
|
.arch armv7e-m
|
||||||
#endif
|
#endif /* __ARM_ARCH >= 8 */
|
||||||
|
#else
|
||||||
|
.arch armv6t2
|
||||||
|
#endif /* __ARM_ARCH_PROFILE == 'M' */
|
||||||
|
|
||||||
@ this lets us check a flag in a 00/ff byte easily in either endianness
|
@ this lets us check a flag in a 00/ff byte easily in either endianness
|
||||||
#ifdef __ARMEB__
|
#ifdef __ARMEB__
|
||||||
|
@ -287,11 +292,14 @@ memchr:
|
||||||
.p2align 4,,15
|
.p2align 4,,15
|
||||||
.global memchr
|
.global memchr
|
||||||
.type memchr,%function
|
.type memchr,%function
|
||||||
|
.fnstart
|
||||||
|
.cfi_startproc
|
||||||
memchr:
|
memchr:
|
||||||
@ r0 = start of memory to scan
|
@ r0 = start of memory to scan
|
||||||
@ r1 = character to look for
|
@ r1 = character to look for
|
||||||
@ r2 = length
|
@ r2 = length
|
||||||
@ returns r0 = pointer to character or NULL if not found
|
@ returns r0 = pointer to character or NULL if not found
|
||||||
|
prologue
|
||||||
and r1,r1,#0xff @ Don't trust the caller to pass a char
|
and r1,r1,#0xff @ Don't trust the caller to pass a char
|
||||||
|
|
||||||
cmp r2,#16 @ If short don't bother with anything clever
|
cmp r2,#16 @ If short don't bother with anything clever
|
||||||
|
@ -313,6 +321,11 @@ memchr:
|
||||||
10:
|
10:
|
||||||
@ We are aligned, we know we have at least 8 bytes to work with
|
@ We are aligned, we know we have at least 8 bytes to work with
|
||||||
push {r4,r5,r6,r7}
|
push {r4,r5,r6,r7}
|
||||||
|
.cfi_adjust_cfa_offset 16
|
||||||
|
.cfi_rel_offset 4, 0
|
||||||
|
.cfi_rel_offset 5, 4
|
||||||
|
.cfi_rel_offset 6, 8
|
||||||
|
.cfi_rel_offset 7, 12
|
||||||
orr r1, r1, r1, lsl #8 @ expand the match word across all bytes
|
orr r1, r1, r1, lsl #8 @ expand the match word across all bytes
|
||||||
orr r1, r1, r1, lsl #16
|
orr r1, r1, r1, lsl #16
|
||||||
bic r4, r2, #7 @ Number of double words to work with * 8
|
bic r4, r2, #7 @ Number of double words to work with * 8
|
||||||
|
@ -334,6 +347,11 @@ memchr:
|
||||||
bne 15b @ (Flags from the subs above)
|
bne 15b @ (Flags from the subs above)
|
||||||
|
|
||||||
pop {r4,r5,r6,r7}
|
pop {r4,r5,r6,r7}
|
||||||
|
.cfi_restore 7
|
||||||
|
.cfi_restore 6
|
||||||
|
.cfi_restore 5
|
||||||
|
.cfi_restore 4
|
||||||
|
.cfi_adjust_cfa_offset -16
|
||||||
and r1,r1,#0xff @ r1 back to a single character
|
and r1,r1,#0xff @ r1 back to a single character
|
||||||
and r2,r2,#7 @ Leave the count remaining as the number
|
and r2,r2,#7 @ Leave the count remaining as the number
|
||||||
@ after the double words have been done
|
@ after the double words have been done
|
||||||
|
@ -349,17 +367,29 @@ memchr:
|
||||||
bne 21b @ on r2 flags
|
bne 21b @ on r2 flags
|
||||||
|
|
||||||
40:
|
40:
|
||||||
|
.cfi_remember_state
|
||||||
movs r0,#0 @ not found
|
movs r0,#0 @ not found
|
||||||
bx lr
|
epilogue
|
||||||
|
|
||||||
50:
|
50:
|
||||||
|
.cfi_restore_state
|
||||||
|
.cfi_remember_state
|
||||||
subs r0,r0,#1 @ found
|
subs r0,r0,#1 @ found
|
||||||
bx lr
|
epilogue
|
||||||
|
|
||||||
60: @ We're here because the fast path found a hit
|
60: @ We're here because the fast path found a hit
|
||||||
@ now we have to track down exactly which word it was
|
@ now we have to track down exactly which word it was
|
||||||
@ r0 points to the start of the double word after the one tested
|
@ r0 points to the start of the double word after the one tested
|
||||||
@ r5 has the 00/ff pattern for the first word, r6 has the chained value
|
@ r5 has the 00/ff pattern for the first word, r6 has the chained value
|
||||||
|
@ This point is reached from cbnz midway through label 15 prior to
|
||||||
|
@ popping r4-r7 off the stack. .cfi_restore_state alone disregards
|
||||||
|
@ this, so we manually correct this.
|
||||||
|
.cfi_restore_state @ Standard post-prologue state
|
||||||
|
.cfi_adjust_cfa_offset 16
|
||||||
|
.cfi_rel_offset 4, 0
|
||||||
|
.cfi_rel_offset 5, 4
|
||||||
|
.cfi_rel_offset 6, 8
|
||||||
|
.cfi_rel_offset 7, 12
|
||||||
cmp r5, #0
|
cmp r5, #0
|
||||||
itte eq
|
itte eq
|
||||||
moveq r5, r6 @ the end is in the 2nd word
|
moveq r5, r6 @ the end is in the 2nd word
|
||||||
|
@ -379,8 +409,16 @@ memchr:
|
||||||
|
|
||||||
61:
|
61:
|
||||||
pop {r4,r5,r6,r7}
|
pop {r4,r5,r6,r7}
|
||||||
|
.cfi_restore 7
|
||||||
|
.cfi_restore 6
|
||||||
|
.cfi_restore 5
|
||||||
|
.cfi_restore 4
|
||||||
|
.cfi_adjust_cfa_offset -16
|
||||||
subs r0,r0,#1
|
subs r0,r0,#1
|
||||||
bx lr
|
epilogue
|
||||||
|
.cfi_endproc
|
||||||
|
.cantunwind
|
||||||
|
.fnend
|
||||||
#else
|
#else
|
||||||
/* Defined in memchr-stub.c. */
|
/* Defined in memchr-stub.c. */
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue