xref: /netbsd-src/lib/libc/compat/arch/powerpc/gen/compat_setjmp.S (revision cf88c3890b9a2e310adacd2c695f42a55ca4e79a)
1*cf88c389Smatt/*	$NetBSD: compat_setjmp.S,v 1.2 2011/01/15 07:31:13 matt Exp $	*/
2b09fbb02Smatt
3*cf88c389Smatt#include "SYS.h"
4*cf88c389Smatt#include "assym.h"
5b09fbb02Smatt
6b09fbb02Smatt#if defined(LIBC_SCCS)
7*cf88c389Smatt__RCSID("$NetBSD: compat_setjmp.S,v 1.2 2011/01/15 07:31:13 matt Exp $")
8b09fbb02Smatt#endif
9b09fbb02Smatt
10b09fbb02Smatt/*
11b09fbb02Smatt * C library -- _setjmp, _longjmp
12b09fbb02Smatt *
13b09fbb02Smatt *	longjmp(a,v)
14b09fbb02Smatt * will generate a "return(v?v:1)" from the last call to
15b09fbb02Smatt *	setjmp(a)
16b09fbb02Smatt * by restoring registers from the stack.
17b09fbb02Smatt * The previous signal state is restored.
18b09fbb02Smatt */
19b09fbb02Smatt
20b09fbb02SmattENTRY(setjmp)
21b09fbb02Smatt	mr	%r6,%r3
22*cf88c389Smatt	li	%r3,SIG_BLOCK
23b09fbb02Smatt	li	%r4,0
24*cf88c389Smatt	_DOSYSCALL(compat_13_sigprocmask13) # assume no error	XXX
25b09fbb02Smatt	mflr	%r11
26b09fbb02Smatt	mfcr	%r12
27b09fbb02Smatt	mr	%r10,%r1
28b09fbb02Smatt	mr	%r9,%r2
29b09fbb02Smatt	mr	%r8,%r3
30b09fbb02Smatt	stmw	%r8,4(%r6)
31b09fbb02Smatt	li	%r3,0
32b09fbb02Smatt	blr
33*cf88c389SmattEND(setjmp)
34b09fbb02Smatt
35b09fbb02SmattENTRY(longjmp)
36b09fbb02Smatt	lmw	%r8,4(%r3)
37b09fbb02Smatt	mr	%r6,%r4
38b09fbb02Smatt	mtlr	%r11
39b09fbb02Smatt	mtcr	%r12
40b09fbb02Smatt	mr	%r2,%r9
41b09fbb02Smatt	mr	%r1,%r10
42b09fbb02Smatt	mr	%r4,%r8
43*cf88c389Smatt	li	%r3,SIG_SETMASK
44*cf88c389Smatt	_DOSYSCALL(compat_13_sigprocmask13) # assume no error	XXX
45b09fbb02Smatt	or.	%r3,%r6,%r6
46b09fbb02Smatt	bnelr
47b09fbb02Smatt	li	%r3,1
48b09fbb02Smatt	blr
49*cf88c389SmattEND(longjmp)
50