xref: /original-bsd/lib/libc/tahoe/gen/_setjmp.s (revision 8f26171a)
1#ifdef LIBC_SCCS
2	.asciz	"@(#)_setjmp.s	1.1 (Berkeley/CCI) 08/01/86"
3#endif LIBC_SCCS
4
5/*
6 * C library -- _setjmp, _longjmp
7 *
8 *	_longjmp(a,v)
9 * will generate a "return(v)" from
10 * the last call to
11 *	_setjmp(a)
12 * by restoring registers from the stack,
13 * The previous signal state is NOT restored.
14 */
15
16#include "DEFS.h"
17
18ENTRY(_setjmp, 0)
19	movl	4(fp),r0
20	movl	(fp),(r0)		# save frame pointer of caller
21	movl	-8(fp),4(r0)		# save pc of caller
22	clrl	r0
23	ret
24
25ENTRY(_longjmp, 0)
26	movl	8(fp),r0		# return(v)
27	movl	4(fp),r1		# fetch buffer
28	tstl	(r1)
29	beql	botch
30loop:
31	cmpl	(r1),(fp)
32	beql	done
33	blssu	botch
34	movl	$loop,-8(fp)
35	ret				# pop another frame
36
37done:
38	cmpb	*-8(fp),reiins		# returning to an "rei"?
39	bneq	1f
40	movab	3f,-8(fp)		# do return w/ psl-pc pop
41	brw	2f
421:
43	movab	4f,-8(fp)		# do standard return
442:
45	ret				# unwind stack before signals enabled
463:
47	addl2	$8,sp			# compensate for PSL-PC push
484:
49	jmp	*4(r1)			# done, return....
50
51botch:
52	callf	$4,_longjmperror
53	halt
54
55	.data
56reiins:	rei
57