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