1405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham/*      $OpenBSD: setjmp.S,v 1.5 2005/08/07 16:40:15 espie Exp $ */
2405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham
3405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham/*
4405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * Copyright (c) 2001-2002 Opsycon AB  (www.opsycon.se / www.opsycon.com)
5405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham *
6405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * Redistribution and use in source and binary forms, with or without
7405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * modification, are permitted provided that the following conditions
8405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * are met:
9405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * 1. Redistributions of source code must retain the above copyright
10405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham *    notice, this list of conditions and the following disclaimer.
11405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * 2. Redistributions in binary form must reproduce the above copyright
12405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham *    notice, this list of conditions and the following disclaimer in the
13405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham *    documentation and/or other materials provided with the distribution.
14405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * 3. Neither the name of Opsycon AB nor the names of its contributors
15405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham *    may be used to endorse or promote products derived from this software
16405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham *    without specific prior written permission.
17405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham *
18405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
19405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
22405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * SUCH DAMAGE.
29405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham *
30405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham */
31405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham
32851e68a2402fa414544e66650e09dfdaac813e51Elliott Hughes#include <private/bionic_asm.h>
33405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham#include <machine/regnum.h>
34c1b44ecc5385e68e81667068e03b32c2084a85b1David 'Digit' Turner#include <machine/signal.h>
35405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham
36405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham/*
37405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * setjmp, longjmp implementation for libc. this code depends
38405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * on the layout of the struct sigcontext in machine/signal.h.
39405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham *
40405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham */
41405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham
42405b8029a6888f386adf3512113a33546141d1c8Raghu GandhamFRAMESZ= MKFSIZ(2,6)
43405b8029a6888f386adf3512113a33546141d1c8Raghu GandhamA1OFF= FRAMESZ-4*REGSZ
44405b8029a6888f386adf3512113a33546141d1c8Raghu GandhamA0OFF= FRAMESZ-3*REGSZ
45405b8029a6888f386adf3512113a33546141d1c8Raghu GandhamGPOFF= FRAMESZ-2*REGSZ
46405b8029a6888f386adf3512113a33546141d1c8Raghu GandhamRAOFF= FRAMESZ-1*REGSZ
47405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham
48405b8029a6888f386adf3512113a33546141d1c8Raghu GandhamNON_LEAF(setjmp, FRAMESZ, ra)
49405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	.mask	0x80000000, RAOFF
50405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	PTR_SUBU sp, FRAMESZ			# allocate stack frame
51405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	SETUP_GP64(GPOFF, setjmp)
52405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	SAVE_GP(GPOFF)
53405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	.set	reorder
54405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	REG_S	ra, RAOFF(sp)			# save state
55405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	REG_S	a0, A0OFF(sp)
56405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham
57405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	move	a0, zero			# get current signal mask
58405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	jal	sigblock
59405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham
60405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	REG_L	v1, A0OFF(sp)			# v1 = jmpbuf
61405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	REG_S	v0, SC_MASK(v1)			# save sc_mask = sigblock(0)
62405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham
63405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	REG_L	a0, A0OFF(sp)			# restore jmpbuf
64405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	REG_L	ra, RAOFF(sp)
65405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	REG_S	ra, SC_PC(a0)			# sc_pc = return address
66405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham#if defined(__mips64)
67405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	dli	v0, 0xACEDBADE			# sigcontext magic number
68405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham#else
69405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	li	v0, 0xACEDBADE			# sigcontext magic number
70405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham#endif
71405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	REG_S	v0, SC_REGS+ZERO*REGSZ(a0)
72405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	REG_S	s0, SC_REGS+S0*REGSZ(a0)
73405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	REG_S	s1, SC_REGS+S1*REGSZ(a0)
74405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	REG_S	s2, SC_REGS+S2*REGSZ(a0)
75405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	REG_S	s3, SC_REGS+S3*REGSZ(a0)
76405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	REG_S	s4, SC_REGS+S4*REGSZ(a0)
77405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	REG_S	s5, SC_REGS+S5*REGSZ(a0)
78405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	REG_S	s6, SC_REGS+S6*REGSZ(a0)
79405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	REG_S	s7, SC_REGS+S7*REGSZ(a0)
80405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	REG_S	s8, SC_REGS+S8*REGSZ(a0)
81405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	REG_L	v0, GPOFF(sp)
82405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	REG_S	v0, SC_REGS+GP*REGSZ(a0)
83405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	PTR_ADDU v0, sp, FRAMESZ
84405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	REG_S	v0, SC_REGS+SP*REGSZ(a0)
85405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham
86405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham#if !defined(SOFTFLOAT)
87405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	li	v0, 1				# be nice if we could tell
88405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	REG_S	v0, SC_FPUSED(a0)		# sc_fpused = 1
89405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	cfc1	v0, $31
90c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand	s.d	$f20, SC_FPREGS+((F20-F0)*REGSZ_FP)(a0)
91c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand	s.d	$f22, SC_FPREGS+((F22-F0)*REGSZ_FP)(a0)
92c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand	s.d	$f24, SC_FPREGS+((F24-F0)*REGSZ_FP)(a0)
93c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand	s.d	$f26, SC_FPREGS+((F26-F0)*REGSZ_FP)(a0)
94c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand	s.d	$f28, SC_FPREGS+((F28-F0)*REGSZ_FP)(a0)
95c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand	s.d	$f30, SC_FPREGS+((F30-F0)*REGSZ_FP)(a0)
96405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham#if _MIPS_FPSET == 32
97c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand	s.d	$f21, SC_FPREGS+((F21-F0)*REGSZ_FP)(a0)
98c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand	s.d	$f23, SC_FPREGS+((F23-F0)*REGSZ_FP)(a0)
99c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand	s.d	$f25, SC_FPREGS+((F25-F0)*REGSZ_FP)(a0)
100c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand	s.d	$f27, SC_FPREGS+((F27-F0)*REGSZ_FP)(a0)
101c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand	s.d	$f29, SC_FPREGS+((F29-F0)*REGSZ_FP)(a0)
102c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand	s.d	$f31, SC_FPREGS+((F31-F0)*REGSZ_FP)(a0)
103405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham#endif
104405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	REG_S	v0, SC_FPREGS+((FSR-F0)*REGSZ)(a0)
105405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham#endif /* !SOFTFLOAT */
106405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	move	v0, zero
107405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	RESTORE_GP64
108405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	PTR_ADDU sp, FRAMESZ
109405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	j	ra
110405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham
111405b8029a6888f386adf3512113a33546141d1c8Raghu Gandhambotch:
112405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	jal	longjmperror
113405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	jal	abort
114405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	RESTORE_GP64
115405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	PTR_ADDU sp, FRAMESZ
116405b8029a6888f386adf3512113a33546141d1c8Raghu GandhamEND(setjmp)
117405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham
118405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham
119405b8029a6888f386adf3512113a33546141d1c8Raghu GandhamLEAF(longjmp, FRAMESZ)
120405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	PTR_SUBU sp, FRAMESZ
121405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	SETUP_GP64(GPOFF, longjmp)
122405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	SAVE_GP(GPOFF)
123405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	.set	reorder
124405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	sw	a1, A1OFF(sp)
125405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	sw	a0, A0OFF(sp)
126405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham
127405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	lw	a0, SC_MASK(a0)
128405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	jal	sigsetmask
129405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham
130405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	lw	a0, A0OFF(sp)
131405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	lw	a1, A1OFF(sp)
132405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham
133851e68a2402fa414544e66650e09dfdaac813e51Elliott Hughes	.set	noreorder
134405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	REG_L	v0, SC_REGS+ZERO*REGSZ(a0)
135405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	bne	v0, 0xACEDBADE, botch		# jump if error
136405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	REG_L	ra, SC_PC(a0)
137405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	REG_L	s0, SC_REGS+S0*REGSZ(a0)
138405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	REG_L	s1, SC_REGS+S1*REGSZ(a0)
139405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	REG_L	s2, SC_REGS+S2*REGSZ(a0)
140405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	REG_L	s3, SC_REGS+S3*REGSZ(a0)
141405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	REG_L	s4, SC_REGS+S4*REGSZ(a0)
142405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	REG_L	s5, SC_REGS+S5*REGSZ(a0)
143405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	REG_L	s6, SC_REGS+S6*REGSZ(a0)
144405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	REG_L	s7, SC_REGS+S7*REGSZ(a0)
145405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	REG_L	s8, SC_REGS+S8*REGSZ(a0)
146405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	REG_L	gp, SC_REGS+GP*REGSZ(a0)
147405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	REG_L	sp, SC_REGS+SP*REGSZ(a0)
148851e68a2402fa414544e66650e09dfdaac813e51Elliott Hughes
149405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham#if !defined(SOFTFLOAT)
150851e68a2402fa414544e66650e09dfdaac813e51Elliott Hughes	REG_L	v0, SC_FPREGS+((FSR-F0)*REGSZ)(a0)
151405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	ctc1	v0, $31
152c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand	l.d	$f20, SC_FPREGS+((F20-F0)*REGSZ_FP)(a0)
153c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand	l.d	$f22, SC_FPREGS+((F22-F0)*REGSZ_FP)(a0)
154c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand	l.d	$f24, SC_FPREGS+((F24-F0)*REGSZ_FP)(a0)
155c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand	l.d	$f26, SC_FPREGS+((F26-F0)*REGSZ_FP)(a0)
156c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand	l.d	$f28, SC_FPREGS+((F28-F0)*REGSZ_FP)(a0)
157c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand	l.d	$f30, SC_FPREGS+((F30-F0)*REGSZ_FP)(a0)
158405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham#if _MIPS_FPSET == 32
159c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand	l.d	$f21, SC_FPREGS+((F21-F0)*REGSZ_FP)(a0)
160c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand	l.d	$f23, SC_FPREGS+((F23-F0)*REGSZ_FP)(a0)
161c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand	l.d	$f25, SC_FPREGS+((F25-F0)*REGSZ_FP)(a0)
162c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand	l.d	$f27, SC_FPREGS+((F27-F0)*REGSZ_FP)(a0)
163c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand	l.d	$f29, SC_FPREGS+((F29-F0)*REGSZ_FP)(a0)
164c86950cb3f50ead0c9a9d0366b870d6c6e1b91c8Duane Sand	l.d	$f31, SC_FPREGS+((F31-F0)*REGSZ_FP)(a0)
165405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham#endif
166405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham#endif /* !SOFTFLOAT */
167405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	bne	a1, zero, 1f
168405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	 nop
169405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	li	a1, 1			# never return 0!
170405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham1:
171405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	j	ra
172405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	 move	v0, a1
173405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham
174405b8029a6888f386adf3512113a33546141d1c8Raghu GandhamEND(longjmp)
175