xref: /netbsd-src/lib/libc/arch/powerpc/gen/__setjmp14.S (revision ea952cb848ce3fe813ba15ed123efa5019ce2f7f)
1*ea952cb8Sskrll/*	$NetBSD: __setjmp14.S,v 1.6 2023/10/11 09:12:21 skrll Exp $	*/
2b09fbb02Smatt
3cf88c389Smatt#include "SYS.h"
4cf88c389Smatt#include "assym.h"
5b09fbb02Smatt
6b09fbb02Smatt#if defined(LIBC_SCCS)
7*ea952cb8Sskrll__RCSID("$NetBSD: __setjmp14.S,v 1.6 2023/10/11 09:12:21 skrll 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(__setjmp14)
21b09fbb02Smatt	mr	%r6,%r3
22*ea952cb8Sskrll	li	%r3,0			# how is ignored
23*ea952cb8Sskrll	li	%r4,0			# set = NULL
24cf88c389Smatt	addi	%r5,%r6,4*(1+24)	# &sigmask
25cf88c389Smatt	_DOSYSCALL(__sigprocmask14)	# assume no error	XXX
26b09fbb02Smatt	mflr	%r11
27b09fbb02Smatt	mfcr	%r12
28b09fbb02Smatt	mr	%r10,%r1
29b09fbb02Smatt	mr	%r9,%r2
30b09fbb02Smatt	stmw	%r8,4(%r6)		# save r8-r31
31b09fbb02Smatt	li	%r3,0
32b09fbb02Smatt	blr
33cf88c389SmattEND(__setjmp14)
34b09fbb02Smatt
35b09fbb02SmattENTRY(__longjmp14)
36b09fbb02Smatt	lmw	%r8,4(%r3)		# load r8-r31
37b09fbb02Smatt	mr	%r6,%r4
38b09fbb02Smatt	mtlr	%r11
39b09fbb02Smatt	mtcr	%r12
40b09fbb02Smatt	mr	%r2,%r9
41b09fbb02Smatt	mr	%r1,%r10
42cf88c389Smatt	addi	%r4,%r3,4*(1+24)	# &sigmask
43cf88c389Smatt	li	%r3,SIG_SETMASK
44b09fbb02Smatt	li	%r5,0
45cf88c389Smatt	_DOSYSCALL(__sigprocmask14)	# assume no error	XXX
46b09fbb02Smatt	or.	%r3,%r6,%r6
47b09fbb02Smatt	bnelr
48b09fbb02Smatt	li	%r3,1
49b09fbb02Smatt	blr
50cf88c389SmattEND(__longjmp14)
51