xref: /titanic_51/usr/src/boot/lib/libstand/mips/_setjmp.S (revision 4a5d661a82b942b6538acd26209d959ce98b593a)
1*4a5d661aSToomas Soome/*-
2*4a5d661aSToomas Soome * Copyright (c) 1991, 1993
3*4a5d661aSToomas Soome *	The Regents of the University of California.  All rights reserved.
4*4a5d661aSToomas Soome *
5*4a5d661aSToomas Soome * This code is derived from software contributed to Berkeley by
6*4a5d661aSToomas Soome * Ralph Campbell.
7*4a5d661aSToomas Soome *
8*4a5d661aSToomas Soome * Redistribution and use in source and binary forms, with or without
9*4a5d661aSToomas Soome * modification, are permitted provided that the following conditions
10*4a5d661aSToomas Soome * are met:
11*4a5d661aSToomas Soome * 1. Redistributions of source code must retain the above copyright
12*4a5d661aSToomas Soome *    notice, this list of conditions and the following disclaimer.
13*4a5d661aSToomas Soome * 2. Redistributions in binary form must reproduce the above copyright
14*4a5d661aSToomas Soome *    notice, this list of conditions and the following disclaimer in the
15*4a5d661aSToomas Soome *    documentation and/or other materials provided with the distribution.
16*4a5d661aSToomas Soome * 3. All advertising materials mentioning features or use of this software
17*4a5d661aSToomas Soome *    must display the following acknowledgement:
18*4a5d661aSToomas Soome *	This product includes software developed by the University of
19*4a5d661aSToomas Soome *	California, Berkeley and its contributors.
20*4a5d661aSToomas Soome * 4. Neither the name of the University nor the names of its contributors
21*4a5d661aSToomas Soome *    may be used to endorse or promote products derived from this software
22*4a5d661aSToomas Soome *    without specific prior written permission.
23*4a5d661aSToomas Soome *
24*4a5d661aSToomas Soome * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25*4a5d661aSToomas Soome * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26*4a5d661aSToomas Soome * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27*4a5d661aSToomas Soome * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28*4a5d661aSToomas Soome * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29*4a5d661aSToomas Soome * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30*4a5d661aSToomas Soome * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31*4a5d661aSToomas Soome * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32*4a5d661aSToomas Soome * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33*4a5d661aSToomas Soome * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34*4a5d661aSToomas Soome * SUCH DAMAGE.
35*4a5d661aSToomas Soome *
36*4a5d661aSToomas Soome * $FreeBSD$
37*4a5d661aSToomas Soome */
38*4a5d661aSToomas Soome
39*4a5d661aSToomas Soome#include <machine/regnum.h>
40*4a5d661aSToomas Soome#include <machine/asm.h>
41*4a5d661aSToomas Soome
42*4a5d661aSToomas Soome#if 0
43*4a5d661aSToomas Soome#if defined(LIBC_SCCS)
44*4a5d661aSToomas Soome	.text
45*4a5d661aSToomas Soome	.asciz "$OpenBSD: _setjmp.S,v 1.6 1996/09/23 21:27:53 imp Exp $"
46*4a5d661aSToomas Soome#endif /* LIBC_SCCS */
47*4a5d661aSToomas Soome#endif
48*4a5d661aSToomas Soome
49*4a5d661aSToomas Soome/*
50*4a5d661aSToomas Soome * C library -- _setjmp, _longjmp
51*4a5d661aSToomas Soome *
52*4a5d661aSToomas Soome *	_longjmp(a,v)
53*4a5d661aSToomas Soome * will generate a "return(v)" from
54*4a5d661aSToomas Soome * the last call to
55*4a5d661aSToomas Soome *	_setjmp(a)
56*4a5d661aSToomas Soome * by restoring registers from the stack,
57*4a5d661aSToomas Soome * The previous signal state is NOT restored.
58*4a5d661aSToomas Soome */
59*4a5d661aSToomas Soome
60*4a5d661aSToomas SoomeLEAF(_setjmp)
61*4a5d661aSToomas Soome	.set	noreorder
62*4a5d661aSToomas Soome	REG_LI	v0, 0xACEDBADE			# sigcontext magic number
63*4a5d661aSToomas Soome	REG_S	ra, (2 * SZREG)(a0)		# sc_pc = return address
64*4a5d661aSToomas Soome	REG_S	v0, (3 * SZREG)(a0)		#   saved in sc_regs[0]
65*4a5d661aSToomas Soome	REG_S	s0, ((S0 + 3) * SZREG)(a0)
66*4a5d661aSToomas Soome	REG_S	s1, ((S1 + 3) * SZREG)(a0)
67*4a5d661aSToomas Soome	REG_S	s2, ((S2 + 3) * SZREG)(a0)
68*4a5d661aSToomas Soome	REG_S	s3, ((S3 + 3) * SZREG)(a0)
69*4a5d661aSToomas Soome	REG_S	s4, ((S4 + 3) * SZREG)(a0)
70*4a5d661aSToomas Soome	REG_S	s5, ((S5 + 3) * SZREG)(a0)
71*4a5d661aSToomas Soome	REG_S	s6, ((S6 + 3) * SZREG)(a0)
72*4a5d661aSToomas Soome	REG_S	s7, ((S7 + 3) * SZREG)(a0)
73*4a5d661aSToomas Soome	REG_S	sp, ((SP + 3) * SZREG)(a0)
74*4a5d661aSToomas Soome	REG_S	s8, ((S8 + 3) * SZREG)(a0)
75*4a5d661aSToomas Soome	j	ra
76*4a5d661aSToomas Soome	move	v0, zero
77*4a5d661aSToomas SoomeEND(_setjmp)
78*4a5d661aSToomas Soome
79*4a5d661aSToomas SoomeLEAF(_longjmp)
80*4a5d661aSToomas Soome#ifdef ABICALLS
81*4a5d661aSToomas Soome	subu	sp, sp, 32
82*4a5d661aSToomas Soome	.cprestore 16
83*4a5d661aSToomas Soome#endif
84*4a5d661aSToomas Soome	.set    noreorder
85*4a5d661aSToomas Soome	REG_L	v0, (3 * SZREG)(a0)		# get magic number
86*4a5d661aSToomas Soome	REG_L	ra, (2 * SZREG)(a0)
87*4a5d661aSToomas Soome	bne	v0, 0xACEDBADE, botch		# jump if error
88*4a5d661aSToomas Soome
89*4a5d661aSToomas Soome	addu	sp, sp, 32			# does not matter, sanity
90*4a5d661aSToomas Soome	REG_L	s0, ((S0 + 3) * SZREG)(a0)
91*4a5d661aSToomas Soome	REG_L	s1, ((S1 + 3) * SZREG)(a0)
92*4a5d661aSToomas Soome	REG_L	s2, ((S2 + 3) * SZREG)(a0)
93*4a5d661aSToomas Soome	REG_L	s3, ((S3 + 3) * SZREG)(a0)
94*4a5d661aSToomas Soome	REG_L	s4, ((S4 + 3) * SZREG)(a0)
95*4a5d661aSToomas Soome	REG_L	s5, ((S5 + 3) * SZREG)(a0)
96*4a5d661aSToomas Soome	REG_L	s6, ((S6 + 3) * SZREG)(a0)
97*4a5d661aSToomas Soome	REG_L	s7, ((S7 + 3) * SZREG)(a0)
98*4a5d661aSToomas Soome	REG_L	sp, ((SP + 3) * SZREG)(a0)
99*4a5d661aSToomas Soome	REG_L	s8, ((S8 + 3) * SZREG)(a0)
100*4a5d661aSToomas Soome
101*4a5d661aSToomas Soome	j	ra
102*4a5d661aSToomas Soome	move	v0, a1
103*4a5d661aSToomas Soomebotch:
104*4a5d661aSToomas Soome	jal	_C_LABEL(longjmperror)
105*4a5d661aSToomas Soome	nop
106*4a5d661aSToomas Soome	jal	_C_LABEL(abort)
107*4a5d661aSToomas Soome	nop
108*4a5d661aSToomas SoomeEND(_longjmp)
109