Re: [PATCH v4 3/8] newlib: libc: strlen M-profile PACBTI-enablement

Richard Earnshaw <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <[email protected]>

On 26/10/2022 12:47, 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.
> 
> This patch enables PACBTI for all relevant variants of strlen:
>       * Newlib for armv8.1-m.main+pacbti
>       * Newlib for armv8.1-m.main+pacbti+mve
>       * Newlib-nano

This is OK.  It's slightly unfortunate that we can nolonger have the PLD 
instruction before the prologue, but it is what it is.

R.

> ---
>   newlib/libc/machine/arm/strlen-armv7.S     | 17 ++++++++++++++---
>   newlib/libc/machine/arm/strlen-thumb2-Os.S | 14 +++++++++++---
>   2 files changed, 25 insertions(+), 6 deletions(-)
> 
> diff --git a/newlib/libc/machine/arm/strlen-armv7.S b/newlib/libc/machine/arm/strlen-armv7.S
> index f3dda0d60..27094040c 100644
> --- a/newlib/libc/machine/arm/strlen-armv7.S
> +++ b/newlib/libc/machine/arm/strlen-armv7.S
> @@ -59,6 +59,7 @@
>      OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  */
>   
>   #include "acle-compat.h"
> +#include "arm_asm.h"
>   
>   	.macro def_fn f p2align=0
>   	.text
> @@ -78,7 +79,11 @@
>   
>   	/* This code requires Thumb.  */
>   #if __ARM_ARCH_PROFILE == 'M'
> +#if __ARM_ARCH >= 8
> +	/* keep config inherited from -march=.  */
> +#else
>   	.arch   armv7e-m
> +#endif /* if __ARM_ARCH >= 8 */
>   #else
>   	.arch	armv6t2
>   #endif
> @@ -100,8 +105,10 @@
>   #define tmp2		r5
>   
>   def_fn	strlen p2align=6
> +	.fnstart
> +	.cfi_startproc
> +	prologue 4 5 push_ip=HAVE_PAC_LEAF
>   	pld	[srcin, #0]
> -	strd	r4, r5, [sp, #-8]!
>   	bic	src, srcin, #7
>   	mvn	const_m1, #0
>   	ands	tmp1, srcin, #7		/* (8 - bytes) to alignment.  */
> @@ -151,6 +158,7 @@ def_fn	strlen p2align=6
>   	beq	.Lloop_aligned
>   
>   .Lnull_found:
> +	.cfi_remember_state
>   	cmp	data1a, #0
>   	itt	eq
>   	addeq	result, result, #4
> @@ -159,11 +167,11 @@ def_fn	strlen p2align=6
>   	rev	data1a, data1a
>   #endif
>   	clz	data1a, data1a
> -	ldrd	r4, r5, [sp], #8
>   	add	result, result, data1a, lsr #3	/* Bits -> Bytes.  */
> -	bx	lr
> +	epilogue 4 5 push_ip=HAVE_PAC_LEAF
>   
>   .Lmisaligned8:
> +	.cfi_restore_state
>   	ldrd	data1a, data1b, [src]
>   	and	tmp2, tmp1, #3
>   	rsb	result, tmp1, #0
> @@ -177,4 +185,7 @@ def_fn	strlen p2align=6
>   	movne	data1a, const_m1
>   	mov	const_0, #0
>   	b	.Lstart_realigned
> +	.cfi_endproc
> +	.cantunwind
> +	.fnend
>   	.size	strlen, . - strlen
> diff --git a/newlib/libc/machine/arm/strlen-thumb2-Os.S b/newlib/libc/machine/arm/strlen-thumb2-Os.S
> index 961f41a0a..a46db573c 100644
> --- a/newlib/libc/machine/arm/strlen-thumb2-Os.S
> +++ b/newlib/libc/machine/arm/strlen-thumb2-Os.S
> @@ -25,6 +25,7 @@
>      OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  */
>   
>   #include "acle-compat.h"
> +#include "arm_asm.h"
>   
>   	.macro def_fn f p2align=0
>   	.text
> @@ -33,8 +34,9 @@
>   	.type \f, %function
>   \f:
>   	.endm
> -
> -#if __ARM_ARCH_ISA_THUMB >= 2 && __ARM_ARCH >= 7
> +#if __ARM_ARCH_PROFILE == 'M' && __ARM_ARCH >= 8
> +	/* keep config inherited from -march=.  */
> +#elif __ARM_ARCH_ISA_THUMB >= 2 && __ARM_ARCH >= 7
>   	.arch   armv7
>   #else
>   	.arch	armv6t2
> @@ -44,11 +46,17 @@
>   	.syntax unified
>   
>   def_fn	strlen p2align=1
> +	.fnstart
> +	.cfi_startproc
> +	prologue
>   	mov     r3, r0
>   1:	ldrb.w  r2, [r3], #1
>   	cmp     r2, #0
>   	bne	1b
>   	subs    r0, r3, r0
>   	subs    r0, #1
> -	bx      lr
> +	epilogue
> +	.cfi_endproc
> +	.cantunwind
> +	.fnend
>   	.size	strlen, . - strlen
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.