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