xref: /minix/lib/libc/arch/riscv/gen/__setjmp14.S (revision 0a6a1f1d)
1/*	$NetBSD: __setjmp14.S,v 1.2 2015/03/27 06:44:28 matt Exp $	*/
2
3#include "SYS.h"
4#include "assym.h"
5
6#if defined(LIBC_SCCS)
7__RCSID("$NetBSD: __setjmp14.S,v 1.2 2015/03/27 06:44:28 matt Exp $")
8#endif
9
10/*
11 * C library -- _setjmp, _longjmp
12 *
13 *	longjmp(a,v)
14 * will generate a "return(v?v:1)" from the last call to
15 *	setjmp(a)
16 * by restoring registers from the stack.
17 * The previous signal state is restored.
18 */
19
20ENTRY(__setjmp14)
21	li	a1, 1
22	REG_S	a1, JB_MAGIC(a0)	/* indicate sigmask */
23	REG_S	ra, JB_RA(a0)		/* save return address */
24	REG_S	sp, JB_SP(a0)		/* save stack pointer */
25	REG_S	gp, JB_GP(a0)		/* save global pointer */
26	REG_S	tp, JB_TP(a0)		/* save thread pointer */
27	REG_S	s0, JB_S0(a0)		/* save callee saved register */
28	REG_S	s1, JB_S1(a0)		/* save callee saved register */
29	REG_S	s2, JB_S2(a0)		/* save callee saved register */
30	REG_S	s3, JB_S3(a0)		/* save callee saved register */
31	REG_S	s4, JB_S4(a0)		/* save callee saved register */
32	REG_S	s5, JB_S5(a0)		/* save callee saved register */
33	REG_S	s6, JB_S6(a0)		/* save callee saved register */
34	REG_S	s7, JB_S7(a0)		/* save callee saved register */
35	REG_S	s8, JB_S8(a0)		/* save callee saved register */
36	REG_S	s9, JB_S9(a0)		/* save callee saved register */
37	REG_S	s10, JB_S10(a0)		/* save callee saved register */
38	REG_S	s11, JB_S11(a0)		/* save callee saved register */
39#ifndef _SOFT_FLOAT
40	frcsr	t2			/* get FSCR */
41	REG_S	t2, JB_FCSR(a0)		/* save it */
42	fsd	fs0, JB_FS0(a0)		/* save callee saved register */
43	fsd	fs1, JB_FS1(a0)		/* save callee saved register */
44	fsd	fs2, JB_FS2(a0)		/* save callee saved register */
45	fsd	fs3, JB_FS3(a0)		/* save callee saved register */
46	fsd	fs4, JB_FS4(a0)		/* save callee saved register */
47	fsd	fs5, JB_FS5(a0)		/* save callee saved register */
48	fsd	fs6, JB_FS6(a0)		/* save callee saved register */
49	fsd	fs7, JB_FS7(a0)		/* save callee saved register */
50	fsd	fs8, JB_FS8(a0)		/* save callee saved register */
51	fsd	fs9, JB_FS9(a0)		/* save callee saved register */
52	fsd	fs10, JB_FS10(a0)	/* save callee saved register */
53	fsd	fs11, JB_FS11(a0)	/* save callee saved register */
54#endif
55
56	addi	a2, a0, JB_SIGMASK	/* &sigmask */
57	li	a1, 0
58	li	a0, SIG_BLOCK
59	SYSTRAP(__sigprocmask14)	/* assume no error */
60	li	a0, 0	/* success */	/* indicate success */
61	ret		/* error */	/* return */
62END(__setjmp14)
63
64ENTRY(__longjmp14)
65	REG_L	ra, JB_RA(a0)		/* restore return address */
66	REG_L	sp, JB_SP(a0)		/* restore stack pointer */
67	REG_L	gp, JB_GP(a0)		/* restore global pointer */
68	#REG_L	tp, JB_TP(a0)		/* restore thread pointer */
69	REG_L	s0, JB_S0(a0)		/* restore callee saved register */
70	REG_L	s1, JB_S1(a0)		/* restore callee saved register */
71	REG_L	s2, JB_S2(a0)		/* restore callee saved register */
72	REG_L	s3, JB_S3(a0)		/* restore callee saved register */
73	REG_L	s4, JB_S4(a0)		/* restore callee saved register */
74	REG_L	s5, JB_S5(a0)		/* restore callee saved register */
75	REG_L	s6, JB_S6(a0)		/* restore callee saved register */
76	REG_L	s7, JB_S7(a0)		/* restore callee saved register */
77	REG_L	s8, JB_S8(a0)		/* restore callee saved register */
78	REG_L	s9, JB_S9(a0)		/* restore callee saved register */
79	REG_L	s10, JB_S10(a0)		/* restore callee saved register */
80	REG_L	s11, JB_S11(a0)		/* restore callee saved register */
81#ifndef _SOFT_FLOAT
82	REG_L	t2, JB_FCSR(a0)		/* get it */
83	fscsr	t2			/* restore FSCR */
84	fld	fs0, JB_FS0(a0)		/* restore callee saved register */
85	fld	fs1, JB_FS1(a0)		/* restore callee saved register */
86	fld	fs2, JB_FS2(a0)		/* restore callee saved register */
87	fld	fs3, JB_FS3(a0)		/* restore callee saved register */
88	fld	fs4, JB_FS4(a0)		/* restore callee saved register */
89	fld	fs5, JB_FS5(a0)		/* restore callee saved register */
90	fld	fs6, JB_FS6(a0)		/* restore callee saved register */
91	fld	fs7, JB_FS7(a0)		/* restore callee saved register */
92	fld	fs8, JB_FS8(a0)		/* restore callee saved register */
93	fld	fs9, JB_FS9(a0)		/* restore callee saved register */
94	fld	fs10, JB_FS10(a0)	/* restore callee saved register */
95	fld	fs11, JB_FS11(a0)	/* restore callee saved register */
96#endif
97	move	t1, a1			/* save return value */
98	li	a2, 0
99	addi	a1, a0, JB_SIGMASK	/* &sigmask */
100	li	a0, SIG_SETMASK
101	SYSTRAP(__sigprocmask14)	/* assume no error */
102	nop		/* error */
103	li	a0, 1	/* success */	/* default return value */
104	beqz	t1, 1f			/* test return value */
105	move	a0, t1			/* use it if not 0 */
1061:	ret
107END(__longjmp14)
108