]>
Commit | Line | Data |
---|---|---|
1 | /* | |
2 | * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. | |
3 | * | |
4 | * @APPLE_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. Please obtain a copy of the License at | |
10 | * http://www.opensource.apple.com/apsl/ and read it before using this | |
11 | * file. | |
12 | * | |
13 | * The Original Code and all software distributed under the License are | |
14 | * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER | |
15 | * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, | |
16 | * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, | |
17 | * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. | |
18 | * Please see the License for the specific language governing rights and | |
19 | * limitations under the License. | |
20 | * | |
21 | * @APPLE_LICENSE_HEADER_END@ | |
22 | */ | |
23 | ||
24 | /* int _setjmp(jmp_buf env); */ | |
25 | /* | |
26 | * Copyright (c) 1998 Apple Computer, Inc. All rights reserved. | |
27 | * | |
28 | * File: sys/ppc/_setjmp.s | |
29 | * | |
30 | * Implements _setjmp() | |
31 | * | |
32 | * History: | |
33 | * 8 September 1998 Matt Watson (mwatson@apple.com) | |
34 | * Created. Derived from setjmp.s | |
35 | */ | |
36 | ||
37 | /* We use mode-independent "g" opcodes such as "stg", and/or | |
38 | * mode-independent macros such as MI_GET_ADDRESS. These expand | |
39 | * into word operations when targeting __ppc__, and into doubleword | |
40 | * operations when targeting __ppc64__. | |
41 | */ | |
42 | #include <architecture/ppc/mode_independent_asm.h> | |
43 | ||
44 | #define __APPLE_API_PRIVATE | |
45 | #include <machine/cpu_capabilities.h> | |
46 | #undef __APPLE_API_PRIVATE | |
47 | ||
48 | #include "_setjmp.h" | |
49 | ||
50 | #define VRSave 256 | |
51 | ||
52 | ||
53 | MI_ENTRY_POINT(__setjmp) | |
54 | lbz r7, _COMM_PAGE_ALTIVEC(0) ; get "AltiVec available" flag | |
55 | ||
56 | stg r1, JMP_r1(r3) | |
57 | stg r2, JMP_r2(r3) | |
58 | stg r13, JMP_r13(r3) | |
59 | stg r14, JMP_r14(r3) | |
60 | stg r15, JMP_r15(r3) | |
61 | stg r16, JMP_r16(r3) | |
62 | stg r17, JMP_r17(r3) | |
63 | stg r18, JMP_r18(r3) | |
64 | stg r19, JMP_r19(r3) | |
65 | mfcr r0 ; we only need to save cr2-cr4 | |
66 | stg r20, JMP_r20(r3) | |
67 | stg r21, JMP_r21(r3) | |
68 | stg r22, JMP_r22(r3) | |
69 | stg r23, JMP_r23(r3) | |
70 | stg r24, JMP_r24(r3) | |
71 | mflr r5 | |
72 | stg r25, JMP_r25(r3) | |
73 | stg r26, JMP_r26(r3) | |
74 | stg r27, JMP_r27(r3) | |
75 | stg r28, JMP_r28(r3) | |
76 | stg r29, JMP_r29(r3) | |
77 | stg r30, JMP_r30(r3) | |
78 | stg r31, JMP_r31(r3) | |
79 | stg r0, JMP_cr(r3) | |
80 | stg r5, JMP_lr(r3) | |
81 | ||
82 | addi r6,r3,JMP_fp_base_addr ; point to base of FPR save area | |
83 | stg r3,JMP_addr_at_setjmp(r3) ; remember original address of jmpbuf | |
84 | clrrgi r6,r6,4 ; mask off low 4 bits to qw align | |
85 | mffs f0 ; get FPSCR | |
86 | stfd f14,0*8(r6) | |
87 | stfd f15,1*8(r6) | |
88 | stfd f16,2*8(r6) | |
89 | stfd f17,3*8(r6) | |
90 | stfd f18,4*8(r6) | |
91 | stfd f19,5*8(r6) | |
92 | stfd f20,6*8(r6) | |
93 | stfd f21,7*8(r6) | |
94 | stfd f22,8*8(r6) | |
95 | stfd f23,9*8(r6) | |
96 | stfd f24,10*8(r6) | |
97 | stfd f25,11*8(r6) | |
98 | stfd f26,12*8(r6) | |
99 | stfd f27,13*8(r6) | |
100 | stfd f28,14*8(r6) | |
101 | stfd f29,15*8(r6) | |
102 | stfd f30,16*8(r6) | |
103 | stfd f31,17*8(r6) | |
104 | stfd f0,JMP_fpscr(r3) ; save fpscr in non-sliding region of jmpbuf | |
105 | ||
106 | cmpwi r7,0 ; is AltiVec available? (test _COMM_PAGE_ALTIVEC) | |
107 | addi r6,r3,JMP_vr_base_addr ; get base address of VR save area | |
108 | addi r8,r3,JMP_vrsave ; we'll need this address below | |
109 | li r3,0 ; set return value (always 0 on setjmp) | |
110 | beqlr-- ; exit if no Altivec | |
111 | ||
112 | mfspr r4,VRSave ; AltiVec available, so get VRSAVE mask | |
113 | andi. r0,r4,0xFFF ; we only care about v20-v31 | |
114 | stg r0,0(r8) ; save effective VRSAVE in JMP_vrsave | |
115 | beqlr++ ; if no live non-volatile VRs, we're done | |
116 | ||
117 | stvx v20,0,r6 | |
118 | li r4,16*1 | |
119 | stvx v21,r4,r6 | |
120 | li r4,16*2 | |
121 | stvx v22,r4,r6 | |
122 | li r4,16*3 | |
123 | stvx v23,r4,r6 | |
124 | li r4,16*4 | |
125 | stvx v24,r4,r6 | |
126 | li r4,16*5 | |
127 | stvx v25,r4,r6 | |
128 | li r4,16*6 | |
129 | stvx v26,r4,r6 | |
130 | li r4,16*7 | |
131 | stvx v27,r4,r6 | |
132 | li r4,16*8 | |
133 | stvx v28,r4,r6 | |
134 | li r4,16*9 | |
135 | stvx v29,r4,r6 | |
136 | li r4,16*10 | |
137 | stvx v30,r4,r6 | |
138 | li r4,16*11 | |
139 | stvx v31,r4,r6 | |
140 | ||
141 | blr | |
142 |