summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYury Khrustalev <yury.khrustalev@arm.com>2025-04-28 15:12:04 +0100
committerYury Khrustalev <yury.khrustalev@arm.com>2025-11-10 11:28:19 +0000
commit1f57ffdf35334ab245544cbb88f3abf2e6c77c54 (patch)
tree2c440211499ee8c640cf537272af5b26b024bc4e
parent580746904b978f661c568d0a52350f249d0c398a (diff)
aarch64: Disable ZA state of SME in setjmp and sigsetjmp
Due to the nature of the ZA state, setjmp() should clear it in the same manner as it is already done by longjmp. Reviewed-by: Wilco Dijkstra <Wilco.Dijkstra@arm.com> (cherry picked from commit a7f6fd976c17b82dc198290b4ab7087f35855a0e)
-rw-r--r--sysdeps/aarch64/setjmp.S23
1 files changed, 23 insertions, 0 deletions
diff --git a/sysdeps/aarch64/setjmp.S b/sysdeps/aarch64/setjmp.S
index b630ca099a..f8845fcb8f 100644
--- a/sysdeps/aarch64/setjmp.S
+++ b/sysdeps/aarch64/setjmp.S
@@ -37,6 +37,29 @@ ENTRY (__sigsetjmp)
PTR_ARG (0)
1:
+
+#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
+#endif
+
stp x19, x20, [x0, #JB_X19<<3]
stp x21, x22, [x0, #JB_X21<<3]
stp x23, x24, [x0, #JB_X23<<3]