Module Name: src
Committed By: skrll
Date: Mon May 6 06:57:32 UTC 2024
Modified Files:
src/lib/libc/arch/arm/gen: setjmp.S
Log Message:
arm longjmp: Restore stack first, then signal mask.
Otherwise, a pending signal may be delivered on the wrong stack when
we restore the signal mask.
While here:
- Move the botched sp and lr tests earlier.
PR lib/57946
To generate a diff of this commit:
cvs rdiff -u -r1.18 -r1.19 src/lib/libc/arch/arm/gen/setjmp.S
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/lib/libc/arch/arm/gen/setjmp.S
diff -u src/lib/libc/arch/arm/gen/setjmp.S:1.18 src/lib/libc/arch/arm/gen/setjmp.S:1.19
--- src/lib/libc/arch/arm/gen/setjmp.S:1.18 Tue Dec 13 12:43:32 2022
+++ src/lib/libc/arch/arm/gen/setjmp.S Mon May 6 06:57:32 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: setjmp.S,v 1.18 2022/12/13 12:43:32 skrll Exp $ */
+/* $NetBSD: setjmp.S,v 1.19 2024/05/06 06:57:32 skrll Exp $ */
/*
* Copyright (c) 1997 Mark Brinicombe
@@ -142,6 +142,25 @@ ENTRY(__longjmp14)
cmp r3, ip
bne .Lbotch
+ /* Validate sp and lr */
+ ldr r2, [r0, #(_JB_REG_R13 * 4)]
+#if defined(__thumb__) && defined(_ARM_ARCH_T2)
+ cbz r2, .Lbotch
+#else
+ cmp r2, #0
+ beq .Lbotch
+#endif
+
+ ldr r3, [r0, #(_JB_REG_R14 * 4)]
+#if defined(__thumb__) && defined(_ARM_ARCH_T2)
+ cbz r3, .Lbotch
+#else
+ cmp r3, #0
+ beq .Lbotch
+#endif
+ mov sp, r2
+ mov lr, r3
+
/* Restore the signal mask. */
push {r0-r2, lr}
movs r2, #0
@@ -186,25 +205,6 @@ ENTRY(__longjmp14)
adds r0, r0, #4 /* skip ip(r12) */
#endif
- ldmia r0!, {r2-r3}
-
- /* Validate sp and lr */
-#if defined(__thumb__) && defined(_ARM_ARCH_T2)
- cbz r2, .Lbotch
-#else
- cmp r2, #0
- beq .Lbotch
-#endif
- mov sp, r2
-
-#if defined(__thumb__) && defined(_ARM_ARCH_T2)
- cbz r3, .Lbotch
-#else
- cmp r3, #0
- beq .Lbotch
-#endif
- mov lr, r3
-
/* Set return value */
movs r0, r1
#if !defined(__thumb__)