annotate libsanitizer/tsan/tsan_rtl_ppc64.S @ 138:fc828634a951

merge
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 08 Nov 2018 14:17:14 +0900
parents 04ced10e8804
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 #include "tsan_ppc_regs.h"
kono
parents:
diff changeset
2
kono
parents:
diff changeset
3 .section .text
kono
parents:
diff changeset
4 .hidden __tsan_setjmp
kono
parents:
diff changeset
5 .globl _setjmp
kono
parents:
diff changeset
6 .type _setjmp, @function
kono
parents:
diff changeset
7 .align 4
kono
parents:
diff changeset
8 #if _CALL_ELF == 2
kono
parents:
diff changeset
9 _setjmp:
kono
parents:
diff changeset
10 #else
kono
parents:
diff changeset
11 .section ".opd","aw"
kono
parents:
diff changeset
12 .align 3
kono
parents:
diff changeset
13 _setjmp:
kono
parents:
diff changeset
14 .quad .L._setjmp,.TOC.@tocbase,0
kono
parents:
diff changeset
15 .previous
kono
parents:
diff changeset
16 #endif
kono
parents:
diff changeset
17 .L._setjmp:
kono
parents:
diff changeset
18 mflr r0
kono
parents:
diff changeset
19 stdu r1,-48(r1)
kono
parents:
diff changeset
20 std r2,24(r1)
kono
parents:
diff changeset
21 std r3,32(r1)
kono
parents:
diff changeset
22 std r0,40(r1)
kono
parents:
diff changeset
23 // r3 is the original stack pointer.
kono
parents:
diff changeset
24 addi r3,r1,48
kono
parents:
diff changeset
25 // r4 is the mangled stack pointer (see glibc)
kono
parents:
diff changeset
26 ld r4,-28696(r13)
kono
parents:
diff changeset
27 xor r4,r3,r4
kono
parents:
diff changeset
28 // Materialize a TOC in case we were called from libc.
kono
parents:
diff changeset
29 // For big-endian, we load the TOC from the OPD. For little-
kono
parents:
diff changeset
30 // endian, we use the .TOC. symbol to find it.
kono
parents:
diff changeset
31 nop
kono
parents:
diff changeset
32 bcl 20,31,0f
kono
parents:
diff changeset
33 0:
kono
parents:
diff changeset
34 mflr r2
kono
parents:
diff changeset
35 #if _CALL_ELF == 2
kono
parents:
diff changeset
36 addis r2,r2,.TOC.-0b@ha
kono
parents:
diff changeset
37 addi r2,r2,.TOC.-0b@l
kono
parents:
diff changeset
38 #else
kono
parents:
diff changeset
39 addis r2,r2,_setjmp-0b@ha
kono
parents:
diff changeset
40 addi r2,r2,_setjmp-0b@l
kono
parents:
diff changeset
41 ld r2,8(r2)
kono
parents:
diff changeset
42 #endif
kono
parents:
diff changeset
43 // Call the interceptor.
kono
parents:
diff changeset
44 bl __tsan_setjmp
kono
parents:
diff changeset
45 nop
kono
parents:
diff changeset
46 // Restore regs needed for setjmp.
kono
parents:
diff changeset
47 ld r3,32(r1)
kono
parents:
diff changeset
48 ld r0,40(r1)
kono
parents:
diff changeset
49 // Emulate the real setjmp function. We do this because we can't
kono
parents:
diff changeset
50 // perform a sibcall: The real setjmp function trashes the TOC
kono
parents:
diff changeset
51 // pointer, and with a sibcall we have no way to restore it.
kono
parents:
diff changeset
52 // This way we can make sure our caller's stack pointer and
kono
parents:
diff changeset
53 // link register are saved correctly in the jmpbuf.
kono
parents:
diff changeset
54 ld r6,-28696(r13)
kono
parents:
diff changeset
55 addi r5,r1,48 // original stack ptr of caller
kono
parents:
diff changeset
56 xor r5,r6,r5
kono
parents:
diff changeset
57 std r5,0(r3) // mangled stack ptr of caller
kono
parents:
diff changeset
58 ld r5,24(r1)
kono
parents:
diff changeset
59 std r5,8(r3) // caller's saved TOC pointer
kono
parents:
diff changeset
60 xor r0,r6,r0
kono
parents:
diff changeset
61 std r0,16(r3) // caller's mangled return address
kono
parents:
diff changeset
62 mfcr r0
kono
parents:
diff changeset
63 // Nonvolatiles.
kono
parents:
diff changeset
64 std r14,24(r3)
kono
parents:
diff changeset
65 stfd f14,176(r3)
kono
parents:
diff changeset
66 stw r0,172(r3) // CR
kono
parents:
diff changeset
67 std r15,32(r3)
kono
parents:
diff changeset
68 stfd f15,184(r3)
kono
parents:
diff changeset
69 std r16,40(r3)
kono
parents:
diff changeset
70 stfd f16,192(r3)
kono
parents:
diff changeset
71 std r17,48(r3)
kono
parents:
diff changeset
72 stfd f17,200(r3)
kono
parents:
diff changeset
73 std r18,56(r3)
kono
parents:
diff changeset
74 stfd f18,208(r3)
kono
parents:
diff changeset
75 std r19,64(r3)
kono
parents:
diff changeset
76 stfd f19,216(r3)
kono
parents:
diff changeset
77 std r20,72(r3)
kono
parents:
diff changeset
78 stfd f20,224(r3)
kono
parents:
diff changeset
79 std r21,80(r3)
kono
parents:
diff changeset
80 stfd f21,232(r3)
kono
parents:
diff changeset
81 std r22,88(r3)
kono
parents:
diff changeset
82 stfd f22,240(r3)
kono
parents:
diff changeset
83 std r23,96(r3)
kono
parents:
diff changeset
84 stfd f23,248(r3)
kono
parents:
diff changeset
85 std r24,104(r3)
kono
parents:
diff changeset
86 stfd f24,256(r3)
kono
parents:
diff changeset
87 std r25,112(r3)
kono
parents:
diff changeset
88 stfd f25,264(r3)
kono
parents:
diff changeset
89 std r26,120(r3)
kono
parents:
diff changeset
90 stfd f26,272(r3)
kono
parents:
diff changeset
91 std r27,128(r3)
kono
parents:
diff changeset
92 stfd f27,280(r3)
kono
parents:
diff changeset
93 std r28,136(r3)
kono
parents:
diff changeset
94 stfd f28,288(r3)
kono
parents:
diff changeset
95 std r29,144(r3)
kono
parents:
diff changeset
96 stfd f29,296(r3)
kono
parents:
diff changeset
97 std r30,152(r3)
kono
parents:
diff changeset
98 stfd f30,304(r3)
kono
parents:
diff changeset
99 std r31,160(r3)
kono
parents:
diff changeset
100 stfd f31,312(r3)
kono
parents:
diff changeset
101 addi r5,r3,320
kono
parents:
diff changeset
102 mfspr r0,256
kono
parents:
diff changeset
103 stw r0,168(r3) // VRSAVE
kono
parents:
diff changeset
104 addi r6,r5,16
kono
parents:
diff changeset
105 stvx v20,0,r5
kono
parents:
diff changeset
106 addi r5,r5,32
kono
parents:
diff changeset
107 stvx v21,0,r6
kono
parents:
diff changeset
108 addi r6,r6,32
kono
parents:
diff changeset
109 stvx v22,0,r5
kono
parents:
diff changeset
110 addi r5,r5,32
kono
parents:
diff changeset
111 stvx v23,0,r6
kono
parents:
diff changeset
112 addi r6,r6,32
kono
parents:
diff changeset
113 stvx v24,0,r5
kono
parents:
diff changeset
114 addi r5,r5,32
kono
parents:
diff changeset
115 stvx v25,0,r6
kono
parents:
diff changeset
116 addi r6,r6,32
kono
parents:
diff changeset
117 stvx v26,0,r5
kono
parents:
diff changeset
118 addi r5,r5,32
kono
parents:
diff changeset
119 stvx v27,0,r6
kono
parents:
diff changeset
120 addi r6,r6,32
kono
parents:
diff changeset
121 stvx v28,0,r5
kono
parents:
diff changeset
122 addi r5,r5,32
kono
parents:
diff changeset
123 stvx v29,0,r6
kono
parents:
diff changeset
124 addi r6,r6,32
kono
parents:
diff changeset
125 stvx v30,0,r5
kono
parents:
diff changeset
126 stvx v31,0,r6
kono
parents:
diff changeset
127 // Clear the "mask-saved" slot.
kono
parents:
diff changeset
128 li r4,0
kono
parents:
diff changeset
129 stw r4,512(r3)
kono
parents:
diff changeset
130 // Restore TOC, LR, and stack and return to caller.
kono
parents:
diff changeset
131 ld r2,24(r1)
kono
parents:
diff changeset
132 ld r0,40(r1)
kono
parents:
diff changeset
133 addi r1,r1,48
kono
parents:
diff changeset
134 li r3,0 // This is the setjmp return path
kono
parents:
diff changeset
135 mtlr r0
kono
parents:
diff changeset
136 blr
kono
parents:
diff changeset
137 .size _setjmp, .-.L._setjmp
kono
parents:
diff changeset
138
kono
parents:
diff changeset
139 .globl setjmp
kono
parents:
diff changeset
140 .type setjmp, @function
kono
parents:
diff changeset
141 .align 4
kono
parents:
diff changeset
142 setjmp:
kono
parents:
diff changeset
143 b _setjmp
kono
parents:
diff changeset
144 .size setjmp, .-setjmp
kono
parents:
diff changeset
145
kono
parents:
diff changeset
146 // sigsetjmp is like setjmp, except that the mask in r4 needs
kono
parents:
diff changeset
147 // to be saved at offset 512 of the jump buffer.
kono
parents:
diff changeset
148 .globl __sigsetjmp
kono
parents:
diff changeset
149 .type __sigsetjmp, @function
kono
parents:
diff changeset
150 .align 4
kono
parents:
diff changeset
151 #if _CALL_ELF == 2
kono
parents:
diff changeset
152 __sigsetjmp:
kono
parents:
diff changeset
153 #else
kono
parents:
diff changeset
154 .section ".opd","aw"
kono
parents:
diff changeset
155 .align 3
kono
parents:
diff changeset
156 __sigsetjmp:
kono
parents:
diff changeset
157 .quad .L.__sigsetjmp,.TOC.@tocbase,0
kono
parents:
diff changeset
158 .previous
kono
parents:
diff changeset
159 #endif
kono
parents:
diff changeset
160 .L.__sigsetjmp:
kono
parents:
diff changeset
161 mflr r0
kono
parents:
diff changeset
162 stdu r1,-64(r1)
kono
parents:
diff changeset
163 std r2,24(r1)
kono
parents:
diff changeset
164 std r3,32(r1)
kono
parents:
diff changeset
165 std r4,40(r1)
kono
parents:
diff changeset
166 std r0,48(r1)
kono
parents:
diff changeset
167 // r3 is the original stack pointer.
kono
parents:
diff changeset
168 addi r3,r1,64
kono
parents:
diff changeset
169 // r4 is the mangled stack pointer (see glibc)
kono
parents:
diff changeset
170 ld r4,-28696(r13)
kono
parents:
diff changeset
171 xor r4,r3,r4
kono
parents:
diff changeset
172 // Materialize a TOC in case we were called from libc.
kono
parents:
diff changeset
173 // For big-endian, we load the TOC from the OPD. For little-
kono
parents:
diff changeset
174 // endian, we use the .TOC. symbol to find it.
kono
parents:
diff changeset
175 nop
kono
parents:
diff changeset
176 bcl 20,31,1f
kono
parents:
diff changeset
177 1:
kono
parents:
diff changeset
178 mflr r2
kono
parents:
diff changeset
179 #if _CALL_ELF == 2
kono
parents:
diff changeset
180 addis r2,r2,.TOC.-1b@ha
kono
parents:
diff changeset
181 addi r2,r2,.TOC.-1b@l
kono
parents:
diff changeset
182 #else
kono
parents:
diff changeset
183 addis r2,r2,_setjmp-1b@ha
kono
parents:
diff changeset
184 addi r2,r2,_setjmp-1b@l
kono
parents:
diff changeset
185 ld r2,8(r2)
kono
parents:
diff changeset
186 #endif
kono
parents:
diff changeset
187 // Call the interceptor.
kono
parents:
diff changeset
188 bl __tsan_setjmp
kono
parents:
diff changeset
189 nop
kono
parents:
diff changeset
190 // Restore regs needed for __sigsetjmp.
kono
parents:
diff changeset
191 ld r3,32(r1)
kono
parents:
diff changeset
192 ld r4,40(r1)
kono
parents:
diff changeset
193 ld r0,48(r1)
kono
parents:
diff changeset
194 // Emulate the real sigsetjmp function. We do this because we can't
kono
parents:
diff changeset
195 // perform a sibcall: The real sigsetjmp function trashes the TOC
kono
parents:
diff changeset
196 // pointer, and with a sibcall we have no way to restore it.
kono
parents:
diff changeset
197 // This way we can make sure our caller's stack pointer and
kono
parents:
diff changeset
198 // link register are saved correctly in the jmpbuf.
kono
parents:
diff changeset
199 ld r6,-28696(r13)
kono
parents:
diff changeset
200 addi r5,r1,64 // original stack ptr of caller
kono
parents:
diff changeset
201 xor r5,r6,r5
kono
parents:
diff changeset
202 std r5,0(r3) // mangled stack ptr of caller
kono
parents:
diff changeset
203 ld r5,24(r1)
kono
parents:
diff changeset
204 std r5,8(r3) // caller's saved TOC pointer
kono
parents:
diff changeset
205 xor r0,r6,r0
kono
parents:
diff changeset
206 std r0,16(r3) // caller's mangled return address
kono
parents:
diff changeset
207 mfcr r0
kono
parents:
diff changeset
208 // Nonvolatiles.
kono
parents:
diff changeset
209 std r14,24(r3)
kono
parents:
diff changeset
210 stfd f14,176(r3)
kono
parents:
diff changeset
211 stw r0,172(r3) // CR
kono
parents:
diff changeset
212 std r15,32(r3)
kono
parents:
diff changeset
213 stfd f15,184(r3)
kono
parents:
diff changeset
214 std r16,40(r3)
kono
parents:
diff changeset
215 stfd f16,192(r3)
kono
parents:
diff changeset
216 std r17,48(r3)
kono
parents:
diff changeset
217 stfd f17,200(r3)
kono
parents:
diff changeset
218 std r18,56(r3)
kono
parents:
diff changeset
219 stfd f18,208(r3)
kono
parents:
diff changeset
220 std r19,64(r3)
kono
parents:
diff changeset
221 stfd f19,216(r3)
kono
parents:
diff changeset
222 std r20,72(r3)
kono
parents:
diff changeset
223 stfd f20,224(r3)
kono
parents:
diff changeset
224 std r21,80(r3)
kono
parents:
diff changeset
225 stfd f21,232(r3)
kono
parents:
diff changeset
226 std r22,88(r3)
kono
parents:
diff changeset
227 stfd f22,240(r3)
kono
parents:
diff changeset
228 std r23,96(r3)
kono
parents:
diff changeset
229 stfd f23,248(r3)
kono
parents:
diff changeset
230 std r24,104(r3)
kono
parents:
diff changeset
231 stfd f24,256(r3)
kono
parents:
diff changeset
232 std r25,112(r3)
kono
parents:
diff changeset
233 stfd f25,264(r3)
kono
parents:
diff changeset
234 std r26,120(r3)
kono
parents:
diff changeset
235 stfd f26,272(r3)
kono
parents:
diff changeset
236 std r27,128(r3)
kono
parents:
diff changeset
237 stfd f27,280(r3)
kono
parents:
diff changeset
238 std r28,136(r3)
kono
parents:
diff changeset
239 stfd f28,288(r3)
kono
parents:
diff changeset
240 std r29,144(r3)
kono
parents:
diff changeset
241 stfd f29,296(r3)
kono
parents:
diff changeset
242 std r30,152(r3)
kono
parents:
diff changeset
243 stfd f30,304(r3)
kono
parents:
diff changeset
244 std r31,160(r3)
kono
parents:
diff changeset
245 stfd f31,312(r3)
kono
parents:
diff changeset
246 addi r5,r3,320
kono
parents:
diff changeset
247 mfspr r0,256
kono
parents:
diff changeset
248 stw r0,168(r3) // VRSAVE
kono
parents:
diff changeset
249 addi r6,r5,16
kono
parents:
diff changeset
250 stvx v20,0,r5
kono
parents:
diff changeset
251 addi r5,r5,32
kono
parents:
diff changeset
252 stvx v21,0,r6
kono
parents:
diff changeset
253 addi r6,r6,32
kono
parents:
diff changeset
254 stvx v22,0,r5
kono
parents:
diff changeset
255 addi r5,r5,32
kono
parents:
diff changeset
256 stvx v23,0,r6
kono
parents:
diff changeset
257 addi r6,r6,32
kono
parents:
diff changeset
258 stvx v24,0,r5
kono
parents:
diff changeset
259 addi r5,r5,32
kono
parents:
diff changeset
260 stvx v25,0,r6
kono
parents:
diff changeset
261 addi r6,r6,32
kono
parents:
diff changeset
262 stvx v26,0,r5
kono
parents:
diff changeset
263 addi r5,r5,32
kono
parents:
diff changeset
264 stvx v27,0,r6
kono
parents:
diff changeset
265 addi r6,r6,32
kono
parents:
diff changeset
266 stvx v28,0,r5
kono
parents:
diff changeset
267 addi r5,r5,32
kono
parents:
diff changeset
268 stvx v29,0,r6
kono
parents:
diff changeset
269 addi r6,r6,32
kono
parents:
diff changeset
270 stvx v30,0,r5
kono
parents:
diff changeset
271 stvx v31,0,r6
kono
parents:
diff changeset
272 // Save into the "mask-saved" slot.
kono
parents:
diff changeset
273 stw r4,512(r3)
kono
parents:
diff changeset
274 // Restore TOC, LR, and stack and return to caller.
kono
parents:
diff changeset
275 ld r2,24(r1)
kono
parents:
diff changeset
276 ld r0,48(r1)
kono
parents:
diff changeset
277 addi r1,r1,64
kono
parents:
diff changeset
278 li r3,0 // This is the sigsetjmp return path
kono
parents:
diff changeset
279 mtlr r0
kono
parents:
diff changeset
280 blr
kono
parents:
diff changeset
281 .size __sigsetjmp, .-.L.__sigsetjmp
kono
parents:
diff changeset
282
kono
parents:
diff changeset
283 .globl sigsetjmp
kono
parents:
diff changeset
284 .type sigsetjmp, @function
kono
parents:
diff changeset
285 .align 4
kono
parents:
diff changeset
286 sigsetjmp:
kono
parents:
diff changeset
287 b __sigsetjmp
kono
parents:
diff changeset
288 .size sigsetjmp, .-sigsetjmp