am 16c93b47: am 86d06dcc: Merge "Switch arm and arm64 over to the x86 style of jmpbuf."

* commit '16c93b47646e2ea5c3e09719bf1698363833676f':
  Switch arm and arm64 over to the x86 style of jmpbuf.
This commit is contained in:
Elliott Hughes 2014-12-09 14:41:10 +00:00 committed by Android Git Automerger
commit 408d8fa464
2 changed files with 25 additions and 45 deletions

View File

@ -64,15 +64,12 @@
// FP registers will be loaded/stored with instructions // FP registers will be loaded/stored with instructions
// that expect 8-byte alignment. // that expect 8-byte alignment.
#define _JB_MAGIC 0 #define _JB_SIGFLAG 0
#define _JB_SIGMASK (_JB_MAGIC+1) #define _JB_SIGMASK (_JB_SIGFLAG+1)
#define _JB_FLOAT_BASE (_JB_SIGMASK+1) #define _JB_FLOAT_BASE (_JB_SIGMASK+1)
#define _JB_FLOAT_STATE (_JB_FLOAT_BASE + (15-8+1)*2) #define _JB_FLOAT_STATE (_JB_FLOAT_BASE + (15-8+1)*2)
#define _JB_CORE_BASE (_JB_FLOAT_STATE+1) #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) ENTRY(setjmp)
mov r1, #1 mov r1, #1
b sigsetjmp b sigsetjmp
@ -85,9 +82,11 @@ END(_setjmp)
// int sigsetjmp(sigjmp_buf env, int save_signal_mask); // int sigsetjmp(sigjmp_buf env, int save_signal_mask);
ENTRY(sigsetjmp) 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? // Do we need to save the signal mask?
teq r1, #0 teq r1, #0
ldreq r1, .L_setjmp_magic_signal_mask_n
beq 1f beq 1f
// Get current signal mask. // Get current signal mask.
@ -101,15 +100,10 @@ ENTRY(sigsetjmp)
ldmfd sp!, {r0, r14} ldmfd sp!, {r0, r14}
.cfi_def_cfa_offset 0 .cfi_def_cfa_offset 0
// Save signal mask. // Save the signal mask.
str r1, [r0, #(_JB_SIGMASK * 4)] str r1, [r0, #(_JB_SIGMASK * 4)]
ldr r1, .L_setjmp_magic_signal_mask_y
1: 1:
// Save magic number.
str r1, [r0, #(_JB_MAGIC * 4)]
// Save core registers. // Save core registers.
add r1, r0, #(_JB_CORE_BASE * 4) add r1, r0, #(_JB_CORE_BASE * 4)
stmia r1, {r4-r14} stmia r1, {r4-r14}
@ -128,16 +122,12 @@ END(sigsetjmp)
// void siglongjmp(sigjmp_buf env, int value); // void siglongjmp(sigjmp_buf env, int value);
ENTRY(siglongjmp) ENTRY(siglongjmp)
// Check magic. // Do we need to restore the signal mask?
ldr r3, [r0, #(_JB_MAGIC * 4)] ldr r2, [r0, #(_JB_SIGFLAG * 4)]
ldr r2, .L_setjmp_magic_signal_mask_n teq r2, #0
teq r2, r3
beq 1f 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} stmfd sp!, {r0, r1, r14}
.cfi_def_cfa_offset 12 .cfi_def_cfa_offset 12
.cfi_rel_offset r0, 0 .cfi_rel_offset r0, 0

View File

@ -45,11 +45,12 @@
// //
// word name description // word name description
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
// 0-1 sigmask signal mask (not used with _setjmp / _longjmp) // 0 sigflag 0 => signal mask not valid
// 2 core_base base of core registers (x19-x30, sp) // 1 unused unused (for alignment)
// 28 float_base base of float registers (d8-d15) // 2-3 sigmask signal mask (not used with _setjmp / _longjmp)
// 44 magic magic number // 4 core_base base of core registers (x19-x30, sp)
// 45- reserved reserved entries (room to grow) // 30 float_base base of float registers (d8-d15)
// 46- reserved reserved entries (room to grow)
// 64 // 64
// //
// NOTE: The instructions that load/store core/vfp registers expect 8-byte // 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 // need to save status/control registers for VFP (it is not a
// requirement for setjmp). // 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_CORE_BASE (_JB_SIGMASK + 2)
#define _JB_FLOAT_BASE (_JB_CORE_BASE + (31-19+1)*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) ENTRY(setjmp)
mov w1, #1 mov w1, #1
@ -77,8 +75,10 @@ END(_setjmp)
// int sigsetjmp(sigjmp_buf env, int save_signal_mask); // int sigsetjmp(sigjmp_buf env, int save_signal_mask);
ENTRY(sigsetjmp) 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? // Do we need to save the signal mask?
ldr w9, .L_setjmp_magic_signal_mask_n
cbz w1, 1f cbz w1, 1f
// Save current signal mask. // Save current signal mask.
@ -89,12 +89,7 @@ ENTRY(sigsetjmp)
bl sigprocmask bl sigprocmask
ldp x0, x30, [sp], #16 ldp x0, x30, [sp], #16
ldr w9, .L_setjmp_magic_signal_mask_y
1: 1:
// Save magic number.
str w9, [x0, #(_JB_MAGIC * 4)]
// Save core registers. // Save core registers.
mov x10, sp mov x10, sp
stp x30, x10, [x0, #(_JB_CORE_BASE * 4 + 16 * 0)] stp x30, x10, [x0, #(_JB_CORE_BASE * 4 + 16 * 0)]
@ -111,20 +106,15 @@ ENTRY(sigsetjmp)
stp d10, d11, [x0, #(_JB_FLOAT_BASE * 4 + 16 * 2)] stp d10, d11, [x0, #(_JB_FLOAT_BASE * 4 + 16 * 2)]
stp d8, d9, [x0, #(_JB_FLOAT_BASE * 4 + 16 * 3)] stp d8, d9, [x0, #(_JB_FLOAT_BASE * 4 + 16 * 3)]
mov w0, wzr mov w0, #0
ret ret
END(sigsetjmp) END(sigsetjmp)
// void siglongjmp(sigjmp_buf env, int value); // void siglongjmp(sigjmp_buf env, int value);
ENTRY(siglongjmp) ENTRY(siglongjmp)
// Check magic. // Do we need to restore the signal mask?
ldr w10, [x0, #(_JB_MAGIC * 4)] ldr w9, [x0, #(_JB_SIGFLAG * 4)]
ldr w9, .L_setjmp_magic_signal_mask_n cbz w9, 1f
cmp w9, w10
b.eq 1f
ldr w9, .L_setjmp_magic_signal_mask_y
cmp w9, w10
b.ne longjmperror
// Restore signal mask. // Restore signal mask.
stp x0, x30, [sp, #-16]! stp x0, x30, [sp, #-16]!