]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - android-sdk/platform-bionic.git/blob - libc/arch-arm/bionic/setjmp.S
0c9082c2c0b268da1b9f0a7154dfe7670db1c640
[android-sdk/platform-bionic.git] / libc / arch-arm / bionic / setjmp.S
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 $ */
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  */
37 #include <private/bionic_asm.h>
38 #include <machine/setjmp.h>
39 #include <machine/cpu-features.h>
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 restored.
49  */
51 ENTRY(setjmp)
52         /* Block all signals and retrieve the old signal mask */
53         stmfd   sp!, {r0, r14}
54         .cfi_def_cfa_offset 8
55         .cfi_rel_offset r0, 0
56         .cfi_rel_offset r14, 4
57         mov     r0, #0x00000000
59         bl      sigblock
60         mov     r1, r0
62         ldmfd   sp!, {r0, r14}
63         .cfi_def_cfa_offset 0
65         /* Store signal mask */
66         str     r1, [r0, #(_JB_SIGMASK * 4)]
68         ldr     r1, .Lsetjmp_magic
69         str     r1, [r0, #(_JB_MAGIC * 4)]
71         /* Store core registers */
72         add     r1, r0, #(_JB_CORE_BASE * 4)
73         stmia   r1, {r4-r14}
75 #ifdef __ARM_HAVE_VFP
76         /* Store floating-point registers */
77         add     r1, r0, #(_JB_FLOAT_BASE * 4)
78         vstmia  r1, {d8-d15}
79         /* Store floating-point state */
80         fmrx    r1, fpscr
81         str     r1, [r0, #(_JB_FLOAT_STATE * 4)]
82 #endif  /* __ARM_HAVE_VFP */
84         mov     r0, #0x00000000
85         bx      lr
86 END(setjmp)
88 .Lsetjmp_magic:
89         .word   _JB_MAGIC_SETJMP
92 ENTRY(longjmp)
93         ldr     r2, .Lsetjmp_magic
94         ldr     r3, [r0, #(_JB_MAGIC * 4)]
95         teq     r2, r3
96         bne     botch
98         /* Fetch signal mask */
99         ldr     r2, [r0, #(_JB_SIGMASK * 4)]
101         /* Set signal mask */
102         stmfd   sp!, {r0, r1, r14}
103         .cfi_def_cfa_offset 12
104         .cfi_rel_offset r0, 0
105         .cfi_rel_offset r1, 4
106         .cfi_rel_offset r14, 8
107         sub     sp, sp, #4      /* align the stack */
108         .cfi_adjust_cfa_offset 4
110         mov     r0, r2
111         bl      sigsetmask
113         add     sp, sp, #4      /* unalign the stack */
114         .cfi_adjust_cfa_offset -4
115         ldmfd   sp!, {r0, r1, r14}
116         .cfi_def_cfa_offset 0
118 #ifdef __ARM_HAVE_VFP
119         /* Restore floating-point registers */
120         add     r2, r0, #(_JB_FLOAT_BASE * 4)
121         vldmia  r2, {d8-d15}
122         /* Restore floating-point state */
123         ldr     r2, [r0, #(_JB_FLOAT_STATE * 4)]
124         fmxr    fpscr, r2
125 #endif /* __ARM_HAVE_VFP */
127         /* Restore core registers */
128         add     r2, r0, #(_JB_CORE_BASE * 4)
129         ldmia   r2, {r4-r14}
131         /* Validate sp and r14 */
132         teq     sp, #0
133         teqne   r14, #0
134         beq     botch
136         /* Set return value */
138         mov     r0, r1
139         teq     r0, #0x00000000
140         moveq   r0, #0x00000001
141         bx      lr
142 #ifdef __ARM_26__
143         mov     r15, r14
144 #else
145         mov     r15, r14
146 #endif
148         /* validation failed, die die die. */
149 botch:
150         bl      longjmperror
151         bl      abort
152         b       . - 8           /* Cannot get here */
153 END(longjmp)