xref: /csrg-svn/lib/libc/tahoe/gen/_setjmp.s (revision 34824)
1/*
2 * Copyright (c) 1988 Regents of the University of California.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms are permitted
6 * provided that the above copyright notice and this paragraph are
7 * duplicated in all such forms and that any documentation,
8 * advertising materials, and other materials related to such
9 * distribution and use acknowledge that the software was developed
10 * by the University of California, Berkeley.  The name of the
11 * University may not be used to endorse or promote products derived
12 * from this software without specific prior written permission.
13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16 *
17 * This code is derived from software contributed to Berkeley by
18 * Computer Consoles Inc.
19 */
20
21#if defined(LIBC_SCCS) && !defined(lint)
22	.asciz "@(#)_setjmp.s	1.3 (Berkeley) 06/27/88"
23#endif /* LIBC_SCCS and not lint */
24
25/*
26 * C library -- _setjmp, _longjmp
27 *
28 *	_longjmp(a,v)
29 * will generate a "return(v)" from
30 * the last call to
31 *	_setjmp(a)
32 * by restoring registers from the stack,
33 * The previous signal state is NOT restored.
34 */
35
36#include "DEFS.h"
37
38ENTRY(_setjmp, 0)
39	movl	4(fp),r0
40	movl	(fp),(r0)		# save frame pointer of caller
41	movl	-8(fp),4(r0)		# save pc of caller
42	clrl	r0
43	ret
44
45ENTRY(_longjmp, 0)
46	movl	8(fp),r0		# return(v)
47	movl	4(fp),r1		# fetch buffer
48	tstl	(r1)
49	beql	botch
50loop:
51	cmpl	(r1),(fp)
52	beql	done
53	blssu	botch
54	movl	$loop,-8(fp)
55	ret				# pop another frame
56
57done:
58	cmpb	*-8(fp),reiins		# returning to an "rei"?
59	bneq	1f
60	movab	3f,-8(fp)		# do return w/ psl-pc pop
61	brw	2f
621:
63	movab	4f,-8(fp)		# do standard return
642:
65	ret				# unwind stack before signals enabled
663:
67	addl2	$8,sp			# compensate for PSL-PC push
684:
69	jmp	*4(r1)			# done, return....
70
71botch:
72	callf	$4,_longjmperror
73	halt
74
75	.data
76reiins:	rei
77