xref: /original-bsd/lib/libc/tahoe/gen/_setjmp.s (revision de0f5fa5)
1/*
2 * Copyright (c) 1988, 1993
3 *	The Regents of the University of California.  All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Computer Consoles Inc.
7 *
8 * %sccs.include.redist.c%
9 */
10
11#if defined(LIBC_SCCS) && !defined(lint)
12	.asciz "@(#)_setjmp.s	8.1 (Berkeley) 06/04/93"
13#endif /* LIBC_SCCS and not lint */
14
15/*
16 * C library -- _setjmp, _longjmp
17 *
18 *	_longjmp(a,v)
19 * will generate a "return(v)" from
20 * the last call to
21 *	_setjmp(a)
22 * by restoring registers from the stack,
23 * The previous signal state is NOT restored.
24 */
25
26#include "DEFS.h"
27
28ENTRY(_setjmp, 0)
29	movl	4(fp),r0
30	movl	(fp),(r0)		# save frame pointer of caller
31	movl	-8(fp),4(r0)		# save pc of caller
32	clrl	r0
33	ret
34
35ENTRY(_longjmp, 0)
36	movl	8(fp),r0		# return(v)
37	movl	4(fp),r1		# fetch buffer
38	tstl	(r1)
39	beql	botch
40loop:
41	cmpl	(r1),(fp)
42	beql	done
43	blssu	botch
44	movl	$loop,-8(fp)
45	ret				# pop another frame
46
47done:
48	cmpb	*-8(fp),reiins		# returning to an "rei"?
49	bneq	1f
50	movab	3f,-8(fp)		# do return w/ psl-pc pop
51	brw	2f
521:
53	movab	4f,-8(fp)		# do standard return
542:
55	ret				# unwind stack before signals enabled
563:
57	addl2	$8,sp			# compensate for PSL-PC push
584:
59	jmp	*4(r1)			# done, return....
60
61botch:
62	callf	$4,_longjmperror
63	halt
64
65	.data
66reiins:	rei
67