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__)