1/* $OpenBSD: _setjmp.S,v 1.2 2004/02/01 05:40:52 drahn Exp $ */ 2/* $NetBSD: _setjmp.S,v 1.5 2003/04/05 23:08:51 bjh21 Exp $ */ 3 4/* 5 * Copyright (c) 1997 Mark Brinicombe 6 * Copyright (c) 2010 Android Open Source Project. 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. All advertising materials mentioning features or use of this software 18 * must display the following acknowledgement: 19 * This product includes software developed by Mark Brinicombe 20 * 4. Neither the name of the University nor the names of its contributors 21 * may be used to endorse or promote products derived from this software 22 * without specific prior written permission. 23 * 24 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * SUCH DAMAGE. 35 */ 36 37#include <private/bionic_asm.h> 38#include <machine/setjmp.h> 39#include <machine/cpu-features.h> 40 41/* 42 * C library -- _setjmp, _longjmp 43 * 44 * _longjmp(a,v) 45 * will generate a "return(v)" from the last call to 46 * _setjmp(a) 47 * by restoring registers from the stack. 48 * The previous signal state is NOT restored. 49 * 50 * Note: r0 is the return value 51 * r1-r3 are scratch registers in functions 52 */ 53 54ENTRY(_setjmp) 55 ldr r1, .L_setjmp_magic 56 str r1, [r0, #(_JB_MAGIC * 4)] 57 58 /* Store core registers */ 59 add r1, r0, #(_JB_CORE_BASE * 4) 60 stmia r1, {r4-r14} 61 62#ifdef __ARM_HAVE_VFP 63 /* Store floating-point registers */ 64 add r1, r0, #(_JB_FLOAT_BASE * 4) 65 vstmia r1, {d8-d15} 66 /* Store floating-point state */ 67 fmrx r1, fpscr 68 str r1, [r0, #(_JB_FLOAT_STATE * 4)] 69#endif /* __ARM_HAVE_VFP */ 70 71 mov r0, #0x00000000 72 bx lr 73END(_setjmp) 74 75.L_setjmp_magic: 76 .word _JB_MAGIC__SETJMP 77 78ENTRY(_longjmp) 79 ldr r2, .L_setjmp_magic 80 ldr r3, [r0, #(_JB_MAGIC * 4)] 81 teq r2, r3 82 bne botch 83 84#ifdef __ARM_HAVE_VFP 85 /* Restore floating-point registers */ 86 add r2, r0, #(_JB_FLOAT_BASE * 4) 87 vldmia r2, {d8-d15} 88 /* Restore floating-point state */ 89 ldr r2, [r0, #(_JB_FLOAT_STATE * 4)] 90 fmxr fpscr, r2 91#endif /* __ARM_HAVE_VFP */ 92 93 /* Restore core registers */ 94 add r2, r0, #(_JB_CORE_BASE * 4) 95 ldmia r2, {r4-r14} 96 97 /* Validate sp and r14 */ 98 teq sp, #0 99 teqne r14, #0 100 beq botch 101 102 /* Set return value */ 103 mov r0, r1 104 teq r0, #0x00000000 105 moveq r0, #0x00000001 106 bx lr 107 108 /* validation failed, die die die. */ 109botch: 110 bl PIC_SYM(longjmperror, PLT) 111 bl PIC_SYM(abort, PLT) 112 b . - 8 /* Cannot get here */ 113END(_longjmp) 114