Switch arm and arm64 over to the x86 style of jmpbuf.
Specifically, use the argument to sigsetjmp as a flag in the buffer
to indicate whether or not the signal mask is valid.
Bug: 16918359
Change-Id: I5bb1f1220f14c105c6bc57e0c28c1dc366d1438f
diff --git a/libc/arch-arm/bionic/setjmp.S b/libc/arch-arm/bionic/setjmp.S
index 7a99fc0..8d7786c 100644
--- a/libc/arch-arm/bionic/setjmp.S
+++ b/libc/arch-arm/bionic/setjmp.S
@@ -64,15 +64,12 @@
// FP registers will be loaded/stored with instructions
// that expect 8-byte alignment.
-#define _JB_MAGIC 0
-#define _JB_SIGMASK (_JB_MAGIC+1)
+#define _JB_SIGFLAG 0
+#define _JB_SIGMASK (_JB_SIGFLAG+1)
#define _JB_FLOAT_BASE (_JB_SIGMASK+1)
#define _JB_FLOAT_STATE (_JB_FLOAT_BASE + (15-8+1)*2)
#define _JB_CORE_BASE (_JB_FLOAT_STATE+1)
-.L_setjmp_magic_signal_mask_n: .word 0x4278f500
-.L_setjmp_magic_signal_mask_y: .word 0x4278f501
-
ENTRY(setjmp)
mov r1, #1
b sigsetjmp
@@ -85,9 +82,11 @@
// int sigsetjmp(sigjmp_buf env, int save_signal_mask);
ENTRY(sigsetjmp)
+ // Record whether or not we're saving the signal mask.
+ str r1, [r0, #(_JB_SIGFLAG * 4)]
+
// Do we need to save the signal mask?
teq r1, #0
- ldreq r1, .L_setjmp_magic_signal_mask_n
beq 1f
// Get current signal mask.
@@ -101,15 +100,10 @@
ldmfd sp!, {r0, r14}
.cfi_def_cfa_offset 0
- // Save signal mask.
+ // Save the signal mask.
str r1, [r0, #(_JB_SIGMASK * 4)]
- ldr r1, .L_setjmp_magic_signal_mask_y
-
1:
- // Save magic number.
- str r1, [r0, #(_JB_MAGIC * 4)]
-
// Save core registers.
add r1, r0, #(_JB_CORE_BASE * 4)
stmia r1, {r4-r14}
@@ -128,16 +122,12 @@
// void siglongjmp(sigjmp_buf env, int value);
ENTRY(siglongjmp)
- // Check magic.
- ldr r3, [r0, #(_JB_MAGIC * 4)]
- ldr r2, .L_setjmp_magic_signal_mask_n
- teq r2, r3
+ // Do we need to restore the signal mask?
+ ldr r2, [r0, #(_JB_SIGFLAG * 4)]
+ teq r2, #0
beq 1f
- ldr r2, .L_setjmp_magic_signal_mask_y
- teq r2, r3
- bne longjmperror
- // Restore signal mask.
+ // Restore the signal mask.
stmfd sp!, {r0, r1, r14}
.cfi_def_cfa_offset 12
.cfi_rel_offset r0, 0
diff --git a/libc/arch-arm64/bionic/setjmp.S b/libc/arch-arm64/bionic/setjmp.S
index d8b98a3..d1747e4 100644
--- a/libc/arch-arm64/bionic/setjmp.S
+++ b/libc/arch-arm64/bionic/setjmp.S
@@ -45,11 +45,12 @@
//
// word name description
// -------------------------------------------------------------------------
-// 0-1 sigmask signal mask (not used with _setjmp / _longjmp)
-// 2 core_base base of core registers (x19-x30, sp)
-// 28 float_base base of float registers (d8-d15)
-// 44 magic magic number
-// 45- reserved reserved entries (room to grow)
+// 0 sigflag 0 => signal mask not valid
+// 1 unused unused (for alignment)
+// 2-3 sigmask signal mask (not used with _setjmp / _longjmp)
+// 4 core_base base of core registers (x19-x30, sp)
+// 30 float_base base of float registers (d8-d15)
+// 46- reserved reserved entries (room to grow)
// 64
//
// NOTE: The instructions that load/store core/vfp registers expect 8-byte
@@ -57,13 +58,10 @@
// need to save status/control registers for VFP (it is not a
// requirement for setjmp).
-#define _JB_SIGMASK 0
+#define _JB_SIGFLAG 0
+#define _JB_SIGMASK (_JB_SIGFLAG + 2)
#define _JB_CORE_BASE (_JB_SIGMASK + 2)
#define _JB_FLOAT_BASE (_JB_CORE_BASE + (31-19+1)*2)
-#define _JB_MAGIC (_JB_FLOAT_BASE + 16*2)
-
-.L_setjmp_magic_signal_mask_n: .word 0x53657200
-.L_setjmp_magic_signal_mask_y: .word 0x53657201
ENTRY(setjmp)
mov w1, #1
@@ -77,8 +75,10 @@
// int sigsetjmp(sigjmp_buf env, int save_signal_mask);
ENTRY(sigsetjmp)
+ // Record whether or not we're saving the signal mask.
+ str w1, [x0, #(_JB_SIGFLAG * 4)]
+
// Do we need to save the signal mask?
- ldr w9, .L_setjmp_magic_signal_mask_n
cbz w1, 1f
// Save current signal mask.
@@ -89,12 +89,7 @@
bl sigprocmask
ldp x0, x30, [sp], #16
- ldr w9, .L_setjmp_magic_signal_mask_y
-
1:
- // Save magic number.
- str w9, [x0, #(_JB_MAGIC * 4)]
-
// Save core registers.
mov x10, sp
stp x30, x10, [x0, #(_JB_CORE_BASE * 4 + 16 * 0)]
@@ -111,20 +106,15 @@
stp d10, d11, [x0, #(_JB_FLOAT_BASE * 4 + 16 * 2)]
stp d8, d9, [x0, #(_JB_FLOAT_BASE * 4 + 16 * 3)]
- mov w0, wzr
+ mov w0, #0
ret
END(sigsetjmp)
// void siglongjmp(sigjmp_buf env, int value);
ENTRY(siglongjmp)
- // Check magic.
- ldr w10, [x0, #(_JB_MAGIC * 4)]
- ldr w9, .L_setjmp_magic_signal_mask_n
- cmp w9, w10
- b.eq 1f
- ldr w9, .L_setjmp_magic_signal_mask_y
- cmp w9, w10
- b.ne longjmperror
+ // Do we need to restore the signal mask?
+ ldr w9, [x0, #(_JB_SIGFLAG * 4)]
+ cbz w9, 1f
// Restore signal mask.
stp x0, x30, [sp, #-16]!