xref: /openbsd-src/lib/libc/arch/powerpc/gen/setjmp.S (revision b2ea75c1b17e1a9a339660e7ed45cd24946b230e)
1#include "SYS.h"
2#include <machine/asm.h>
3
4/* int setjmp(jmp_buf env) */
5
6#define JMP_r1	0x04
7#define JMP_r14	0x08
8#define JMP_r15	0x0c
9#define JMP_r16	0x10
10#define JMP_r17	0x14
11#define JMP_r18	0x18
12#define JMP_r19	0x1c
13#define JMP_r20	0x20
14#define JMP_r21	0x24
15#define JMP_r22	0x28
16#define JMP_r23	0x2c
17#define JMP_r24	0x30
18#define JMP_r25	0x34
19#define JMP_r26	0x38
20#define JMP_r27	0x3c
21#define JMP_r28	0x40
22#define JMP_r29	0x44
23#define JMP_r30	0x48
24#define JMP_r31	0x4c
25#define JMP_lr  0x50
26#define JMP_cr  0x54
27#define JMP_ctr	0x58
28#define JMP_xer	0x5c
29#define JMP_sig	0x60
30
31
32.extern sigblock
33
34ENTRY(setjmp)
35	/* r31, mask */
36	stw 31, JMP_r31(3)
37	mflr 0
38	stw 0, JMP_lr(3)
39	mr 31, 3
40	li 3, 0
41	bl PIC_PLT(sigblock)
42	stw 3, JMP_sig(31)
43	/* should sigstack be checked and saved */
44	mr 3, 31
45	lwz 0, JMP_lr(3)
46	mtlr 0
47	lwz 31, JMP_r31(3)
48ENTRY(_setjmp)
49	stw 31, JMP_r31(3)
50	/* r1, r14-r30 */
51	stw 1,  JMP_r1 (3)
52	stw 14, JMP_r14(3)
53	stw 15, JMP_r15(3)
54	stw 16, JMP_r16(3)
55	stw 17, JMP_r17(3)
56	stw 18, JMP_r18(3)
57	stw 19, JMP_r19(3)
58	stw 20, JMP_r20(3)
59	stw 21, JMP_r21(3)
60	stw 22, JMP_r22(3)
61	stw 23, JMP_r23(3)
62	stw 24, JMP_r24(3)
63	stw 25, JMP_r25(3)
64	stw 26, JMP_r26(3)
65	stw 27, JMP_r27(3)
66	stw 28, JMP_r28(3)
67	stw 29, JMP_r29(3)
68	stw 30, JMP_r30(3)
69	/* cr, lr, ctr, xer */
70	mfcr 0
71	stw 0, JMP_cr(3)
72	mflr 0
73	stw 0, JMP_lr(3)
74	mfctr 0
75	stw 0, JMP_ctr(3)
76	mfxer 0
77	stw 0, JMP_xer(3)
78	/* f14-f31, fpscr */
79	li 3, 0
80	blr
81
82
83.extern sigsetmask
84ENTRY(longjmp)
85	/* r31, mask */
86	mr 30, 3
87	mr 31, 4
88	lwz 3, JMP_sig(3)
89	bl PIC_PLT(sigsetmask)
90	/* should we deal with sigonstack here ?? */
91	mr 4, 31
92	mr 3, 30
93ENTRY(_longjmp)
94	lwz 31, JMP_r31(3)
95	/* r1, r14-r30 */
96	lwz 1,  JMP_r1 (3)
97	lwz 14, JMP_r14(3)
98	lwz 15, JMP_r15(3)
99	lwz 16, JMP_r16(3)
100	lwz 17, JMP_r17(3)
101	lwz 18, JMP_r18(3)
102	lwz 19, JMP_r19(3)
103	lwz 20, JMP_r20(3)
104	lwz 21, JMP_r21(3)
105	lwz 22, JMP_r22(3)
106	lwz 23, JMP_r23(3)
107	lwz 24, JMP_r24(3)
108	lwz 25, JMP_r25(3)
109	lwz 26, JMP_r26(3)
110	lwz 27, JMP_r27(3)
111	lwz 28, JMP_r28(3)
112	lwz 29, JMP_r29(3)
113	lwz 30, JMP_r30(3)
114	/* cr, lr, ctr, xer */
115	lwz 0, JMP_cr(3)
116	mtcr 0
117	lwz 0, JMP_lr(3)
118	mtlr 0
119	lwz 0, JMP_ctr(3)
120	mtctr 0
121	lwz 0, JMP_xer(3)
122	mtxer 0
123	/* f14-f31, fpscr */
124	mr 3, 4
125	blr
126