1/*        $NetBSD: setjmp.S,v 1.5 2025/04/29 10:56:38 martin Exp $    */
2/*        from:     OpenBSD: setjmp.S,v 1.2 1996/12/28 06:22:18 rahnds Exp      */
3/* kernel version of this file, does not have signal goop */
4/* int setjmp(jmp_buf env) */
5
6#include <machine/asm.h>
7
8#define JMP_r1      0x04
9#define JMP_r14     0x08
10#define JMP_r15     0x0c
11#define JMP_r16     0x10
12#define JMP_r17     0x14
13#define JMP_r18     0x18
14#define JMP_r19     0x1c
15#define JMP_r20     0x20
16#define JMP_r21     0x24
17#define JMP_r22     0x28
18#define JMP_r23     0x2c
19#define JMP_r24     0x30
20#define JMP_r25     0x34
21#define JMP_r26     0x38
22#define JMP_r27     0x3c
23#define JMP_r28     0x40
24#define JMP_r29     0x44
25#define JMP_r30     0x48
26#define JMP_r31     0x4c
27#define JMP_lr  0x50
28#define JMP_cr  0x54
29#define JMP_ctr     0x58
30#define JMP_xer     0x5c
31#define JMP_sig     0x60
32
33
34.globl setjmp
35setjmp:
36          streg %r31, JMP_r31(%r3)
37          /* r1, r14-r30 */
38          streg %r1,  JMP_r1 (%r3)
39          streg %r14, JMP_r14(%r3)
40          streg %r15, JMP_r15(%r3)
41          streg %r16, JMP_r16(%r3)
42          streg %r17, JMP_r17(%r3)
43          streg %r18, JMP_r18(%r3)
44          streg %r19, JMP_r19(%r3)
45          streg %r20, JMP_r20(%r3)
46          streg %r21, JMP_r21(%r3)
47          streg %r22, JMP_r22(%r3)
48          streg %r23, JMP_r23(%r3)
49          streg %r24, JMP_r24(%r3)
50          streg %r25, JMP_r25(%r3)
51          streg %r26, JMP_r26(%r3)
52          streg %r27, JMP_r27(%r3)
53          streg %r28, JMP_r28(%r3)
54          streg %r29, JMP_r29(%r3)
55          streg %r30, JMP_r30(%r3)
56          /* cr, lr, ctr, xer */
57          mfcr %r0
58          streg %r0, JMP_cr(%r3)
59          mflr %r0
60          streg %r0, JMP_lr(%r3)
61          mfctr %r0
62          streg %r0, JMP_ctr(%r3)
63          mfxer %r0
64          streg %r0, JMP_xer(%r3)
65          /* f14-f31, fpscr */
66          li %r3, 0
67          blr
68
69
70.extern sigsetmask
71.globl longjmp
72longjmp:
73          ldreg %r31, JMP_r31(%r3)
74          /* r1, r14-r30 */
75          ldreg %r1,  JMP_r1 (%r3)
76          ldreg %r14, JMP_r14(%r3)
77          ldreg %r15, JMP_r15(%r3)
78          ldreg %r16, JMP_r16(%r3)
79          ldreg %r17, JMP_r17(%r3)
80          ldreg %r18, JMP_r18(%r3)
81          ldreg %r19, JMP_r19(%r3)
82          ldreg %r20, JMP_r20(%r3)
83          ldreg %r21, JMP_r21(%r3)
84          ldreg %r22, JMP_r22(%r3)
85          ldreg %r23, JMP_r23(%r3)
86          ldreg %r24, JMP_r24(%r3)
87          ldreg %r25, JMP_r25(%r3)
88          ldreg %r26, JMP_r26(%r3)
89          ldreg %r27, JMP_r27(%r3)
90          ldreg %r28, JMP_r28(%r3)
91          ldreg %r29, JMP_r29(%r3)
92          ldreg %r30, JMP_r30(%r3)
93          /* cr, lr, ctr, xer */
94          ldreg %r0, JMP_cr(%r3)
95          mtcr %r0
96          ldreg %r0, JMP_lr(%r3)
97          mtlr %r0
98          ldreg %r0, JMP_ctr(%r3)
99          mtctr %r0
100          ldreg %r0, JMP_xer(%r3)
101          mtxer %r0
102          /* f14-f31, fpscr */
103          li %r3, 1
104          blr
105