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

Richard Earnshaw Richard.Earnshaw@foss.arm.com
Tue Nov 22 15:20:17 GMT 2022



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


More information about the Newlib mailing list