blob: cac2247e4d7cbe6f54de8050e430868ebed25189 [file] [log] [blame]
/*
* Copyright (c) 2011 The Native Client Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#if defined(__native_client_nonsfi__)
.text
.globl setjmp
/* int setjmp(jmp_buf env) */
setjmp:
stmia r0!, {r4-r11, sp, lr}
vstmia r0!, {d8-d15}
mov r0, #0
bx lr
.text
.globl longjmp
/* void longjmp(jmp_buf env, int val) */
longjmp:
ldmia r0!, {r4-r11, sp, lr}
vldmia r0!, {d8-d15}
/* Return the result argument if nonzero or 1 otherwise */
/* Note: move updates condition codes */
movs r0, r1
moveq r0, #1
bx lr
#else
#include "nacl_arm_defs.h"
/*
* jump_buf is organized as follows
*
* r4, r5, r6, r7, r8, r10 (sl), r11 (fp), r12 (ip/pad), r13 (sp), r14 (lr),
* d8-d15.
*
* Note: We do not save/restore r9 - which pnacl uses for thread accounting.
* r12 is spilled to pad out the jump buf so that d8-d15 are stored at an
* 8-byte aligned location.
*
* This also assumes that the minimal ARM hardware has d8-d15 registers,
* which is checked: src/trusted/platform_qualify/arch/arm/nacl_qualify_fpu.c
*
* The assembly is correctly bundle-aligned and organized with whitespace
* between each bundle, so the bundle_lock directives are not strictly
* necessary, but they prevent clang's auto-sandboxer from redundantly
* sandboxing the code.
*/
.text
.align NACL_BLOCK_SHIFT
.globl setjmp
/* int setjmp(jmp_buf env) */
setjmp:
.bundle_lock
bic r0, r0, #NACL_DATA_FLOW_MASK
stmia r0!, {r4, r5, r6, r7, r8, r10, r11, r12, sp, lr}
.bundle_unlock
.bundle_lock
bic r0, r0, #NACL_DATA_FLOW_MASK
vstmia r0!, {d8-d15}
.bundle_unlock
mov r0, #0
.bundle_lock
bic lr, lr, #NACL_CONTROL_FLOW_MASK
bx lr
.bundle_unlock
.text
.align NACL_BLOCK_SHIFT
.globl longjmp
/* void longjmp(jmp_buf env, int val) */
longjmp:
.bundle_lock
bic r0, r0, #NACL_DATA_FLOW_MASK
ldmia r0!, {r4, r5, r6, r7, r8, r10, r11, r12, sp, lr}
bic sp, sp, #NACL_DATA_FLOW_MASK
.bundle_unlock
nop
.bundle_lock
bic r0, r0, #NACL_DATA_FLOW_MASK
vldmia r0!, {d8-d15}
.bundle_unlock
/* Return the result argument if nonzero or 1 otherwise */
/* Note: move updates condition codes */
movs r0, r1
moveq r0, #1
.bundle_lock
bic lr, lr, #NACL_CONTROL_FLOW_MASK
bx lr
.bundle_unlock
#endif