1/*	$NetBSD: __setjmp14.S,v 1.5 2023/10/11 09:12:21 skrll Exp $	*/
2
3#include "SYS.h"
4
5#if defined(LIBC_SCCS)
6__RCSID("$NetBSD: __setjmp14.S,v 1.5 2023/10/11 09:12:21 skrll Exp $")
7#endif
8
9/*
10 * C library -- _setjmp, _longjmp
11 *
12 *	longjmp(a,v)
13 * will generate a "return(v?v:1)" from the last call to
14 *	setjmp(a)
15 * by restoring registers from the stack.
16 * The previous signal state is restored.
17 */
18
19ENTRY(__setjmp14)
20	mr	%r6,%r3
21	li	%r3,0
22	li	%r4,0
23	addi	%r5,%r6,100		# &sigmask
24	_DOSYSCALL(__sigprocmask14)	# assume no error	XXX
25	mflr	%r11
26	mfcr	%r12
27	mr	%r10,%r1
28	mr	%r9,%r2
29
30	std	%r8,8(%r6)		# save r8-r31
31	std	%r9,16(%r6)
32	std	%r10,24(%r6)
33	std	%r11,32(%r6)
34	std	%r12,40(%r6)
35	std	%r13,48(%r6)
36	std	%r14,56(%r6)
37	std	%r15,64(%r6)
38	std	%r16,72(%r6)
39	std	%r17,80(%r6)
40	std	%r18,88(%r6)
41	std	%r19,96(%r6)
42	std	%r20,104(%r6)
43	std	%r21,112(%r6)
44	std	%r22,120(%r6)
45	std	%r23,128(%r6)
46	std	%r24,136(%r6)
47	std	%r25,144(%r6)
48	std	%r26,152(%r6)
49	std	%r27,160(%r6)
50	std	%r28,168(%r6)
51	std	%r29,176(%r6)
52	std	%r30,184(%r6)
53	std	%r31,192(%r6)
54
55	li	%r3,0
56	blr
57END(__setjmp14)
58
59ENTRY(__longjmp14)
60	ld	%r8,8(%r6)		# load r8-r31
61	ld	%r9,16(%r6)
62	ld	%r10,24(%r6)
63	ld	%r11,32(%r6)
64	ld	%r12,40(%r6)
65	ld	%r13,48(%r6)
66	ld	%r14,56(%r6)
67	ld	%r15,64(%r6)
68	ld	%r16,72(%r6)
69	ld	%r17,80(%r6)
70	ld	%r18,88(%r6)
71	ld	%r19,96(%r6)
72	ld	%r20,104(%r6)
73	ld	%r21,112(%r6)
74	ld	%r22,120(%r6)
75	ld	%r23,128(%r6)
76	ld	%r24,136(%r6)
77	ld	%r25,144(%r6)
78	ld	%r26,152(%r6)
79	ld	%r27,160(%r6)
80	ld	%r28,168(%r6)
81	ld	%r29,176(%r6)
82	ld	%r30,184(%r6)
83	ld	%r31,192(%r6)
84
85	mr	%r6,%r4
86	mtlr	%r11
87	mtcr	%r12
88	mr	%r2,%r9
89	mr	%r1,%r10
90	addi	%r4,%r3,100		# &sigmask
91	li	%r3,3			# SIG_SETMASK
92	li	%r5,0
93	_DOSYSCALL(__sigprocmask14)	# assume no error	XXX
94	or.	%r3,%r6,%r6
95	bnelr
96	li	%r3,1
97	blr
98END(__longjmp14)
99