]> git.ipfire.org Git - thirdparty/openssl.git/blob - crypto/ppccpuid.pl
Detect and prevent recursive config parsing
[thirdparty/openssl.git] / crypto / ppccpuid.pl
1 #! /usr/bin/env perl
2 # Copyright 2007-2022 The OpenSSL Project Authors. All Rights Reserved.
3 #
4 # Licensed under the Apache License 2.0 (the "License"). You may not use
5 # this file except in compliance with the License. You can obtain a copy
6 # in the file LICENSE in the source distribution or at
7 # https://www.openssl.org/source/license.html
8
9
10 # $output is the last argument if it looks like a file (it has an extension)
11 # $flavour is the first argument if it doesn't look like a file
12 $output = $#ARGV >= 0 && $ARGV[$#ARGV] =~ m|\.\w+$| ? pop : undef;
13 $flavour = $#ARGV >= 0 && $ARGV[0] !~ m|\.| ? shift : undef;
14
15 $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
16 ( $xlate="${dir}ppc-xlate.pl" and -f $xlate ) or
17 ( $xlate="${dir}perlasm/ppc-xlate.pl" and -f $xlate) or
18 die "can't locate ppc-xlate.pl";
19
20 open STDOUT,"| $^X $xlate $flavour \"$output\""
21 or die "can't call $xlate: $!";
22
23 if ($flavour=~/64/) {
24 $CMPLI="cmpldi";
25 $SHRLI="srdi";
26 $SIGNX="extsw";
27 } else {
28 $CMPLI="cmplwi";
29 $SHRLI="srwi";
30 $SIGNX="mr";
31 }
32
33 $code=<<___;
34 .machine "any"
35 .text
36
37 .globl .OPENSSL_fpu_probe
38 .align 4
39 .OPENSSL_fpu_probe:
40 fmr f0,f0
41 blr
42 .long 0
43 .byte 0,12,0x14,0,0,0,0,0
44 .size .OPENSSL_fpu_probe,.-.OPENSSL_fpu_probe
45 .globl .OPENSSL_ppc64_probe
46 .align 4
47 .OPENSSL_ppc64_probe:
48 fcfid f1,f1
49 extrdi r0,r0,32,0
50 blr
51 .long 0
52 .byte 0,12,0x14,0,0,0,0,0
53 .size .OPENSSL_ppc64_probe,.-.OPENSSL_ppc64_probe
54
55 .globl .OPENSSL_altivec_probe
56 .align 4
57 .OPENSSL_altivec_probe:
58 .long 0x10000484 # vor v0,v0,v0
59 blr
60 .long 0
61 .byte 0,12,0x14,0,0,0,0,0
62 .size .OPENSSL_altivec_probe,.-..OPENSSL_altivec_probe
63
64 .globl .OPENSSL_crypto207_probe
65 .align 4
66 .OPENSSL_crypto207_probe:
67 lvx_u v0,0,r1
68 vcipher v0,v0,v0
69 blr
70 .long 0
71 .byte 0,12,0x14,0,0,0,0,0
72 .size .OPENSSL_crypto207_probe,.-.OPENSSL_crypto207_probe
73
74 .globl .OPENSSL_madd300_probe
75 .align 4
76 .OPENSSL_madd300_probe:
77 xor r0,r0,r0
78 maddld r3,r0,r0,r0
79 maddhdu r3,r0,r0,r0
80 blr
81 .long 0
82 .byte 0,12,0x14,0,0,0,0,0
83
84 .globl .OPENSSL_brd31_probe
85 .align 4
86 .OPENSSL_brd31_probe:
87 xor r0,r0,r0
88 brd r3,r0
89 blr
90 .long 0
91 .byte 0,12,0x14,0,0,0,0,0
92 .size .OPENSSL_brd31_probe,.-.OPENSSL_brd31_probe
93
94
95 .globl .OPENSSL_wipe_cpu
96 .align 4
97 .OPENSSL_wipe_cpu:
98 xor r0,r0,r0
99 fmr f0,f31
100 fmr f1,f31
101 fmr f2,f31
102 mr r3,r1
103 fmr f3,f31
104 xor r4,r4,r4
105 fmr f4,f31
106 xor r5,r5,r5
107 fmr f5,f31
108 xor r6,r6,r6
109 fmr f6,f31
110 xor r7,r7,r7
111 fmr f7,f31
112 xor r8,r8,r8
113 fmr f8,f31
114 xor r9,r9,r9
115 fmr f9,f31
116 xor r10,r10,r10
117 fmr f10,f31
118 xor r11,r11,r11
119 fmr f11,f31
120 xor r12,r12,r12
121 fmr f12,f31
122 fmr f13,f31
123 blr
124 .long 0
125 .byte 0,12,0x14,0,0,0,0,0
126 .size .OPENSSL_wipe_cpu,.-.OPENSSL_wipe_cpu
127
128 .globl .OPENSSL_atomic_add
129 .align 4
130 .OPENSSL_atomic_add:
131 Ladd: lwarx r5,0,r3
132 add r0,r4,r5
133 stwcx. r0,0,r3
134 bne- Ladd
135 $SIGNX r3,r0
136 blr
137 .long 0
138 .byte 0,12,0x14,0,0,0,2,0
139 .long 0
140 .size .OPENSSL_atomic_add,.-.OPENSSL_atomic_add
141
142 .globl .OPENSSL_rdtsc_mftb
143 .align 4
144 .OPENSSL_rdtsc_mftb:
145 mftb r3
146 blr
147 .long 0
148 .byte 0,12,0x14,0,0,0,0,0
149 .size .OPENSSL_rdtsc_mftb,.-.OPENSSL_rdtsc_mftb
150
151 .globl .OPENSSL_rdtsc_mfspr268
152 .align 4
153 .OPENSSL_rdtsc_mfspr268:
154 mfspr r3,268
155 blr
156 .long 0
157 .byte 0,12,0x14,0,0,0,0,0
158 .size .OPENSSL_rdtsc_mfspr268,.-.OPENSSL_rdtsc_mfspr268
159
160 .globl .OPENSSL_cleanse
161 .align 4
162 .OPENSSL_cleanse:
163 $CMPLI r4,7
164 li r0,0
165 bge Lot
166 $CMPLI r4,0
167 beqlr-
168 Little: mtctr r4
169 stb r0,0(r3)
170 addi r3,r3,1
171 bdnz \$-8
172 blr
173 Lot: andi. r5,r3,3
174 beq Laligned
175 stb r0,0(r3)
176 subi r4,r4,1
177 addi r3,r3,1
178 b Lot
179 Laligned:
180 $SHRLI r5,r4,2
181 mtctr r5
182 stw r0,0(r3)
183 addi r3,r3,4
184 bdnz \$-8
185 andi. r4,r4,3
186 bne Little
187 blr
188 .long 0
189 .byte 0,12,0x14,0,0,0,2,0
190 .long 0
191 .size .OPENSSL_cleanse,.-.OPENSSL_cleanse
192
193 globl .CRYPTO_memcmp
194 .align 4
195 .CRYPTO_memcmp:
196 $CMPLI r5,0
197 li r0,0
198 beq Lno_data
199 mtctr r5
200 Loop_cmp:
201 lbz r6,0(r3)
202 addi r3,r3,1
203 lbz r7,0(r4)
204 addi r4,r4,1
205 xor r6,r6,r7
206 or r0,r0,r6
207 bdnz Loop_cmp
208
209 Lno_data:
210 li r3,0
211 sub r3,r3,r0
212 extrwi r3,r3,1,0
213 blr
214 .long 0
215 .byte 0,12,0x14,0,0,0,3,0
216 .long 0
217 .size .CRYPTO_memcmp,.-.CRYPTO_memcmp
218 ___
219 {
220 my ($out,$cnt,$max)=("r3","r4","r5");
221 my ($tick,$lasttick)=("r6","r7");
222 my ($diff,$lastdiff)=("r8","r9");
223
224 $code.=<<___;
225 .globl .OPENSSL_instrument_bus_mftb
226 .align 4
227 .OPENSSL_instrument_bus_mftb:
228 mtctr $cnt
229
230 mftb $lasttick # collect 1st tick
231 li $diff,0
232
233 dcbf 0,$out # flush cache line
234 lwarx $tick,0,$out # load and lock
235 add $tick,$tick,$diff
236 stwcx. $tick,0,$out
237 stwx $tick,0,$out
238
239 Loop: mftb $tick
240 sub $diff,$tick,$lasttick
241 mr $lasttick,$tick
242 dcbf 0,$out # flush cache line
243 lwarx $tick,0,$out # load and lock
244 add $tick,$tick,$diff
245 stwcx. $tick,0,$out
246 stwx $tick,0,$out
247 addi $out,$out,4 # ++$out
248 bdnz Loop
249
250 mr r3,$cnt
251 blr
252 .long 0
253 .byte 0,12,0x14,0,0,0,2,0
254 .long 0
255 .size .OPENSSL_instrument_bus_mftb,.-.OPENSSL_instrument_bus_mftb
256
257 .globl .OPENSSL_instrument_bus2_mftb
258 .align 4
259 .OPENSSL_instrument_bus2_mftb:
260 mr r0,$cnt
261 slwi $cnt,$cnt,2
262
263 mftb $lasttick # collect 1st tick
264 li $diff,0
265
266 dcbf 0,$out # flush cache line
267 lwarx $tick,0,$out # load and lock
268 add $tick,$tick,$diff
269 stwcx. $tick,0,$out
270 stwx $tick,0,$out
271
272 mftb $tick # collect 1st diff
273 sub $diff,$tick,$lasttick
274 mr $lasttick,$tick
275 mr $lastdiff,$diff
276 Loop2:
277 dcbf 0,$out # flush cache line
278 lwarx $tick,0,$out # load and lock
279 add $tick,$tick,$diff
280 stwcx. $tick,0,$out
281 stwx $tick,0,$out
282
283 addic. $max,$max,-1
284 beq Ldone2
285
286 mftb $tick
287 sub $diff,$tick,$lasttick
288 mr $lasttick,$tick
289 cmplw 7,$diff,$lastdiff
290 mr $lastdiff,$diff
291
292 mfcr $tick # pull cr
293 not $tick,$tick # flip bits
294 rlwinm $tick,$tick,1,29,29 # isolate flipped eq bit and scale
295
296 sub. $cnt,$cnt,$tick # conditional --$cnt
297 add $out,$out,$tick # conditional ++$out
298 bne Loop2
299
300 Ldone2:
301 srwi $cnt,$cnt,2
302 sub r3,r0,$cnt
303 blr
304 .long 0
305 .byte 0,12,0x14,0,0,0,3,0
306 .long 0
307 .size .OPENSSL_instrument_bus2_mftb,.-.OPENSSL_instrument_bus2_mftb
308
309 .globl .OPENSSL_instrument_bus_mfspr268
310 .align 4
311 .OPENSSL_instrument_bus_mfspr268:
312 mtctr $cnt
313
314 mfspr $lasttick,268 # collect 1st tick
315 li $diff,0
316
317 dcbf 0,$out # flush cache line
318 lwarx $tick,0,$out # load and lock
319 add $tick,$tick,$diff
320 stwcx. $tick,0,$out
321 stwx $tick,0,$out
322
323 Loop3: mfspr $tick,268
324 sub $diff,$tick,$lasttick
325 mr $lasttick,$tick
326 dcbf 0,$out # flush cache line
327 lwarx $tick,0,$out # load and lock
328 add $tick,$tick,$diff
329 stwcx. $tick,0,$out
330 stwx $tick,0,$out
331 addi $out,$out,4 # ++$out
332 bdnz Loop3
333
334 mr r3,$cnt
335 blr
336 .long 0
337 .byte 0,12,0x14,0,0,0,2,0
338 .long 0
339 .size .OPENSSL_instrument_bus_mfspr268,.-.OPENSSL_instrument_bus_mfspr268
340
341 .globl .OPENSSL_instrument_bus2_mfspr268
342 .align 4
343 .OPENSSL_instrument_bus2_mfspr268:
344 mr r0,$cnt
345 slwi $cnt,$cnt,2
346
347 mfspr $lasttick,268 # collect 1st tick
348 li $diff,0
349
350 dcbf 0,$out # flush cache line
351 lwarx $tick,0,$out # load and lock
352 add $tick,$tick,$diff
353 stwcx. $tick,0,$out
354 stwx $tick,0,$out
355
356 mfspr $tick,268 # collect 1st diff
357 sub $diff,$tick,$lasttick
358 mr $lasttick,$tick
359 mr $lastdiff,$diff
360 Loop4:
361 dcbf 0,$out # flush cache line
362 lwarx $tick,0,$out # load and lock
363 add $tick,$tick,$diff
364 stwcx. $tick,0,$out
365 stwx $tick,0,$out
366
367 addic. $max,$max,-1
368 beq Ldone4
369
370 mfspr $tick,268
371 sub $diff,$tick,$lasttick
372 mr $lasttick,$tick
373 cmplw 7,$diff,$lastdiff
374 mr $lastdiff,$diff
375
376 mfcr $tick # pull cr
377 not $tick,$tick # flip bits
378 rlwinm $tick,$tick,1,29,29 # isolate flipped eq bit and scale
379
380 sub. $cnt,$cnt,$tick # conditional --$cnt
381 add $out,$out,$tick # conditional ++$out
382 bne Loop4
383
384 Ldone4:
385 srwi $cnt,$cnt,2
386 sub r3,r0,$cnt
387 blr
388 .long 0
389 .byte 0,12,0x14,0,0,0,3,0
390 .long 0
391 .size .OPENSSL_instrument_bus2_mfspr268,.-.OPENSSL_instrument_bus2_mfspr268
392 ___
393 }
394
395 $code =~ s/\`([^\`]*)\`/eval $1/gem;
396 print $code;
397 close STDOUT or die "error closing STDOUT: $!";