xref: /netbsd/lib/libc/arch/vax/gen/_setjmp.S (revision bf9ec67e)
1/*
2 * Copyright (c) 1980, 1993
3 *	The Regents of the University of California.  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 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 *    must display the following acknowledgement:
15 *	This product includes software developed by the University of
16 *	California, Berkeley and its contributors.
17 * 4. Neither the name of the University nor the names of its contributors
18 *    may be used to endorse or promote products derived from this software
19 *    without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 */
33
34#if defined(LIBC_SCCS) && !defined(lint)
35	/* .asciz "@(#)_setjmp.s	8.1 (Berkeley) 6/4/93" */
36	.asciz "$NetBSD: _setjmp.S,v 1.8 2002/03/30 04:58:36 matt Exp $"
37#endif /* LIBC_SCCS and not lint */
38
39/*
40 * C library -- _setjmp, _longjmp
41 *
42 *	_longjmp(a,v)
43 * will generate a "return(v)" from
44 * the last call to
45 *	_setjmp(a)
46 * by restoring registers from the stack,
47 * The previous signal state is NOT restored.
48 *
49 * Even though we don't use sigreturn14, we still store things in a sigcontext
50 * in order to be consistent.
51 */
52
53#include "DEFS.h"
54
55ENTRY(_setjmp, R6)
56	movl	4(%ap),%r0
57	movl	12(%fp),12(%r0)		# save frame pointer of caller
58	movl	16(%fp),20(%r0)		# save pc of caller
59#ifdef __ELF__
60	movl	8(%fp),16(%r0)		# save ap of caller
61	clrl	%r1			# clear arg count
62	bbc	$13,6(%fp),1f		# was this a callg?
63	addl3	$1,(%ap),%r1		# get real arg count+1 for calls
641:	moval	24(%fp)[%r1],8(%r0)	# save sp of caller
65	movpsl	24(%r0)			# save current psl
66	movw	4(%fp),24(%r0)		# save psw of caller
67	movq	%r6,44(%r0)		# save r6/r7
68	movq	%r8,52(%r0)		# save r8/r9
69	movq	%r10,60(%r0)		# save r10/r11
70#endif
71	clrl	%r0
72	ret
73
74ENTRY(_longjmp, 0)
75	movl	8(%ap),%r0		# return(v)
76	movl	4(%ap),%r1		# fetch buffer
77	tstl	12(%r1)			# is fp null
78	beql	botch
79#ifdef __ELF__
80	movq	44(%r1),%r6		# restore r6/r7
81	movq	52(%r1),%r8		# restore r8/r9
82	movq	60(%r1),%r10		# restore r10/r11
83	movl	16(%r1),%ap		# restore ap
84	movl	8(%r1),%sp		# restore sp
85	movl	12(%r1),%fp		# restore fp
86	movq	20(%r1),-(%sp)		# save pc/psl to new stack
87	rei				# and go back to saved pc/psl
88#else
89loop:
90	bitw	$1,6(%fp)		# %r0 saved?
91	beql	1f
92	movl	%r0,20(%fp)
93	bitw	$2,6(%fp)		# was %r1 saved?
94	beql	2f
95	movl	%r1,24(%fp)
96	brb	2f
971:
98	bitw	$2,6(%fp)		# was %r1 saved?
99	beql	2f
100	movl	%r1,20(%fp)
1012:
102	cmpl	12(%r1),12(%fp)
103	beql	done
104	blssu	botch
105	movab	loop,16(%fp)
106	ret				# pop another frame
107
108done:
109	cmpb	*16(%fp),$2		# returning to an "rei"?
110	bneq	1f
111	movab	3f,16(%fp)		# do return w/ psl-pc pop
112	brw	2f
1131:
114	movab	4f,16(%fp)		# do standard return
1152:
116	ret				# unwind stack before signals enabled
1173:
118	addl2	$8,%sp			# compensate for PSL-PC push
1194:
120	jmp	*20(%r1)		# done, return....
121#endif /* !__ELF__ */
122
123botch:
124	calls	$0,_C_LABEL(longjmperror)
125	halt
126