setjmp.S revision 1.8.10.1 1 1.8.10.1 matt /* $NetBSD: setjmp.S,v 1.8.10.1 2007/08/28 17:36:30 matt Exp $ */
2 1.1 bjh21
3 1.1 bjh21 /*
4 1.1 bjh21 * Copyright (c) 1997 Mark Brinicombe
5 1.1 bjh21 * All rights reserved.
6 1.1 bjh21 *
7 1.1 bjh21 * Redistribution and use in source and binary forms, with or without
8 1.1 bjh21 * modification, are permitted provided that the following conditions
9 1.1 bjh21 * are met:
10 1.1 bjh21 * 1. Redistributions of source code must retain the above copyright
11 1.1 bjh21 * notice, this list of conditions and the following disclaimer.
12 1.1 bjh21 * 2. Redistributions in binary form must reproduce the above copyright
13 1.1 bjh21 * notice, this list of conditions and the following disclaimer in the
14 1.1 bjh21 * documentation and/or other materials provided with the distribution.
15 1.1 bjh21 * 3. All advertising materials mentioning features or use of this software
16 1.1 bjh21 * must display the following acknowledgement:
17 1.1 bjh21 * This product includes software developed by Mark Brinicombe
18 1.1 bjh21 * 4. Neither the name of the University nor the names of its contributors
19 1.1 bjh21 * may be used to endorse or promote products derived from this software
20 1.1 bjh21 * without specific prior written permission.
21 1.1 bjh21 *
22 1.1 bjh21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
23 1.1 bjh21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 1.1 bjh21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 1.1 bjh21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
26 1.1 bjh21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 1.1 bjh21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 1.1 bjh21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 1.1 bjh21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 1.1 bjh21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 1.1 bjh21 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 1.1 bjh21 * SUCH DAMAGE.
33 1.1 bjh21 */
34 1.1 bjh21
35 1.1 bjh21 #include <machine/asm.h>
36 1.1 bjh21 #include <machine/setjmp.h>
37 1.1 bjh21
38 1.1 bjh21 /*
39 1.1 bjh21 * C library -- setjmp, longjmp
40 1.1 bjh21 *
41 1.1 bjh21 * longjmp(a,v)
42 1.1 bjh21 * will generate a "return(v)" from the last call to
43 1.1 bjh21 * setjmp(a)
44 1.1 bjh21 * by restoring registers from the stack.
45 1.1 bjh21 * The previous signal state is restored.
46 1.1 bjh21 */
47 1.1 bjh21
48 1.8 christos ENTRY(__setjmp14)
49 1.8.10.1 matt #ifdef __thumb__
50 1.8.10.1 matt /* Get the signal mask. */
51 1.8.10.1 matt push {r0, r4-r7, lr}
52 1.8.10.1 matt add r0, r0, #(_JB_SIGMASK * 4)
53 1.8.10.1 matt mov r2, r0
54 1.8.10.1 matt mov r1, #0
55 1.8.10.1 matt mov r0, #0
56 1.8.10.1 matt bl PLT_SYM(_C_LABEL(__sigprocmask14))
57 1.8.10.1 matt pop {r0}
58 1.8.10.1 matt
59 1.8.10.1 matt ldr r2, .Lsetjmp_magic
60 1.8.10.1 matt str r2, [r0]
61 1.8.10.1 matt
62 1.8.10.1 matt add r0, r0, #56 /* skip magic and floating point */
63 1.8.10.1 matt
64 1.8.10.1 matt /* Store integer registers */
65 1.8.10.1 matt stmia r0!, {r4-r7}
66 1.8.10.1 matt
67 1.8.10.1 matt mov r4, r8
68 1.8.10.1 matt mov r5, r9
69 1.8.10.1 matt mov r6, r10
70 1.8.10.1 matt mov r7, r11
71 1.8.10.1 matt stmia r0!, {r4-r7}
72 1.8.10.1 matt
73 1.8.10.1 matt mov r4, r12
74 1.8.10.1 matt mov r5, r13
75 1.8.10.1 matt mov r6, r14
76 1.8.10.1 matt stmia r0!, {r4-r6}
77 1.8.10.1 matt
78 1.8.10.1 matt mov r0, #0
79 1.8.10.1 matt pop {r4-r7, pc}
80 1.8.10.1 matt #else
81 1.8 christos /* Get the signal mask. */
82 1.8 christos stmfd sp!, {r0-r2, r14}
83 1.8 christos add r2, r0, #(_JB_SIGMASK * 4)
84 1.8 christos mov r1, #0x00000000
85 1.1 bjh21 mov r0, #0x00000000
86 1.8.10.1 matt bl PLT_SYM(_C_LABEL(__sigprocmask14))
87 1.8 christos ldmfd sp!, {r0-r2, r14}
88 1.1 bjh21
89 1.4 thorpej ldr r1, .Lsetjmp_magic
90 1.8.10.1 matt str r1, [r0]
91 1.1 bjh21
92 1.1 bjh21 #ifdef SOFTFLOAT
93 1.1 bjh21 add r0, r0, #52
94 1.1 bjh21 #else
95 1.1 bjh21 /* Store fp registers */
96 1.1 bjh21 sfm f4, 4, [r0], #48
97 1.1 bjh21 /* Store fpsr */
98 1.1 bjh21 rfs r1
99 1.1 bjh21 str r1, [r0], #0x0004
100 1.1 bjh21 #endif /*SOFTFLOAT*/
101 1.1 bjh21 /* Store integer registers */
102 1.1 bjh21 stmia r0, {r4-r14}
103 1.1 bjh21 mov r0, #0x00000000
104 1.6 rearnsha RET
105 1.8.10.1 matt #endif /* __thumb__ */
106 1.1 bjh21
107 1.8.10.1 matt ENTRY(__longjmp14)
108 1.8.10.1 matt #ifdef __thumb__
109 1.8.10.1 matt ldr r2, .Lsetjmp_magic
110 1.8.10.1 matt ldr r3, [r0]
111 1.8.10.1 matt cmp r2, r3
112 1.8.10.1 matt bne .Lbotch
113 1.1 bjh21
114 1.8.10.1 matt /* Restore the signal mask. */
115 1.8.10.1 matt push {r0, lr}
116 1.8.10.1 matt mov r2, #0
117 1.8.10.1 matt add r0, r0, #(_JB_SIGMASK * 4)
118 1.8.10.1 matt mov r1, r0
119 1.8.10.1 matt mov r0, #3 /* SIG_SETMASK */
120 1.8.10.1 matt bl PLT_SYM(_C_LABEL(__sigprocmask14))
121 1.8.10.1 matt pop {r0}
122 1.1 bjh21
123 1.8.10.1 matt add r0, r0, #56
124 1.8.10.1 matt /* Restore integer registers */
125 1.8.10.1 matt ldmia r0!, {r4-r7}
126 1.8.10.1 matt push {r4-r7}
127 1.8.10.1 matt
128 1.8.10.1 matt ldmia r0!, {r4-r7}
129 1.8.10.1 matt mov r8, r4
130 1.8.10.1 matt mov r9, r5
131 1.8.10.1 matt mov r10, r6
132 1.8.10.1 matt mov r11, r7
133 1.8.10.1 matt
134 1.8.10.1 matt ldmia r0!, {r4-r6}
135 1.8.10.1 matt mov r12, r4
136 1.8.10.1 matt mov sp, r5
137 1.8.10.1 matt mov lr, r6
138 1.8.10.1 matt
139 1.8.10.1 matt /* Validate sp and lr */
140 1.8.10.1 matt cmp r5, #0 /* sp */
141 1.8.10.1 matt beq .Lbotch
142 1.8.10.1 matt cmp r6, #0 /* lr */
143 1.8.10.1 matt beq .Lbotch
144 1.8.10.1 matt
145 1.8.10.1 matt /* Set return value */
146 1.8.10.1 matt
147 1.8.10.1 matt mov r0, r1
148 1.8.10.1 matt bne 1f
149 1.8.10.1 matt mov r0, #1
150 1.8.10.1 matt 1: pop {r4-r7, pc}
151 1.8.10.1 matt #else
152 1.4 thorpej ldr r2, .Lsetjmp_magic
153 1.1 bjh21 ldr r3, [r0]
154 1.1 bjh21 teq r2, r3
155 1.8 christos bne .Lbotch
156 1.1 bjh21
157 1.8 christos /* Restore the signal mask. */
158 1.8 christos stmfd sp!, {r0-r2, r14}
159 1.8 christos mov r2, #0x00000000
160 1.8 christos add r1, r0, #(_JB_SIGMASK * 4)
161 1.8 christos mov r0, #3 /* SIG_SETMASK */
162 1.8.10.1 matt bl PLT_SYM(_C_LABEL(__sigprocmask14))
163 1.8 christos ldmfd sp!, {r0-r2, r14}
164 1.1 bjh21
165 1.1 bjh21 add r0, r0, #4
166 1.1 bjh21 #ifdef SOFTFLOAT
167 1.1 bjh21 add r0, r0, #52
168 1.1 bjh21 #else
169 1.1 bjh21 /* Restore fp registers */
170 1.1 bjh21 lfm f4, 4, [r0], #48
171 1.1 bjh21 /* Restore FPSR */
172 1.1 bjh21 ldr r4, [r0], #0x0004
173 1.1 bjh21 wfs r4
174 1.1 bjh21 #endif /* SOFTFLOAT */
175 1.1 bjh21 /* Restore integer registers */
176 1.1 bjh21 ldmia r0, {r4-r14}
177 1.1 bjh21
178 1.3 chris /* Validate sp and r14 */
179 1.3 chris teq sp, #0
180 1.3 chris teqne r14, #0
181 1.8 christos beq .Lbotch
182 1.1 bjh21
183 1.1 bjh21 /* Set return value */
184 1.1 bjh21
185 1.1 bjh21 mov r0, r1
186 1.1 bjh21 teq r0, #0x00000000
187 1.1 bjh21 moveq r0, #0x00000001
188 1.6 rearnsha RET
189 1.8.10.1 matt #endif
190 1.1 bjh21
191 1.1 bjh21 /* validation failed, die die die. */
192 1.8 christos .Lbotch:
193 1.8.10.1 matt bl PLT_SYM(_C_LABEL(longjmperror))
194 1.8.10.1 matt bl PLT_SYM(_C_LABEL(abort))
195 1.1 bjh21 b . - 8 /* Cannot get here */
196 1.8.10.1 matt
197 1.8.10.1 matt .p2align 2
198 1.8.10.1 matt .Lsetjmp_magic:
199 1.8.10.1 matt .word _JB_MAGIC_SETJMP
200