[glibc/release/2.41/master] aarch64: define macro for calling __libc_arm_za_disable

Yury Khrustalev ykhrustalev@sourceware.org
Mon Nov 10 14:03:17 GMT 2025


https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=1a0ee267147d002d66af29bcf3f5002d19b3c75a

commit 1a0ee267147d002d66af29bcf3f5002d19b3c75a
Author: Yury Khrustalev <yury.khrustalev@arm.com>
Date:   Tue Oct 21 13:48:34 2025 +0100

    aarch64: define macro for calling __libc_arm_za_disable
    
    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)
    
    Reviewed-by: Carlos O'Donell <carlos@redhat.com>

Diff:
---
 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
 #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
 #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
 	/* 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
+
 #else /* not __ASSEMBLER__ */
 
 # ifdef __LP64__


More information about the Glibc-cvs mailing list