public inbox for newlib@sourceware.org
 help / color / mirror / Atom feed
From: Richard Earnshaw <Richard.Earnshaw@foss.arm.com>
To: "Victor L. Do Nascimento" <victor.donascimento@arm.com>,
	newlib@sourceware.org
Cc: Richard.Earnshaw@arm.com
Subject: Re: [PATCH v4 4/8] newlib: libc: memchr M-profile PACBTI-enablement
Date: Tue, 22 Nov 2022 15:33:04 +0000	[thread overview]
Message-ID: <a50a003e-6fe4-0224-6115-bba1bb04cc10@foss.arm.com> (raw)
In-Reply-To: <yw8jtu3qkdoz.fsf@arm.com>



On 26/10/2022 12:49, Victor L. Do Nascimento wrote:
> 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/memchr.S | 42 +++++++++++++++++++++++++++-----
>   1 file changed, 36 insertions(+), 6 deletions(-)
> 
> diff --git a/newlib/libc/machine/arm/memchr.S b/newlib/libc/machine/arm/memchr.S
> index 1a4c6512c..5b051123d 100644
> --- a/newlib/libc/machine/arm/memchr.S
> +++ b/newlib/libc/machine/arm/memchr.S
> @@ -76,6 +76,7 @@
>   	.syntax unified
>   
>   #include "acle-compat.h"
> +#include "arm_asm.h"
>   
>   @ NOTE: This ifdef MUST match the one in memchr-stub.c
>   #if defined (__ARM_NEON__) || defined (__ARM_NEON)
> @@ -267,10 +268,14 @@ memchr:
>   #elif __ARM_ARCH_ISA_THUMB >= 2 && defined (__ARM_FEATURE_DSP)
>   
>   #if __ARM_ARCH_PROFILE == 'M'
> -       .arch armv7e-m
> +#if __ARM_ARCH >= 8
> +	/* keep config inherited from -march=.  */
>   #else
> -       .arch armv6t2
> -#endif
> +	.arch armv7e-m
> +#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
>   #ifdef __ARMEB__
> @@ -287,11 +292,14 @@ memchr:
>   	.p2align 4,,15
>   	.global memchr
>   	.type memchr,%function
> +	.fnstart
> +	.cfi_startproc
>   memchr:
>   	@ r0 = start of memory to scan
>   	@ r1 = character to look for
>   	@ r2 = length
>   	@ returns r0 = pointer to character or NULL if not found
> +	prologue
>   	and	r1,r1,#0xff	@ Don't trust the caller to pass a char
>   
>   	cmp	r2,#16		@ If short don't bother with anything clever
> @@ -313,6 +321,11 @@ memchr:
>   10:
>   	@ We are aligned, we know we have at least 8 bytes to work with
>   	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 #16
>   	bic	r4, r2, #7	@ Number of double words to work with * 8
> @@ -334,6 +347,11 @@ memchr:
>   	bne	15b		@ (Flags from the subs above)
>   
>   	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	r2,r2,#7	@ Leave the count remaining as the number
>   				@ after the double words have been done
> @@ -349,17 +367,21 @@ memchr:
>   	bne	21b		@ on r2 flags
>   
>   40:
> +	.cfi_remember_state
>   	movs	r0,#0		@ not found
> -	bx	lr
> +	epilogue
>   
>   50:
> +	.cfi_restore_state
> +	.cfi_remember_state
>   	subs	r0,r0,#1	@ found
> -	bx	lr
> +	epilogue
>   
>   60:  @ We're here because the fast path found a hit
>        @ now we have to track down exactly which word it was
>   	@ 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
> +	.cfi_restore_state

This restores the wrong state.  label 60 is branched to from within the 
hot loop where r4-r7 have been saved on the stack, so at the very least 
you'll need to add some additional directives here to correctly describe 
those still being on the stack.  You can probably get away with

	.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
>   	itte	eq
>   	moveq	r5, r6		@ the end is in the 2nd word
> @@ -379,8 +401,16 @@ memchr:
>   
>   61:
>   	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
> -	bx	lr
> +	epilogue
> +	.cfi_endproc
> +	.cantunwind
> +	.fnend
>   #else
>     /* Defined in memchr-stub.c.  */
>   #endif

R.

  reply	other threads:[~2022-11-22 15:33 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-10-26 11:37 [PATCH v4 0/8] Implement assembly cortex-M PACBTI functionality Victor L. Do Nascimento
2022-10-26 11:45 ` [PATCH v4 1/8] newlib: libc: define M-profile PACBTI-enablement macros Victor L. Do Nascimento
2022-11-22 15:04   ` Richard Earnshaw
2022-10-26 11:46 ` [PATCH v4 2/8] newlib: libc: strcmp M-profile PACBTI-enablement Victor L. Do Nascimento
2022-11-22 15:04   ` Richard Earnshaw
2022-10-26 11:47 ` [PATCH v4 3/8] newlib: libc: strlen " Victor L. Do Nascimento
2022-11-22 15:20   ` Richard Earnshaw
2022-10-26 11:49 ` [PATCH v4 4/8] newlib: libc: memchr " Victor L. Do Nascimento
2022-11-22 15:33   ` Richard Earnshaw [this message]
2022-10-26 11:50 ` [PATCH v4 5/8] newlib: libc: memcpy " Victor L. Do Nascimento
2022-11-22 16:03   ` Richard Earnshaw
2022-10-26 11:51 ` [PATCH v4 6/8] newlib: libc: setjmp/longjmp " Victor L. Do Nascimento
2022-11-22 16:17   ` Richard Earnshaw
2022-10-26 11:52 ` [PATCH v4 7/8] newlib: libc: aeabi_memmove " Victor L. Do Nascimento
2022-11-22 16:18   ` Richard Earnshaw
2022-10-26 11:53 ` [PATCH v4 8/8] newlib: libc: aeabi_memset " Victor L. Do Nascimento
2022-11-22 16:19   ` Richard Earnshaw

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=a50a003e-6fe4-0224-6115-bba1bb04cc10@foss.arm.com \
    --to=richard.earnshaw@foss.arm.com \
    --cc=Richard.Earnshaw@arm.com \
    --cc=newlib@sourceware.org \
    --cc=victor.donascimento@arm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).