[PATCH 3/5] aarch64: define macro for calling __libc_arm_za_disable

Carlos O'Donell codonell@redhat.com
Mon Nov 3 15:22:59 GMT 2025


On 10/27/25 11:32 AM, Yury Khrustalev via Libc-stable wrote:
> A common sequence of instructions is used in several places
> in assembly files, so define it in one place as an assembly
> macro.
> 
> Note that PAC instructions are not included in the new macro
> because they are redundant given how we call the arm_za_disable
> function (return address is not saved on stack, so no need to
> sign it).
> 
> (based on commits 6de12fc9ad56bc19fa6fcbd8ee502f29b5170d47
>   and c0f0db2d59e0908057205b22b21dd9d626d780c1)

In commit 6de12fc9ad56bc19fa6fcbd8ee502f29b5170d47 we remove code
to call the new macro.

In commit c0f0db2d59e0908057205b22b21dd9d626d780c1 we remove code
for disabling ZA.

LGTM.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>

> ---
>   sysdeps/aarch64/__longjmp.S                  | 19 +-----------------
>   sysdeps/aarch64/setjmp.S                     | 19 +-----------------
>   sysdeps/unix/sysv/linux/aarch64/setcontext.S | 21 ++------------------
>   sysdeps/unix/sysv/linux/aarch64/sysdep.h     | 12 +++++++++++
>   4 files changed, 16 insertions(+), 55 deletions(-)
> 
> diff --git a/sysdeps/aarch64/__longjmp.S b/sysdeps/aarch64/__longjmp.S
> index 38efddbbae..40f98329d0 100644
> --- a/sysdeps/aarch64/__longjmp.S
> +++ b/sysdeps/aarch64/__longjmp.S
> @@ -51,24 +51,7 @@ ENTRY (__longjmp)
>   
>   #if IS_IN(libc)
>   	/* Disable ZA state of SME in libc.a and libc.so, but not in ld.so.  */
> -# if HAVE_AARCH64_PAC_RET
> -	PACIASP
> -	cfi_window_save
> -# endif
> -	stp	x29, x30, [sp, -16]!
> -	cfi_adjust_cfa_offset (16)
> -	cfi_rel_offset (x29, 0)
> -	cfi_rel_offset (x30, 8)
> -	mov	x29, sp
> -	bl	__libc_arm_za_disable
> -	ldp	x29, x30, [sp], 16
> -	cfi_adjust_cfa_offset (-16)
> -	cfi_restore (x29)
> -	cfi_restore (x30)
> -# if HAVE_AARCH64_PAC_RET
> -	AUTIASP
> -	cfi_window_save
> -# endif
> +	CALL_LIBC_ARM_ZA_DISABLE

OK. Call macro.

>   #endif
>   
>   	ldp	x19, x20, [x0, #JB_X19<<3]
> diff --git a/sysdeps/aarch64/setjmp.S b/sysdeps/aarch64/setjmp.S
> index f8845fcb8f..e175ec4d36 100644
> --- a/sysdeps/aarch64/setjmp.S
> +++ b/sysdeps/aarch64/setjmp.S
> @@ -40,24 +40,7 @@ ENTRY (__sigsetjmp)
>   
>   #if IS_IN(libc)
>   	/* Disable ZA state of SME in libc.a and libc.so, but not in ld.so.  */
> -# if HAVE_AARCH64_PAC_RET
> -	PACIASP
> -	cfi_window_save
> -# endif
> -	stp	x29, x30, [sp, -16]!
> -	cfi_adjust_cfa_offset (16)
> -	cfi_rel_offset (x29, 0)
> -	cfi_rel_offset (x30, 8)
> -	mov	x29, sp
> -	bl	__libc_arm_za_disable
> -	ldp	x29, x30, [sp], 16
> -	cfi_adjust_cfa_offset (-16)
> -	cfi_restore (x29)
> -	cfi_restore (x30)
> -# if HAVE_AARCH64_PAC_RET
> -	AUTIASP
> -	cfi_window_save
> -# endif
> +	CALL_LIBC_ARM_ZA_DISABLE

OK. Call macro.

>   #endif
>   
>   	stp	x19, x20, [x0, #JB_X19<<3]
> diff --git a/sysdeps/unix/sysv/linux/aarch64/setcontext.S b/sysdeps/unix/sysv/linux/aarch64/setcontext.S
> index 695fc5b9b5..dedf3798a4 100644
> --- a/sysdeps/unix/sysv/linux/aarch64/setcontext.S
> +++ b/sysdeps/unix/sysv/linux/aarch64/setcontext.S
> @@ -49,25 +49,8 @@ ENTRY (__setcontext)
>   	cbz	x0, 1f
>   	b	C_SYMBOL_NAME (__syscall_error)
>   1:
> -	/* Disable ZA of SME.  */
> -#if HAVE_AARCH64_PAC_RET
> -	PACIASP
> -	cfi_window_save
> -#endif
> -	stp	x29, x30, [sp, -16]!
> -	cfi_adjust_cfa_offset (16)
> -	cfi_rel_offset (x29, 0)
> -	cfi_rel_offset (x30, 8)
> -	mov	x29, sp
> -	bl	__libc_arm_za_disable
> -	ldp	x29, x30, [sp], 16
> -	cfi_adjust_cfa_offset (-16)
> -	cfi_restore (x29)
> -	cfi_restore (x30)
> -#if HAVE_AARCH64_PAC_RET
> -	AUTIASP
> -	cfi_window_save
> -#endif
> +	/* Clear ZA state of SME.  */
> +	CALL_LIBC_ARM_ZA_DISABLE

OK. Call macro.

>   	/* Restore the general purpose registers.  */
>   	mov	x0, x9
>   	cfi_def_cfa (x0, 0)
> diff --git a/sysdeps/unix/sysv/linux/aarch64/sysdep.h b/sysdeps/unix/sysv/linux/aarch64/sysdep.h
> index b813805931..39b602900f 100644
> --- a/sysdeps/unix/sysv/linux/aarch64/sysdep.h
> +++ b/sysdeps/unix/sysv/linux/aarch64/sysdep.h
> @@ -150,6 +150,18 @@
>       mov x8, SYS_ify (syscall_name);		\
>       svc 0
>   
> +/* Clear ZA state of SME (ASM version).  */
> +/* The __libc_arm_za_disable function has special calling convention
> +   that allows to call it without stack manipulation and preserving
> +   most of the registers.  */
> +	.macro CALL_LIBC_ARM_ZA_DISABLE
> +	mov		x13, x30
> +	.cfi_register	x30, x13
> +	bl		__libc_arm_za_disable
> +	mov		x30, x13
> +	.cfi_register	x13, x30
> +	.endm

OK. Matches the end state of the macro.

> +
>   #else /* not __ASSEMBLER__ */
>   
>   # ifdef __LP64__


-- 
Cheers,
Carlos



More information about the Libc-stable mailing list