[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