|
|
1.1 root 1: /*
2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7: * Reserved. This file contains Original Code and/or Modifications of
8: * Original Code as defined in and that are subject to the Apple Public
9: * Source License Version 1.1 (the "License"). You may not use this file
10: * except in compliance with the License. Please obtain a copy of the
11: * License at http://www.apple.com/publicsource and read it before using
12: * this file.
13: *
14: * The Original Code and all software distributed under the License are
15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
19: * License for the specific language governing rights and limitations
20: * under the License.
21: *
22: * @APPLE_LICENSE_HEADER_END@
23: */
24:
25: /*
26: * Copyright 1996 1995 by Open Software Foundation, Inc. 1997 1996 1995 1994 1993 1992 1991
27: * All Rights Reserved
28: *
29: * Permission to use, copy, modify, and distribute this software and
30: * its documentation for any purpose and without fee is hereby granted,
31: * provided that the above copyright notice appears in all copies and
32: * that both the copyright notice and this permission notice appear in
33: * supporting documentation.
34: *
35: * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
36: * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
37: * FOR A PARTICULAR PURPOSE.
38: *
39: * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
40: * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
41: * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
42: * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
43: * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
44: */
45: /*
46: * MKLINUX-1.0DR2
47: */
48:
49: /*
50: * C library -- _setjmp, _longjmp
51: *
52: * _longjmp(a,v)
53: * will generate a "return(v)" from
54: * the last call to
55: * _setjmp(a)
56: * by restoring registers from the stack,
57: * The previous signal state is NOT restored.
58: *
59: * NOTE : MUST BE KEPT CONSISTENT WITH gdb/config/powerpc/tm-ppc-eabi.h
60: * (which needs to know where to find the destination address)
61: */
62:
63: #include <ppc/asm.h>
64:
65: /*
66: * setjmp : ARG0 (r3) contains the address of
67: * the structure where we are to
68: * store the context
69: * Uses r0 as scratch register
70: *
71: * NOTE : MUST BE KEPT CONSISTENT WITH gdb/config/powerpc/tm-ppc-eabi.h
72: * (which needs to know where to find the destination address)
73: */
74:
75: ENTRY(setjmp,TAG_NO_FRAME_USED)
76: /* first entry is used for r1 - stack ptr */
77: stw r13, 4(ARG0) /* GPR context. We avoid multiple-word */
78: stw r14, 8(ARG0) /* instructions as they're slower (?) */
79: stw r15, 12(ARG0)
80: stw r16, 16(ARG0)
81: stw r17, 20(ARG0)
82: stw r18, 24(ARG0)
83: stw r19, 28(ARG0)
84: stw r20, 32(ARG0)
85: stw r21, 36(ARG0)
86: stw r22, 40(ARG0)
87: stw r23, 44(ARG0)
88: stw r24, 48(ARG0)
89: stw r25, 52(ARG0)
90: stw r26, 56(ARG0)
91: stw r27, 60(ARG0)
92: stw r28, 64(ARG0)
93: stw r29, 68(ARG0)
94: stw r30, 72(ARG0)
95: stw r31, 76(ARG0)
96:
97: mfcr r0
98: stw r0, 80(ARG0) /* Condition register */
99:
100: mflr r0
101: stw r0, 84(ARG0) /* Link register */
102:
103: mfxer r0
104: stw r0, 88(ARG0) /* Fixed point exception register */
105:
106: #if FLOATING_POINT_SUPPORT /* TODO NMGS probably not needed for kern */
107: mffs r0
108: stw r0, 92(ARG0) /* Floating point status register */
109:
110: stfd f14, 96(ARG0) /* Floating point context - 8 byte aligned */
111: stfd f15, 104(ARG0)
112: stfd f16, 112(ARG0)
113: stfd f17, 120(ARG0)
114: stfd f18, 138(ARG0)
115: stfd f19, 146(ARG0)
116: stfd f20, 144(ARG0)
117: stfd f21, 152(ARG0)
118: stfd f22, 160(ARG0)
119: stfd f23, 178(ARG0)
120: stfd f24, 186(ARG0)
121: stfd f25, 184(ARG0)
122: stfd f26, 192(ARG0)
123: stfd f27, 200(ARG0)
124: stfd f28, 218(ARG0)
125: stfd f29, 226(ARG0)
126: stfd f30, 224(ARG0)
127: stfd f31, 232(ARG0)
128:
129: #endif
130:
131: stw r1, 0(ARG0) /* finally, save the stack pointer */
132: li ARG0, 0 /* setjmp must return zero */
133: blr
134:
135: /*
136: * longjmp : ARG0 (r3) contains the address of
137: * the structure from where we are to
138: * restore the context.
139: * ARG1 (r4) contains the non-zero
140: * value that we must return to
141: * that context.
142: * Uses r0 as scratch register
143: *
144: * NOTE : MUST BE KEPT CONSISTENT WITH gdb/config/powerpc/tm-ppc-eabi.h
145: * (which needs to know where to find the destination address)
146: */
147:
148: ENTRY(longjmp, TAG_NO_FRAME_USED) /* TODO NMGS - need correct tag */
149: lwz r13, 4(ARG0) /* GPR context. We avoid multiple-word */
150: lwz r14, 8(ARG0) /* instructions as they're slower (?) */
151: lwz r15, 12(ARG0)
152: lwz r16, 16(ARG0)
153: lwz r17, 20(ARG0)
154: lwz r18, 24(ARG0)
155: lwz r19, 28(ARG0)
156: lwz r20, 32(ARG0)
157: lwz r21, 36(ARG0)
158: lwz r22, 40(ARG0)
159: lwz r23, 44(ARG0)
160: lwz r24, 48(ARG0)
161: lwz r25, 52(ARG0)
162: lwz r26, 56(ARG0)
163: lwz r27, 60(ARG0)
164: lwz r28, 64(ARG0)
165: lwz r29, 68(ARG0)
166: lwz r30, 72(ARG0)
167: lwz r31, 76(ARG0)
168:
169: lwz r0, 80(ARG0) /* Condition register */
170: mtcrf 0xff,r0
171:
172: lwz r0, 84(ARG0) /* Link register */
173: mtlr r0
174:
175: lwz r0, 88(ARG0) /* Fixed point exception register */
176: mtxer r0
177:
178: #ifdef FLOATING_POINT_SUPPORT
179: lwz r0, 92(ARG0) /* Floating point status register */
180: mtfs r0
181:
182: lfd f14, 96(ARG0) /* Floating point context - 8 byte aligned */
183: lfd f15, 104(ARG0)
184: lfd f16, 112(ARG0)
185: lfd f17, 120(ARG0)
186: lfd f18, 128(ARG0)
187: lfd f19, 136(ARG0)
188: lfd f20, 144(ARG0)
189: lfd f21, 152(ARG0)
190: lfd f22, 160(ARG0)
191: lfd f23, 168(ARG0)
192: lfd f24, 176(ARG0)
193: lfd f25, 184(ARG0)
194: lfd f26, 192(ARG0)
195: lfd f27, 200(ARG0)
196: lfd f28, 208(ARG0)
197: lfd f29, 216(ARG0)
198: lfd f30, 224(ARG0)
199: lfd f31, 232(ARG0)
200:
201: #endif /* FLOATING_POINT_SUPPORT */
202:
203:
204: lwz r1, 0(ARG0) /* finally, restore the stack pointer */
205:
206: mr. ARG0, ARG1 /* set the return value */
207: bnelr /* return if non-zero */
208:
209: li ARG0, 1
210: blr /* never return 0, return 1 instead */
211:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.