]>
Commit | Line | Data |
---|---|---|
e9ce8d39 A |
1 | /* |
2 | * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. | |
3 | * | |
4 | * @APPLE_LICENSE_HEADER_START@ | |
5 | * | |
734aad71 | 6 | * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. |
e9ce8d39 | 7 | * |
734aad71 A |
8 | * This file contains Original Code and/or Modifications of Original Code |
9 | * as defined in and that are subject to the Apple Public Source License | |
10 | * Version 2.0 (the 'License'). You may not use this file except in | |
11 | * compliance with the License. Please obtain a copy of the License at | |
12 | * http://www.opensource.apple.com/apsl/ and read it before using this | |
13 | * file. | |
14 | * | |
15 | * The Original Code and all software distributed under the License are | |
16 | * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER | |
e9ce8d39 A |
17 | * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, |
18 | * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, | |
734aad71 A |
19 | * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. |
20 | * Please see the License for the specific language governing rights and | |
21 | * limitations under the License. | |
e9ce8d39 A |
22 | * |
23 | * @APPLE_LICENSE_HEADER_END@ | |
24 | */ | |
25 | ||
26 | /* int _setjmp(jmp_buf env); */ | |
27 | /* | |
28 | * Copyright (c) 1998 Apple Computer, Inc. All rights reserved. | |
29 | * | |
30 | * File: sys/ppc/_setjmp.s | |
31 | * | |
32 | * Implements _setjmp() | |
33 | * | |
34 | * History: | |
35 | * 8 September 1998 Matt Watson (mwatson@apple.com) | |
36 | * Created. Derived from setjmp.s | |
37 | */ | |
38 | ||
3b2a1fe8 | 39 | |
e9ce8d39 A |
40 | #include <architecture/ppc/asm_help.h> |
41 | #include "_setjmp.h" | |
42 | ||
3b2a1fe8 A |
43 | #define VRSave 256 |
44 | ||
45 | /* special flag bit definitions copied from /osfmk/ppc/thread_act.h */ | |
46 | ||
47 | #define floatUsedbit 1 | |
48 | #define vectorUsedbit 2 | |
49 | ||
50 | #define FlagsFastTrap 0x7FF3 | |
51 | ||
52 | ||
e9ce8d39 A |
53 | LEAF(__setjmp) |
54 | stw r31, JMP_r31(r3) | |
55 | /* r1, r2, r13-r30 */ | |
56 | stw r1, JMP_r1(r3) | |
57 | stw r2, JMP_r2(r3) | |
58 | stw r13, JMP_r13(r3) | |
59 | stw r14, JMP_r14(r3) | |
60 | stw r15, JMP_r15(r3) | |
61 | stw r16, JMP_r16(r3) | |
62 | stw r17, JMP_r17(r3) | |
63 | stw r18, JMP_r18(r3) | |
64 | stw r19, JMP_r19(r3) | |
65 | stw r20, JMP_r20(r3) | |
66 | stw r21, JMP_r21(r3) | |
67 | stw r22, JMP_r22(r3) | |
68 | mfcr r0 | |
69 | stw r23, JMP_r23(r3) | |
70 | stw r24, JMP_r24(r3) | |
71 | mflr r5 | |
72 | stw r25, JMP_r25(r3) | |
73 | stw r26, JMP_r26(r3) | |
74 | mfctr r6 ; XXX ctr is volatile | |
75 | stw r27, JMP_r27(r3) | |
76 | stw r28, JMP_r28(r3) | |
77 | mfxer r7 ; XXX xer is volatile | |
78 | stw r29, JMP_r29(r3) | |
79 | stw r30, JMP_r30(r3) | |
80 | stw r0, JMP_cr(r3) | |
81 | stw r5, JMP_lr(r3) | |
82 | stw r6, JMP_ctr(r3) | |
83 | stw r7, JMP_xer(r3) | |
3b2a1fe8 A |
84 | |
85 | mr r31,r3 ; save jmp_buf ptr | |
86 | li r0,FlagsFastTrap | |
87 | sc ; get FPR-inuse and VR-inuse flags from kernel | |
88 | rlwinm r4,r3,0,floatUsedbit,floatUsedbit | |
89 | rlwinm. r5,r3,0,vectorUsedbit,vectorUsedbit | |
90 | cmpwi cr1,r4,0 ; set CR1 bne iff FPRs in use | |
91 | stw r3,JMP_flags(r31) | |
92 | stw r31,JMP_addr_at_setjmp(r31) | |
93 | mr r3,r31 ; restore jmp_buf ptr | |
94 | lwz r31,JMP_r31(r31) | |
95 | beq LSaveFPRsIfNecessary ; skip if vectorUsedbit was 0 | |
96 | ||
97 | ; must save VRs and VRSAVE | |
98 | ||
99 | mfspr r4,VRSave | |
100 | andi. r0,r4,0xFFF ; we only care about v20-v31 | |
101 | stw r0,JMP_vrsave(r3) ; set up effective VRSAVE | |
102 | beq LSaveFPRsIfNecessary ; no live non-volatile VRs | |
103 | addi r6,r3,JMP_vr_base_addr | |
104 | stvx v20,0,r6 | |
105 | li r4,16*1 | |
106 | stvx v21,r4,r6 | |
107 | li r4,16*2 | |
108 | stvx v22,r4,r6 | |
109 | li r4,16*3 | |
110 | stvx v23,r4,r6 | |
111 | li r4,16*4 | |
112 | stvx v24,r4,r6 | |
113 | li r4,16*5 | |
114 | stvx v25,r4,r6 | |
115 | li r4,16*6 | |
116 | stvx v26,r4,r6 | |
117 | li r4,16*7 | |
118 | stvx v27,r4,r6 | |
119 | li r4,16*8 | |
120 | stvx v28,r4,r6 | |
121 | li r4,16*9 | |
122 | stvx v29,r4,r6 | |
123 | li r4,16*10 | |
124 | stvx v30,r4,r6 | |
125 | li r4,16*11 | |
126 | stvx v31,r4,r6 | |
127 | ||
128 | ; must save FPRs if they are live in this thread | |
129 | ; CR1 = bne iff FPRs are in use | |
130 | ||
131 | LSaveFPRsIfNecessary: | |
132 | beq cr1,LExit ; FPRs not in use | |
133 | addi r6,r3,JMP_fp_base_addr | |
134 | rlwinm r6,r6,0,0,27 ; mask off low 4 bits to qw align | |
135 | stfd f14,0*8(r6) | |
136 | stfd f15,1*8(r6) | |
137 | stfd f16,2*8(r6) | |
138 | stfd f17,3*8(r6) | |
139 | stfd f18,4*8(r6) | |
140 | stfd f19,5*8(r6) | |
141 | stfd f20,6*8(r6) | |
142 | stfd f21,7*8(r6) | |
143 | stfd f22,8*8(r6) | |
144 | stfd f23,9*8(r6) | |
145 | stfd f24,10*8(r6) | |
146 | stfd f25,11*8(r6) | |
147 | stfd f26,12*8(r6) | |
148 | stfd f27,13*8(r6) | |
149 | stfd f28,14*8(r6) | |
150 | stfd f29,15*8(r6) | |
151 | stfd f30,16*8(r6) | |
152 | stfd f31,17*8(r6) | |
153 | ||
154 | LExit: | |
155 | li r3, 0 | |
e9ce8d39 A |
156 | blr |
157 |