]>
Commit | Line | Data |
---|---|---|
5c76ff27 | 1 | /* longjmp for PowerPC64. |
dff8da6b | 2 | Copyright (C) 1995-2024 Free Software Foundation, Inc. |
5c76ff27 UD |
3 | This file is part of the GNU C Library. |
4 | ||
5 | The GNU C Library is free software; you can redistribute it and/or | |
6 | modify it under the terms of the GNU Lesser General Public | |
7 | License as published by the Free Software Foundation; either | |
8 | version 2.1 of the License, or (at your option) any later version. | |
9 | ||
10 | The GNU C Library is distributed in the hope that it will be useful, | |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 | Lesser General Public License for more details. | |
14 | ||
15 | You should have received a copy of the GNU Lesser General Public | |
59ba27a6 | 16 | License along with the GNU C Library; if not, see |
5a82c748 | 17 | <https://www.gnu.org/licenses/>. */ |
5c76ff27 UD |
18 | |
19 | #include <sysdep.h> | |
88f4b692 | 20 | #include <pointer_guard.h> |
eb5ad6b9 | 21 | #include <stap-probe.h> |
5c76ff27 UD |
22 | #define _ASM |
23 | #define _SETJMP_H | |
24 | #ifdef __NO_VMX__ | |
25 | # include <novmxsetjmp.h> | |
26 | #else | |
a7140723 | 27 | # include <jmpbuf-offsets.h> |
5c76ff27 | 28 | #endif |
5c76ff27 UD |
29 | |
30 | #ifndef __NO_VMX__ | |
31 | .section ".toc","aw" | |
32 | .LC__dl_hwcap: | |
ef690add | 33 | # ifdef SHARED |
a3848485 | 34 | # if IS_IN (rtld) |
37fb1dc0 AS |
35 | /* Inside ld.so we use the local alias to avoid runtime GOT |
36 | relocations. */ | |
37 | .tc _rtld_local_ro[TC],_rtld_local_ro | |
38 | # else | |
ef690add | 39 | .tc _rtld_global_ro[TC],_rtld_global_ro |
37fb1dc0 | 40 | # endif |
ef690add | 41 | # else |
5c76ff27 | 42 | .tc _dl_hwcap[TC],_dl_hwcap |
ef690add | 43 | # endif |
5c76ff27 UD |
44 | .section ".text" |
45 | #endif | |
46 | ||
f2bfeadf | 47 | .machine "altivec" |
2d67d91a | 48 | ENTRY (__longjmp) |
d7d06f79 | 49 | CALL_MCOUNT 2 |
5c76ff27 | 50 | #ifndef __NO_VMX__ |
d6efcc11 AM |
51 | addis r5,r2,.LC__dl_hwcap@toc@ha |
52 | ld r5,.LC__dl_hwcap@toc@l(r5) | |
ef690add | 53 | # ifdef SHARED |
5c76ff27 | 54 | /* Load _rtld-global._dl_hwcap. */ |
d6efcc11 | 55 | ld r5,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET(r5) |
ef690add | 56 | # else |
d6efcc11 AM |
57 | /* Load extern _dl_hwcap. */ |
58 | ld r5,0(r5) | |
ef690add | 59 | # endif |
5c76ff27 | 60 | andis. r5,r5,(PPC_FEATURE_HAS_ALTIVEC >> 16) |
37272306 | 61 | beq L(no_vmx) |
5c76ff27 UD |
62 | la r5,((JB_VRS)*8)(3) |
63 | andi. r6,r5,0xf | |
be1e5d31 | 64 | lwz r0,((JB_VRSAVE)*8)(3) /* 32-bit VRSAVE. */ |
5c76ff27 | 65 | mtspr VRSAVE,r0 |
59eade48 | 66 | beq+ L(aligned_restore_vmx) |
5c76ff27 UD |
67 | addi r6,r5,16 |
68 | lvsl v0,0,r5 | |
69 | lvx v1,0,r5 | |
70 | addi r5,r5,32 | |
71 | lvx v21,0,r6 | |
72 | vperm v20,v1,v21,v0 | |
ef690add | 73 | # define load_misaligned_vmx_lo_loaded(loadvr,lovr,shiftvr,loadgpr,addgpr) \ |
5c76ff27 UD |
74 | addi addgpr,addgpr,32; \ |
75 | lvx lovr,0,loadgpr; \ | |
76 | vperm loadvr,loadvr,lovr,shiftvr; | |
77 | load_misaligned_vmx_lo_loaded(v21,v22,v0,r5,r6) | |
78 | load_misaligned_vmx_lo_loaded(v22,v23,v0,r6,r5) | |
79 | load_misaligned_vmx_lo_loaded(v23,v24,v0,r5,r6) | |
80 | load_misaligned_vmx_lo_loaded(v24,v25,v0,r6,r5) | |
81 | load_misaligned_vmx_lo_loaded(v25,v26,v0,r5,r6) | |
82 | load_misaligned_vmx_lo_loaded(v26,v27,v0,r6,r5) | |
83 | load_misaligned_vmx_lo_loaded(v27,v28,v0,r5,r6) | |
84 | load_misaligned_vmx_lo_loaded(v28,v29,v0,r6,r5) | |
85 | load_misaligned_vmx_lo_loaded(v29,v30,v0,r5,r6) | |
86 | load_misaligned_vmx_lo_loaded(v30,v31,v0,r6,r5) | |
87 | lvx v1,0,r5 | |
88 | vperm v31,v31,v1,v0 | |
37272306 | 89 | b L(no_vmx) |
59eade48 | 90 | L(aligned_restore_vmx): |
5c76ff27 UD |
91 | addi r6,r5,16 |
92 | lvx v20,0,r5 | |
93 | addi r5,r5,32 | |
94 | lvx v21,0,r6 | |
95 | addi r6,r6,32 | |
96 | lvx v22,0,r5 | |
97 | addi r5,r5,32 | |
98 | lvx v23,0,r6 | |
99 | addi r6,r6,32 | |
100 | lvx v24,0,r5 | |
101 | addi r5,r5,32 | |
102 | lvx v25,0,r6 | |
103 | addi r6,r6,32 | |
104 | lvx v26,0,r5 | |
105 | addi r5,r5,32 | |
106 | lvx v27,0,r6 | |
107 | addi r6,r6,32 | |
108 | lvx v28,0,r5 | |
109 | addi r5,r5,32 | |
110 | lvx v29,0,r6 | |
111 | addi r6,r6,32 | |
112 | lvx v30,0,r5 | |
113 | lvx v31,0,r6 | |
37272306 | 114 | L(no_vmx): |
5c76ff27 | 115 | #endif |
0323b051 | 116 | #if defined PTR_DEMANGLE || defined CHECK_SP |
4a132246 | 117 | ld r22,(JB_GPR1*8)(r3) |
4a132246 UD |
118 | #else |
119 | ld r1,(JB_GPR1*8)(r3) | |
0323b051 AS |
120 | #endif |
121 | #ifdef PTR_DEMANGLE | |
122 | # ifdef CHECK_SP | |
123 | PTR_DEMANGLE3 (r22, r22, r25) | |
124 | # else | |
125 | PTR_DEMANGLE3 (r1, r22, r25) | |
126 | # endif | |
127 | #endif | |
128 | #ifdef CHECK_SP | |
129 | CHECK_SP (r22) | |
130 | mr r1,r22 | |
8a422e9e | 131 | #endif |
5c76ff27 UD |
132 | ld r2,(JB_GPR2*8)(r3) |
133 | ld r0,(JB_LR*8)(r3) | |
134 | ld r14,((JB_GPRS+0)*8)(r3) | |
135 | lfd fp14,((JB_FPRS+0)*8)(r3) | |
136 | ld r15,((JB_GPRS+1)*8)(r3) | |
137 | lfd fp15,((JB_FPRS+1)*8)(r3) | |
138 | ld r16,((JB_GPRS+2)*8)(r3) | |
139 | lfd fp16,((JB_FPRS+2)*8)(r3) | |
140 | ld r17,((JB_GPRS+3)*8)(r3) | |
141 | lfd fp17,((JB_FPRS+3)*8)(r3) | |
142 | ld r18,((JB_GPRS+4)*8)(r3) | |
143 | lfd fp18,((JB_FPRS+4)*8)(r3) | |
144 | ld r19,((JB_GPRS+5)*8)(r3) | |
145 | lfd fp19,((JB_FPRS+5)*8)(r3) | |
146 | ld r20,((JB_GPRS+6)*8)(r3) | |
147 | lfd fp20,((JB_FPRS+6)*8)(r3) | |
00c2b3b9 | 148 | #ifdef PTR_DEMANGLE |
5ad77144 | 149 | PTR_DEMANGLE2 (r0, r25) |
00c2b3b9 | 150 | #endif |
eb5ad6b9 AZ |
151 | /* longjmp/longjmp_target probe expects longjmp first argument (8@3), |
152 | second argument (-4@4), and target address (8@0), respectively. */ | |
153 | LIBC_PROBE (longjmp, 3, 8@3, -4@4, 8@0) | |
5c76ff27 | 154 | mtlr r0 |
52b2a80f | 155 | std r2,FRAME_TOC_SAVE(r1) /* Restore the TOC save area. */ |
5c76ff27 UD |
156 | ld r21,((JB_GPRS+7)*8)(r3) |
157 | lfd fp21,((JB_FPRS+7)*8)(r3) | |
158 | ld r22,((JB_GPRS+8)*8)(r3) | |
159 | lfd fp22,((JB_FPRS+8)*8)(r3) | |
eb5ad6b9 | 160 | lwz r5,((JB_CR*8)+4)(r3) /* 32-bit CR. */ |
5c76ff27 UD |
161 | ld r23,((JB_GPRS+9)*8)(r3) |
162 | lfd fp23,((JB_FPRS+9)*8)(r3) | |
163 | ld r24,((JB_GPRS+10)*8)(r3) | |
164 | lfd fp24,((JB_FPRS+10)*8)(r3) | |
165 | ld r25,((JB_GPRS+11)*8)(r3) | |
166 | lfd fp25,((JB_FPRS+11)*8)(r3) | |
eb5ad6b9 | 167 | mtcrf 0xFF,r5 |
5c76ff27 UD |
168 | ld r26,((JB_GPRS+12)*8)(r3) |
169 | lfd fp26,((JB_FPRS+12)*8)(r3) | |
170 | ld r27,((JB_GPRS+13)*8)(r3) | |
171 | lfd fp27,((JB_FPRS+13)*8)(r3) | |
172 | ld r28,((JB_GPRS+14)*8)(r3) | |
173 | lfd fp28,((JB_FPRS+14)*8)(r3) | |
174 | ld r29,((JB_GPRS+15)*8)(r3) | |
175 | lfd fp29,((JB_FPRS+15)*8)(r3) | |
176 | ld r30,((JB_GPRS+16)*8)(r3) | |
177 | lfd fp30,((JB_FPRS+16)*8)(r3) | |
178 | ld r31,((JB_GPRS+17)*8)(r3) | |
179 | lfd fp31,((JB_FPRS+17)*8)(r3) | |
eb5ad6b9 | 180 | LIBC_PROBE (longjmp_target, 3, 8@3, -4@4, 8@0) |
5c76ff27 UD |
181 | mr r3,r4 |
182 | blr | |
2d67d91a | 183 | END (__longjmp) |