]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
aarch64: Add longjmp support for SME
authorSzabolcs Nagy <szabolcs.nagy@arm.com>
Wed, 1 Dec 2021 11:37:44 +0000 (11:37 +0000)
committerSzabolcs Nagy <szabolcs.nagy@arm.com>
Tue, 2 Jan 2024 15:43:30 +0000 (15:43 +0000)
For the ZA lazy saving scheme to work, longjmp has to call
__libc_arm_za_disable.

In ld.so we assume ZA is not used so longjmp does not need
special support there.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
sysdeps/aarch64/__longjmp.S

index 2c8ff54112dfaaf00aa844b26240c49e2482359a..7b6add751e6bd96bd08599d0ab3f65ffe572a768 100644 (file)
@@ -49,6 +49,28 @@ ENTRY (__longjmp)
 
        PTR_ARG (0)
 
+#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
+
        ldp     x19, x20, [x0, #JB_X19<<3]
        ldp     x21, x22, [x0, #JB_X21<<3]
        ldp     x23, x24, [x0, #JB_X23<<3]