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