]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/powerpc/powerpc64/__longjmp-common.S
Update copyright dates with scripts/update-copyrights
[thirdparty/glibc.git] / sysdeps / powerpc / powerpc64 / __longjmp-common.S
CommitLineData
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 48ENTRY (__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 90L(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 114L(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 183END (__longjmp)