Re: [PATCH v4 6/8] newlib: libc: setjmp/longjmp M-profile PACBTI-enablement

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

On 26/10/2022 12:51, 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/setjmp.S | 33 ++++++++++++++++++++++++++++++--
>   1 file changed, 31 insertions(+), 2 deletions(-)
> 
> diff --git a/newlib/libc/machine/arm/setjmp.S b/newlib/libc/machine/arm/setjmp.S
> index 21d6ff9e7..4fe53cdf2 100644
> --- a/newlib/libc/machine/arm/setjmp.S
> +++ b/newlib/libc/machine/arm/setjmp.S
> @@ -157,11 +157,15 @@ SYM (.arm_start_of.\name):
>   	.globl SYM (\name)
>   	TYPE (\name)
>   SYM (\name):
> +	.fnstart
> +	.cfi_startproc
>   	PROLOGUE \name
>   .endm
>   
>   .macro FUNC_END name
>   	RET
> +	.cfi_endproc
> +	.fnend
>   	SIZE (\name)
>   .endm
>   	
> @@ -173,11 +177,26 @@ SYM (\name):
>   
>   	/* Save all the callee-preserved registers into the jump buffer.  */
>   #ifdef __thumb2__
> +#if __ARM_FEATURE_PAC_DEFAULT
> +#if __ARM_FEATURE_BTI_DEFAULT
> +	pacbti		ip, lr, sp
> +#else
> +	pac		ip, lr, sp
> +#endif /* __ARM_FEATURE_BTI_DEFAULT */
> +	.cfi_register 	143, 12
> +	mov		a4, ip
> +	mov		ip, sp
> +	stmea		a1!, { a4, v1-v7, fp, ip, lr }

So this stores an extra value in the jump buf (and also changes the 
offsets of the stored values).  Have you checked that there's enough 
space for that?

This might be considered an ABI break, though that's perhaps not too 
important in a bare-metal environment.

R.

> +#else
> +#if __ARM_FEATURE_BTI_DEFAULT
> +	bti
> +#endif /* __ARM_FEATURE_BTI_DEFAULT */
>   	mov		ip, sp
>   	stmea		a1!, { v1-v7, fp, ip, lr }
> +#endif /* __ARM_FEATURE_PAC_DEFAULT */
>   #else
>   	stmea		a1!, { v1-v7, fp, ip, sp, lr }
> -#endif
> +#endif /* __thumb2__ */
>   	
>   #if 0	/* Simulator does not cope with FP instructions yet.  */
>   #ifndef __SOFTFP__
> @@ -200,11 +219,17 @@ SYM (\name):
>   	
>   	/* Restore the registers, retrieving the state when setjmp() was called.  */
>   #ifdef __thumb2__
> +#if __ARM_FEATURE_PAC_DEFAULT
> +	ldmfd		a1!, { a4, v1-v7, fp, ip, lr }
> +	mov		sp, ip
> +	mov         	ip, a4
> +#else
>   	ldmfd		a1!, { v1-v7, fp, ip, lr }
>   	mov		sp, ip
> +#endif /* __ARM_FEATURE_PAC_DEFAULT */
>   #else
>   	ldmfd		a1!, { v1-v7, fp, ip, sp, lr }
> -#endif
> +#endif /* __thumb2__ */
>   	
>   #if 0	/* Simulator does not cope with FP instructions yet.  */
>   #ifndef __SOFTFP__
> @@ -220,5 +245,9 @@ SYM (\name):
>   #endif
>   	moveq		a1, #1
>   
> +#if __ARM_FEATURE_PAC_DEFAULT
> +	aut		ip, lr, sp
> +#endif
> +
>   	FUNC_END longjmp
>   #endif
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.