_setjmp.S revision 1.8 1 1.8 jonathan /* $NetBSD: _setjmp.S,v 1.8 1997/07/07 00:13:56 jonathan Exp $ */
2 1.5 jonathan
3 1.1 glass /*-
4 1.1 glass * Copyright (c) 1991, 1993
5 1.1 glass * The Regents of the University of California. All rights reserved.
6 1.1 glass *
7 1.1 glass * This code is derived from software contributed to Berkeley by
8 1.1 glass * Ralph Campbell.
9 1.1 glass *
10 1.1 glass * Redistribution and use in source and binary forms, with or without
11 1.1 glass * modification, are permitted provided that the following conditions
12 1.1 glass * are met:
13 1.1 glass * 1. Redistributions of source code must retain the above copyright
14 1.1 glass * notice, this list of conditions and the following disclaimer.
15 1.1 glass * 2. Redistributions in binary form must reproduce the above copyright
16 1.1 glass * notice, this list of conditions and the following disclaimer in the
17 1.1 glass * documentation and/or other materials provided with the distribution.
18 1.1 glass * 3. All advertising materials mentioning features or use of this software
19 1.1 glass * must display the following acknowledgement:
20 1.1 glass * This product includes software developed by the University of
21 1.1 glass * California, Berkeley and its contributors.
22 1.1 glass * 4. Neither the name of the University nor the names of its contributors
23 1.1 glass * may be used to endorse or promote products derived from this software
24 1.1 glass * without specific prior written permission.
25 1.1 glass *
26 1.1 glass * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
27 1.1 glass * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 1.1 glass * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29 1.1 glass * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
30 1.1 glass * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31 1.1 glass * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32 1.1 glass * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33 1.1 glass * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34 1.1 glass * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35 1.1 glass * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 1.1 glass * SUCH DAMAGE.
37 1.1 glass */
38 1.1 glass
39 1.6 jonathan #include <mips/regnum.h>
40 1.6 jonathan #include <mips/asm.h>
41 1.1 glass
42 1.1 glass #if defined(LIBC_SCCS) && !defined(lint)
43 1.1 glass ASMSTR("from: @(#)_setjmp.s 8.1 (Berkeley) 6/4/93")
44 1.8 jonathan ASMSTR("$NetBSD: _setjmp.S,v 1.8 1997/07/07 00:13:56 jonathan Exp $")
45 1.1 glass #endif /* LIBC_SCCS and not lint */
46 1.1 glass
47 1.6 jonathan #ifdef ABICALLS
48 1.6 jonathan .abicalls
49 1.6 jonathan #endif
50 1.6 jonathan
51 1.1 glass /*
52 1.1 glass * C library -- _setjmp, _longjmp
53 1.1 glass *
54 1.1 glass * _longjmp(a,v)
55 1.1 glass * will generate a "return(v)" from
56 1.1 glass * the last call to
57 1.1 glass * _setjmp(a)
58 1.1 glass * by restoring registers from the stack,
59 1.1 glass * The previous signal state is NOT restored.
60 1.1 glass */
61 1.1 glass
62 1.1 glass .set noreorder
63 1.1 glass
64 1.3 mycroft LEAF(_setjmp)
65 1.6 jonathan #ifdef ABICALLS
66 1.8 jonathan #.set noreorder
67 1.6 jonathan .cpload t9
68 1.8 jonathan #.set reorder
69 1.7 jonathan #endif
70 1.7 jonathan
71 1.1 glass li v0, 0xACEDBADE # sigcontext magic number
72 1.1 glass sw ra, (2 * 4)(a0) # sc_pc = return address
73 1.1 glass sw v0, (3 * 4)(a0) # saved in sc_regs[0]
74 1.1 glass sw s0, ((S0 + 3) * 4)(a0)
75 1.1 glass sw s1, ((S1 + 3) * 4)(a0)
76 1.1 glass sw s2, ((S2 + 3) * 4)(a0)
77 1.1 glass sw s3, ((S3 + 3) * 4)(a0)
78 1.1 glass sw s4, ((S4 + 3) * 4)(a0)
79 1.1 glass sw s5, ((S5 + 3) * 4)(a0)
80 1.1 glass sw s6, ((S6 + 3) * 4)(a0)
81 1.1 glass sw s7, ((S7 + 3) * 4)(a0)
82 1.1 glass sw sp, ((SP + 3) * 4)(a0)
83 1.1 glass sw s8, ((S8 + 3) * 4)(a0)
84 1.1 glass cfc1 v0, $31 # too bad cant check if FP used
85 1.1 glass swc1 $f20, ((20 + 38) * 4)(a0)
86 1.1 glass swc1 $f21, ((21 + 38) * 4)(a0)
87 1.1 glass swc1 $f22, ((22 + 38) * 4)(a0)
88 1.1 glass swc1 $f23, ((23 + 38) * 4)(a0)
89 1.1 glass swc1 $f24, ((24 + 38) * 4)(a0)
90 1.1 glass swc1 $f25, ((25 + 38) * 4)(a0)
91 1.1 glass swc1 $f26, ((26 + 38) * 4)(a0)
92 1.1 glass swc1 $f27, ((27 + 38) * 4)(a0)
93 1.1 glass swc1 $f28, ((28 + 38) * 4)(a0)
94 1.1 glass swc1 $f29, ((29 + 38) * 4)(a0)
95 1.1 glass swc1 $f30, ((30 + 38) * 4)(a0)
96 1.1 glass swc1 $f31, ((31 + 38) * 4)(a0)
97 1.1 glass sw v0, ((32 + 38) * 4)(a0)
98 1.1 glass j ra
99 1.1 glass move v0, zero
100 1.3 mycroft END(_setjmp)
101 1.1 glass
102 1.3 mycroft LEAF(_longjmp)
103 1.6 jonathan #ifdef ABICALLS
104 1.6 jonathan .set noreorder
105 1.6 jonathan .cpload t9
106 1.6 jonathan .set reorder
107 1.6 jonathan subu sp, sp, 32
108 1.6 jonathan .cprestore 16
109 1.6 jonathan .set noreorder
110 1.6 jonathan #endif
111 1.1 glass lw v0, (3 * 4)(a0) # get magic number
112 1.1 glass lw ra, (2 * 4)(a0)
113 1.1 glass bne v0, 0xACEDBADE, botch # jump if error
114 1.6 jonathan
115 1.6 jonathan addu sp, sp, 32 # don't matter, sanity
116 1.1 glass lw s0, ((S0 + 3) * 4)(a0)
117 1.1 glass lw s1, ((S1 + 3) * 4)(a0)
118 1.1 glass lw s2, ((S2 + 3) * 4)(a0)
119 1.1 glass lw s3, ((S3 + 3) * 4)(a0)
120 1.1 glass lw s4, ((S4 + 3) * 4)(a0)
121 1.1 glass lw s5, ((S5 + 3) * 4)(a0)
122 1.1 glass lw s6, ((S6 + 3) * 4)(a0)
123 1.1 glass lw s7, ((S7 + 3) * 4)(a0)
124 1.1 glass lw v0, ((32 + 38) * 4)(a0) # get fpu status
125 1.1 glass lw sp, ((SP + 3) * 4)(a0)
126 1.1 glass lw s8, ((S8 + 3) * 4)(a0)
127 1.1 glass ctc1 v0, $31
128 1.1 glass lwc1 $f20, ((20 + 38) * 4)(a0)
129 1.1 glass lwc1 $f21, ((21 + 38) * 4)(a0)
130 1.1 glass lwc1 $f22, ((22 + 38) * 4)(a0)
131 1.1 glass lwc1 $f23, ((23 + 38) * 4)(a0)
132 1.1 glass lwc1 $f24, ((24 + 38) * 4)(a0)
133 1.1 glass lwc1 $f25, ((25 + 38) * 4)(a0)
134 1.1 glass lwc1 $f26, ((26 + 38) * 4)(a0)
135 1.1 glass lwc1 $f27, ((27 + 38) * 4)(a0)
136 1.1 glass lwc1 $f28, ((28 + 38) * 4)(a0)
137 1.1 glass lwc1 $f29, ((29 + 38) * 4)(a0)
138 1.1 glass lwc1 $f30, ((30 + 38) * 4)(a0)
139 1.1 glass lwc1 $f31, ((31 + 38) * 4)(a0)
140 1.6 jonathan
141 1.1 glass j ra
142 1.1 glass move v0, a1
143 1.1 glass botch:
144 1.3 mycroft jal _C_LABEL(longjmperror)
145 1.1 glass nop
146 1.3 mycroft jal _C_LABEL(abort)
147 1.1 glass nop
148 1.3 mycroft END(_longjmp)
149