blob: 73002e8a839199e918f160ffdf654aef18176a83 [file] [log] [blame]
Raghu Gandham405b8022012-07-25 18:16:42 -07001/*
Elliott Hughesdd570292015-05-12 10:10:01 -07002 * Copyright (C) 2014 The Android Open Source Project
Duane Sandb6d301f2015-01-26 14:48:48 -08003 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in
12 * the documentation and/or other materials provided with the
13 * distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28/*
Raghu Gandham405b8022012-07-25 18:16:42 -070029 * Copyright (c) 2001-2002 Opsycon AB (www.opsycon.se / www.opsycon.com)
30 *
31 * Redistribution and use in source and binary forms, with or without
32 * modification, are permitted provided that the following conditions
33 * are met:
34 * 1. Redistributions of source code must retain the above copyright
35 * notice, this list of conditions and the following disclaimer.
36 * 2. Redistributions in binary form must reproduce the above copyright
37 * notice, this list of conditions and the following disclaimer in the
38 * documentation and/or other materials provided with the distribution.
39 * 3. Neither the name of Opsycon AB nor the names of its contributors
40 * may be used to endorse or promote products derived from this software
41 * without specific prior written permission.
42 *
43 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
44 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
45 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
46 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
47 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
48 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
49 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
50 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
51 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
52 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
53 * SUCH DAMAGE.
54 *
55 */
Elliott Hughesd27ae2f2014-12-08 17:01:11 -080056/*-
57 * Copyright (c) 1991, 1993, 1995,
58 * The Regents of the University of California. All rights reserved.
59 *
60 * This code is derived from software contributed to Berkeley by
61 * Havard Eidnes.
62 *
63 * Redistribution and use in source and binary forms, with or without
64 * modification, are permitted provided that the following conditions
65 * are met:
66 * 1. Redistributions of source code must retain the above copyright
67 * notice, this list of conditions and the following disclaimer.
68 * 2. Redistributions in binary form must reproduce the above copyright
69 * notice, this list of conditions and the following disclaimer in the
70 * documentation and/or other materials provided with the distribution.
71 * 3. Neither the name of the University nor the names of its contributors
72 * may be used to endorse or promote products derived from this software
73 * without specific prior written permission.
74 *
75 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
76 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
77 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
78 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
79 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
80 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
81 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
82 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
83 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
84 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
85 * SUCH DAMAGE.
86 */
87/*
88 * Copyright (c) 1992, 1993
89 * The Regents of the University of California. All rights reserved.
90 *
91 * This code is derived from software contributed to Berkeley by
92 * Ralph Campbell.
93 *
94 * Redistribution and use in source and binary forms, with or without
95 * modification, are permitted provided that the following conditions
96 * are met:
97 * 1. Redistributions of source code must retain the above copyright
98 * notice, this list of conditions and the following disclaimer.
99 * 2. Redistributions in binary form must reproduce the above copyright
100 * notice, this list of conditions and the following disclaimer in the
101 * documentation and/or other materials provided with the distribution.
102 * 3. Neither the name of the University nor the names of its contributors
103 * may be used to endorse or promote products derived from this software
104 * without specific prior written permission.
105 *
106 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
107 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
108 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
109 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
110 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
111 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
112 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
113 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
114 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
115 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
116 * SUCH DAMAGE.
117 *
118 * @(#)signal.h 8.1 (Berkeley) 6/10/93
119 */
Raghu Gandham405b8022012-07-25 18:16:42 -0700120
Elliott Hughes851e68a2014-02-19 16:53:20 -0800121#include <private/bionic_asm.h>
Elliott Hughesd27ae2f2014-12-08 17:01:11 -0800122#include <machine/setjmp.h>
123
Duane Sandb6d301f2015-01-26 14:48:48 -0800124/* jmpbuf is declared to users as an array of longs, which is only
125 * 4-byte aligned in 32-bit builds. The Mips jmpbuf begins with a
126 * dynamically-sized 0- or 4-byte unused filler so that double-prec FP regs
127 * are saved to 8-byte-aligned mem cells.
128 * All the following jmpbuf offsets are from the rounded-DOWN base addr.
Elliott Hughesd27ae2f2014-12-08 17:01:11 -0800129 */
130
131/* Fields of same size on all MIPS abis: */
Duane Sandb6d301f2015-01-26 14:48:48 -0800132/* field: byte offset: size: */
133/* dynam filler (0*4) 0-4 bytes of rounddown filler, DON'T TOUCH!!
134 often overlays user storage!! */
Nikola Veljkovic1b519c02015-10-06 18:39:49 +0200135#define SC_FPSR_OFFSET (1*4) /* 4 bytes, floating point control/status reg */
Duane Sandb6d301f2015-01-26 14:48:48 -0800136/* following fields are 8-byte aligned */
Nikola Veljkovic1b519c02015-10-06 18:39:49 +0200137#define SC_FLAG_OFFSET (2*4) /* 8 bytes, cookie and savesigs flag, first actual field */
Duane Sandb6d301f2015-01-26 14:48:48 -0800138#define SC_MASK_OFFSET (4*4) /* 16 bytes, mips32/mips64 version of sigset_t */
139#define SC_SPARE_OFFSET (8*4) /* 8 bytes, reserved for future uses */
Elliott Hughesd27ae2f2014-12-08 17:01:11 -0800140
141/* Registers that are 4-byte on mips32 o32, and 8-byte on mips64 n64 abi */
Duane Sandb6d301f2015-01-26 14:48:48 -0800142#define SC_REGS_OFFSET (10*4) /* SC_REGS_BYTES */
143#define SC_REGS_SAVED 12 /*regs*/ /* ra,s0-s8,gp,sp */
144#define SC_REGS_BYTES (SC_REGS_SAVED*REGSZ)
145#define SC_REGS SC_REGS_OFFSET
Elliott Hughesd27ae2f2014-12-08 17:01:11 -0800146
Duane Sandb6d301f2015-01-26 14:48:48 -0800147/* Double floating pt registers are 8-bytes on all abis,
Elliott Hughesd27ae2f2014-12-08 17:01:11 -0800148 * but the number of saved fp regs varies for o32/n32 versus n64 abis:
149 */
150
151#ifdef __LP64__
152#define SC_FPREGS_SAVED 8 /* all fp regs f24,f25,f26,f27,f28,f29,f30,f31 */
153#else
154#define SC_FPREGS_SAVED 6 /* even fp regs f20,f22,f24,f26,f28,f30 */
155#endif
156
Duane Sandb6d301f2015-01-26 14:48:48 -0800157#define SC_FPREGS_OFFSET (SC_REGS_OFFSET + SC_REGS_BYTES) /* SC_FPREGS_BYTES */
158#define SC_FPREGS_BYTES (SC_FPREGS_SAVED*REGSZ_FP)
159#define SC_FPREGS SC_FPREGS_OFFSET
Elliott Hughesd27ae2f2014-12-08 17:01:11 -0800160
Duane Sandb6d301f2015-01-26 14:48:48 -0800161#define SC_TOTAL_BYTES (SC_FPREGS_OFFSET + SC_FPREGS_BYTES)
162#define SC_TOTAL_LONGS (SC_TOTAL_BYTES/REGSZ)
Elliott Hughesd27ae2f2014-12-08 17:01:11 -0800163
Duane Sandb6d301f2015-01-26 14:48:48 -0800164#if SC_TOTAL_LONGS > _JBLEN
165#error _JBLEN is too small
Elliott Hughesd27ae2f2014-12-08 17:01:11 -0800166#endif
Raghu Gandham405b8022012-07-25 18:16:42 -0700167
Nikola Veljkovic1b519c02015-10-06 18:39:49 +0200168.macro m_mangle_reg_and_store reg, cookie, temp, offset
169 xor \temp, \reg, \cookie
170 REG_S \temp, \offset
171.endm
172
173.macro m_unmangle_reg_and_load reg, cookie, temp, offset
174 REG_L \temp, \offset
175 xor \reg, \temp, \cookie
176.endm
177
Raghu Gandham405b8022012-07-25 18:16:42 -0700178/*
Duane Sand3a478632014-11-25 17:33:10 -0800179 *
Duane Sandb6d301f2015-01-26 14:48:48 -0800180 * GPOFF and FRAMESIZE must be the same for all setjmp/longjmp routines
Raghu Gandham405b8022012-07-25 18:16:42 -0700181 *
182 */
183
184FRAMESZ= MKFSIZ(2,6)
185A1OFF= FRAMESZ-4*REGSZ
186A0OFF= FRAMESZ-3*REGSZ
187GPOFF= FRAMESZ-2*REGSZ
188RAOFF= FRAMESZ-1*REGSZ
189
Duane Sandb6d301f2015-01-26 14:48:48 -0800190NON_LEAF(sigsetjmp, FRAMESZ, ra)
Raghu Gandham405b8022012-07-25 18:16:42 -0700191 .mask 0x80000000, RAOFF
192 PTR_SUBU sp, FRAMESZ # allocate stack frame
Duane Sandb6d301f2015-01-26 14:48:48 -0800193 SETUP_GP64(GPOFF, sigsetjmp)
Raghu Gandham405b8022012-07-25 18:16:42 -0700194 SAVE_GP(GPOFF)
195 .set reorder
Duane Sand3a478632014-11-25 17:33:10 -0800196
Duane Sandb6d301f2015-01-26 14:48:48 -0800197setjmp_common:
Duane Sand3a478632014-11-25 17:33:10 -0800198#ifndef __LP64__
Duane Sandb6d301f2015-01-26 14:48:48 -0800199 li t0, ~7
200 and a0, t0 # round jmpbuf addr DOWN to 8-byte boundary
Duane Sand3a478632014-11-25 17:33:10 -0800201#endif
Duane Sandb6d301f2015-01-26 14:48:48 -0800202 REG_S ra, RAOFF(sp) # spill state
Raghu Gandham405b8022012-07-25 18:16:42 -0700203 REG_S a0, A0OFF(sp)
Nikola Veljkovic1b519c02015-10-06 18:39:49 +0200204
205 # get the cookie and store it along with the signal flag.
206 move a0, a1
207 jal __bionic_setjmp_cookie_get
208 REG_L a0, A0OFF(sp)
209
210 REG_S v0, SC_FLAG_OFFSET(a0) # save cookie and savesigs flag
211 andi t0, v0, 1 # extract savesigs flag
212
213 beqz t0, 1f # do saving of signal mask?
214
Duane Sandb6d301f2015-01-26 14:48:48 -0800215 # call sigprocmask(int how ignored, sigset_t* null, sigset_t* SC_MASK(a0)):
216 LA a2, SC_MASK_OFFSET(a0) # gets current signal mask
217 li a0, 0 # how; ignored when new mask is null
218 li a1, 0 # null new mask
219 jal sigprocmask # get current signal mask
Duane Sand3a478632014-11-25 17:33:10 -0800220 REG_L a0, A0OFF(sp)
Duane Sandb6d301f2015-01-26 14:48:48 -08002211:
Nikola Veljkovic1b519c02015-10-06 18:39:49 +0200222 REG_L gp, GPOFF(sp) # restore spills
223 REG_L ra, RAOFF(sp)
224 REG_L t0, SC_FLAG_OFFSET(a0) # move cookie to temp reg
225
Duane Sand3a478632014-11-25 17:33:10 -0800226 # callee-saved long-sized regs:
Nikola Veljkovic1b519c02015-10-06 18:39:49 +0200227 PTR_ADDU v1, sp, FRAMESZ # save orig sp
228
229 # m_mangle_reg_and_store reg, cookie, temp, offset
230 m_mangle_reg_and_store ra, t0, t1, SC_REGS+0*REGSZ(a0)
231 m_mangle_reg_and_store s0, t0, t2, SC_REGS+1*REGSZ(a0)
232 m_mangle_reg_and_store s1, t0, t3, SC_REGS+2*REGSZ(a0)
233 m_mangle_reg_and_store s2, t0, t1, SC_REGS+3*REGSZ(a0)
234 m_mangle_reg_and_store s3, t0, t2, SC_REGS+4*REGSZ(a0)
235 m_mangle_reg_and_store s4, t0, t3, SC_REGS+5*REGSZ(a0)
236 m_mangle_reg_and_store s5, t0, t1, SC_REGS+6*REGSZ(a0)
237 m_mangle_reg_and_store s6, t0, t2, SC_REGS+7*REGSZ(a0)
238 m_mangle_reg_and_store s7, t0, t3, SC_REGS+8*REGSZ(a0)
239 m_mangle_reg_and_store s8, t0, t1, SC_REGS+9*REGSZ(a0)
240 m_mangle_reg_and_store gp, t0, t2, SC_REGS+10*REGSZ(a0)
241 m_mangle_reg_and_store v1, t0, t3, SC_REGS+11*REGSZ(a0)
Duane Sand3a478632014-11-25 17:33:10 -0800242
Raghu Gandham405b8022012-07-25 18:16:42 -0700243 cfc1 v0, $31
Duane Sand3a478632014-11-25 17:33:10 -0800244
245#ifdef __LP64__
246 # callee-saved fp regs on mips n64 ABI are $f24..$f31
247 s.d $f24, SC_FPREGS+0*REGSZ_FP(a0)
248 s.d $f25, SC_FPREGS+1*REGSZ_FP(a0)
249 s.d $f26, SC_FPREGS+2*REGSZ_FP(a0)
250 s.d $f27, SC_FPREGS+3*REGSZ_FP(a0)
251 s.d $f28, SC_FPREGS+4*REGSZ_FP(a0)
252 s.d $f29, SC_FPREGS+5*REGSZ_FP(a0)
253 s.d $f30, SC_FPREGS+6*REGSZ_FP(a0)
254 s.d $f31, SC_FPREGS+7*REGSZ_FP(a0)
255#else
256 # callee-saved fp regs on mips o32 ABI are
Duane Sandb6d301f2015-01-26 14:48:48 -0800257 # the even-numbered double fp regs $f20,$f22,...$f30
Duane Sand3a478632014-11-25 17:33:10 -0800258 s.d $f20, SC_FPREGS+0*REGSZ_FP(a0)
259 s.d $f22, SC_FPREGS+1*REGSZ_FP(a0)
260 s.d $f24, SC_FPREGS+2*REGSZ_FP(a0)
261 s.d $f26, SC_FPREGS+3*REGSZ_FP(a0)
262 s.d $f28, SC_FPREGS+4*REGSZ_FP(a0)
263 s.d $f30, SC_FPREGS+5*REGSZ_FP(a0)
Raghu Gandham405b8022012-07-25 18:16:42 -0700264#endif
Duane Sandb6d301f2015-01-26 14:48:48 -0800265 sw v0, SC_FPSR_OFFSET(a0)
Raghu Gandham405b8022012-07-25 18:16:42 -0700266 move v0, zero
267 RESTORE_GP64
268 PTR_ADDU sp, FRAMESZ
269 j ra
Duane Sandb6d301f2015-01-26 14:48:48 -0800270END(sigsetjmp)
Duane Sand3a478632014-11-25 17:33:10 -0800271
Duane Sandb6d301f2015-01-26 14:48:48 -0800272
273# Alternate entry points:
274
275NON_LEAF(setjmp, FRAMESZ, ra)
Duane Sand3a478632014-11-25 17:33:10 -0800276 .mask 0x80000000, RAOFF
277 PTR_SUBU sp, FRAMESZ
Duane Sandb6d301f2015-01-26 14:48:48 -0800278 SETUP_GP64(GPOFF, setjmp) # can't share sigsetjmp's gp code
279 SAVE_GP(GPOFF)
280 .set reorder
281
282 li a1, 1 # save/restore signals state
283 b setjmp_common # tail call
284END(setjmp)
285
286
287NON_LEAF(_setjmp, FRAMESZ, ra)
288 .mask 0x80000000, RAOFF
289 PTR_SUBU sp, FRAMESZ
290 SETUP_GP64(GPOFF, _setjmp) # can't share sigsetjmp's gp code
291 SAVE_GP(GPOFF)
292 .set reorder
293
294 li a1, 0 # don't save/restore signals
295 b setjmp_common # tail call
296END(_setjmp)
297
298
299NON_LEAF(siglongjmp, FRAMESZ, ra)
300 .mask 0x80000000, RAOFF
301 PTR_SUBU sp, FRAMESZ
302 SETUP_GP64(GPOFF, siglongjmp)
Duane Sand3a478632014-11-25 17:33:10 -0800303 SAVE_GP(GPOFF)
304 .set reorder
305
306#ifndef __LP64__
Duane Sandb6d301f2015-01-26 14:48:48 -0800307 li t0, ~7
308 and a0, t0 # round jmpbuf addr DOWN to 8-byte boundary
Duane Sand3a478632014-11-25 17:33:10 -0800309#endif
310
Nikola Veljkovic1b519c02015-10-06 18:39:49 +0200311 move s1, a1 # temp spill
312 move s0, a0
313
314 # extract savesigs flag
315 REG_L s2, SC_FLAG_OFFSET(s0)
316 andi t0, s2, 1
Duane Sandb6d301f2015-01-26 14:48:48 -0800317 beqz t0, 1f # restore signal mask?
318
Nikola Veljkovic1b519c02015-10-06 18:39:49 +0200319 # call sigprocmask(int how SIG_SETMASK, sigset_t* SC_MASK(a0), sigset_t* null):
320 LA a1, SC_MASK_OFFSET(s0) # signals being restored
Duane Sandb6d301f2015-01-26 14:48:48 -0800321 li a0, 3 # mips SIG_SETMASK
322 li a2, 0 # null
323 jal sigprocmask # restore signal mask
Duane Sandb6d301f2015-01-26 14:48:48 -08003241:
Nikola Veljkovic1b519c02015-10-06 18:39:49 +0200325 move t0, s2 # get cookie to temp reg
326 move a1, s1
327 move a0, s0
328
Duane Sand3a478632014-11-25 17:33:10 -0800329 # callee-saved long-sized regs:
Nikola Veljkovic1b519c02015-10-06 18:39:49 +0200330
331 # m_unmangle_reg_and_load reg, cookie, temp, offset
332 # don't restore gp yet, old value is needed for cookie_check call
333 m_unmangle_reg_and_load ra, t0, t1, SC_REGS+0*REGSZ(a0)
334 m_unmangle_reg_and_load s0, t0, t2, SC_REGS+1*REGSZ(a0)
335 m_unmangle_reg_and_load s1, t0, t3, SC_REGS+2*REGSZ(a0)
336 m_unmangle_reg_and_load s2, t0, t1, SC_REGS+3*REGSZ(a0)
337 m_unmangle_reg_and_load s3, t0, t2, SC_REGS+4*REGSZ(a0)
338 m_unmangle_reg_and_load s4, t0, t3, SC_REGS+5*REGSZ(a0)
339 m_unmangle_reg_and_load s5, t0, t1, SC_REGS+6*REGSZ(a0)
340 m_unmangle_reg_and_load s6, t0, t2, SC_REGS+7*REGSZ(a0)
341 m_unmangle_reg_and_load s7, t0, t3, SC_REGS+8*REGSZ(a0)
342 m_unmangle_reg_and_load s8, t0, t1, SC_REGS+9*REGSZ(a0)
343 m_unmangle_reg_and_load v1, t0, t2, SC_REGS+10*REGSZ(a0)
344 m_unmangle_reg_and_load sp, t0, t3, SC_REGS+11*REGSZ(a0)
Duane Sand3a478632014-11-25 17:33:10 -0800345
Duane Sandb6d301f2015-01-26 14:48:48 -0800346 lw v0, SC_FPSR_OFFSET(a0)
347 ctc1 v0, $31 # restore old fr mode before fp values
Duane Sand3a478632014-11-25 17:33:10 -0800348#ifdef __LP64__
349 # callee-saved fp regs on mips n64 ABI are $f24..$f31
350 l.d $f24, SC_FPREGS+0*REGSZ_FP(a0)
351 l.d $f25, SC_FPREGS+1*REGSZ_FP(a0)
352 l.d $f26, SC_FPREGS+2*REGSZ_FP(a0)
353 l.d $f27, SC_FPREGS+3*REGSZ_FP(a0)
354 l.d $f28, SC_FPREGS+4*REGSZ_FP(a0)
355 l.d $f29, SC_FPREGS+5*REGSZ_FP(a0)
356 l.d $f30, SC_FPREGS+6*REGSZ_FP(a0)
357 l.d $f31, SC_FPREGS+7*REGSZ_FP(a0)
358#else
359 # callee-saved fp regs on mips o32 ABI are
Duane Sandb6d301f2015-01-26 14:48:48 -0800360 # the even-numbered double fp regs $f20,$f22,...$f30
Duane Sand3a478632014-11-25 17:33:10 -0800361 l.d $f20, SC_FPREGS+0*REGSZ_FP(a0)
362 l.d $f22, SC_FPREGS+1*REGSZ_FP(a0)
363 l.d $f24, SC_FPREGS+2*REGSZ_FP(a0)
364 l.d $f26, SC_FPREGS+3*REGSZ_FP(a0)
365 l.d $f28, SC_FPREGS+4*REGSZ_FP(a0)
366 l.d $f30, SC_FPREGS+5*REGSZ_FP(a0)
367#endif
Raghu Gandham405b8022012-07-25 18:16:42 -0700368
Nikola Veljkovic1b519c02015-10-06 18:39:49 +0200369 # check cookie
370 PTR_SUBU sp, FRAMESZ
371 REG_S v1, GPOFF(sp)
372 REG_S ra, RAOFF(sp)
373 REG_S a1, A1OFF(sp)
374 move a0, t0
375 jal __bionic_setjmp_cookie_check
376 REG_L gp, GPOFF(sp)
377 REG_L ra, RAOFF(sp)
378 REG_L a1, A1OFF(sp)
379 PTR_ADDU sp, FRAMESZ
380
381 sltiu t0, a1, 1 # never return 0!
382 xor v0, a1, t0
383 j ra # return to setjmp call site
Elliott Hughesd27ae2f2014-12-08 17:01:11 -0800384END(siglongjmp)
Duane Sandb6d301f2015-01-26 14:48:48 -0800385
Christopher Ferris24958512015-03-25 09:12:00 -0700386ALIAS_SYMBOL(longjmp, siglongjmp)
387ALIAS_SYMBOL(_longjmp, siglongjmp)