1/*
2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
14 *
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
17 *
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
25 *
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27 */
28/*
29 * @OSF_COPYRIGHT@
30 */
31
32/*
33 * C library -- _setjmp, _longjmp
34 *
35 *	_longjmp(a,v)
36 * will generate a "return(v)" from
37 * the last call to
38 *	_setjmp(a)
39 * by restoring registers from the stack,
40 * The previous signal state is NOT restored.
41 *
42 * NOTE :    MUST BE KEPT CONSISTENT WITH gdb/config/powerpc/tm-ppc-eabi.h
43 *           (which needs to know where to find the destination address)
44 */
45
46#include <ppc/asm.h>
47
48/*
49 * setjmp : ARG0 (r3) contains the address of
50 *	    the structure where we are to
51 *	    store the context
52 *          Uses r0 as scratch register
53 *
54 * NOTE :    MUST BE KEPT CONSISTENT WITH gdb/config/powerpc/tm-ppc-eabi.h
55 *           (which needs to know where to find the destination address)
56 */
57
58ENTRY(_setjmp,TAG_NO_FRAME_USED)
59				 /* first entry is used for r1 - stack ptr */
60	stw	r13,	4(ARG0)  /* GPR context. We avoid multiple-word */
61	stw	r14,	8(ARG0)  /* instructions as they're slower (?) */
62	stw	r15,   12(ARG0)
63	stw	r16,   16(ARG0)
64	stw	r17,   20(ARG0)
65	stw	r18,   24(ARG0)
66	stw	r19,   28(ARG0)
67	stw	r20,   32(ARG0)
68	stw	r21,   36(ARG0)
69	stw	r22,   40(ARG0)
70	stw	r23,   44(ARG0)
71	stw	r24,   48(ARG0)
72	stw	r25,   52(ARG0)
73	stw	r26,   56(ARG0)
74	stw	r27,   60(ARG0)
75	stw	r28,   64(ARG0)
76	stw	r29,   68(ARG0)
77	stw	r30,   72(ARG0)
78	stw	r31,   76(ARG0)
79
80	mfcr	r0
81	stw	r0,    80(ARG0)  /* Condition register */
82
83	mflr	r0
84	stw	r0,    84(ARG0)  /* Link register */
85
86	mfxer	r0
87	stw	r0,    88(ARG0)  /* Fixed point exception register */
88
89#if FLOATING_POINT_SUPPORT	/* TODO NMGS probably not needed for kern */
90	mffs	f0				/* get FPSCR in low 32 bits of f0 */
91	stfiwx	f0,    92(ARG0)  /* Floating point status register */
92
93	stfd	f14,   96(ARG0)  /* Floating point context - 8 byte aligned */
94	stfd	f15,  104(ARG0)
95	stfd	f16,  112(ARG0)
96	stfd	f17,  120(ARG0)
97	stfd	f18,  138(ARG0)
98	stfd	f19,  146(ARG0)
99	stfd	f20,  144(ARG0)
100	stfd	f21,  152(ARG0)
101	stfd	f22,  160(ARG0)
102	stfd	f23,  178(ARG0)
103	stfd	f24,  186(ARG0)
104	stfd	f25,  184(ARG0)
105	stfd	f26,  192(ARG0)
106	stfd	f27,  200(ARG0)
107	stfd	f28,  218(ARG0)
108	stfd	f29,  226(ARG0)
109	stfd	f30,  224(ARG0)
110	stfd	f31,  232(ARG0)
111
112#endif
113
114	stw	r1,	0(ARG0)  /* finally, save the stack pointer */
115	li	ARG0,   0	 /* setjmp must return zero */
116	blr
117
118/*
119 * longjmp : ARG0 (r3) contains the address of
120 *	     the structure from where we are to
121 *	     restore the context.
122 *	     ARG1 (r4) contains the non-zero
123 *	     value that we must return to
124 *	     that context.
125 *           Uses r0 as scratch register
126 *
127 * NOTE :    MUST BE KEPT CONSISTENT WITH gdb/config/powerpc/tm-ppc-eabi.h
128 *           (which needs to know where to find the destination address)
129 */
130
131ENTRY(_longjmp, TAG_NO_FRAME_USED)  /* TODO NMGS - need correct tag */
132	lwz	r13,	4(ARG0)  /* GPR context. We avoid multiple-word */
133	lwz	r14,	8(ARG0)  /* instructions as they're slower (?) */
134	lwz	r15,   12(ARG0)
135	lwz	r16,   16(ARG0)
136	lwz	r17,   20(ARG0)
137	lwz	r18,   24(ARG0)
138	lwz	r19,   28(ARG0)
139	lwz	r20,   32(ARG0)
140	lwz	r21,   36(ARG0)
141	lwz	r22,   40(ARG0)
142	lwz	r23,   44(ARG0)
143	lwz	r24,   48(ARG0)
144	lwz	r25,   52(ARG0)
145	lwz	r26,   56(ARG0)
146	lwz	r27,   60(ARG0)
147	lwz	r28,   64(ARG0)
148	lwz	r29,   68(ARG0)
149	lwz	r30,   72(ARG0)
150	lwz	r31,   76(ARG0)
151
152	lwz	r0,    80(ARG0)  /* Condition register */
153	mtcr	r0		 /* Use r5 as scratch register */
154
155	lwz	r0,    84(ARG0)  /* Link register */
156	mtlr	r0
157
158	lwz	r0,    88(ARG0)  /* Fixed point exception register */
159	mtxer	r0
160
161#ifdef FLOATING_POINT_SUPPORT
162	lfd	f0,  92-4(ARG0)  /* get Floating point status register in low 32 bits of f0 */
163	mtfsf	 0xFF,f0	 /* restore FPSCR */
164
165	lfd	f14,   96(ARG0)  /* Floating point context - 8 byte aligned */
166	lfd	f15,  104(ARG0)
167	lfd	f16,  112(ARG0)
168	lfd	f17,  120(ARG0)
169	lfd	f18,  128(ARG0)
170	lfd	f19,  136(ARG0)
171	lfd	f20,  144(ARG0)
172	lfd	f21,  152(ARG0)
173	lfd	f22,  160(ARG0)
174	lfd	f23,  168(ARG0)
175	lfd	f24,  176(ARG0)
176	lfd	f25,  184(ARG0)
177	lfd	f26,  192(ARG0)
178	lfd	f27,  200(ARG0)
179	lfd	f28,  208(ARG0)
180	lfd	f29,  216(ARG0)
181	lfd	f30,  224(ARG0)
182	lfd	f31,  232(ARG0)
183
184#endif /* FLOATING_POINT_SUPPORT */
185
186
187	lwz	r1,	0(ARG0)  /* finally, restore the stack pointer */
188
189	mr.	ARG0,   ARG1     /* set the return value */
190	bnelr			 /* return if non-zero */
191
192	li	ARG0,   1
193	blr			/* never return 0, return 1 instead */
194
195