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