Rework build: add special cases for AIX
[openssl.git] / crypto / s390xcpuid.pl
1 #! /usr/bin/env perl
2 # Copyright 2009-2018 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 $flavour = shift;
10
11 if ($flavour =~ /3[12]/) {
12         $SIZE_T=4;
13         $g="";
14 } else {
15         $SIZE_T=8;
16         $g="g";
17 }
18
19 while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {}
20 open STDOUT,">$output";
21
22 $ra="%r14";
23 $sp="%r15";
24 $stdframe=16*$SIZE_T+4*8;
25
26 $code=<<___;
27 #include "s390x_arch.h"
28
29 .text
30
31 .globl  OPENSSL_s390x_facilities
32 .type   OPENSSL_s390x_facilities,\@function
33 .align  16
34 OPENSSL_s390x_facilities:
35         lghi    %r0,0
36         larl    %r4,OPENSSL_s390xcap_P
37
38         stg     %r0,S390X_STFLE+8(%r4)  # wipe capability vectors
39         stg     %r0,S390X_STFLE+16(%r4)
40         stg     %r0,S390X_STFLE+24(%r4)
41
42         .long   0xb2b04000              # stfle 0(%r4)
43         brc     8,.Ldone
44         lghi    %r0,1
45         .long   0xb2b04000              # stfle 0(%r4)
46         brc     8,.Ldone
47         lghi    %r0,2
48         .long   0xb2b04000              # stfle 0(%r4)
49 .Ldone:
50         br      $ra
51 .size   OPENSSL_s390x_facilities,.-OPENSSL_s390x_facilities
52
53 .globl  OPENSSL_s390x_functions
54 .type   OPENSSL_s390x_functions,\@function
55 .align  16
56 OPENSSL_s390x_functions:
57         lghi    %r0,0
58         larl    %r4,OPENSSL_s390xcap_P
59
60         stg     %r0,S390X_KIMD(%r4)     # wipe capability vectors
61         stg     %r0,S390X_KIMD+8(%r4)
62         stg     %r0,S390X_KLMD(%r4)
63         stg     %r0,S390X_KLMD+8(%r4)
64         stg     %r0,S390X_KM(%r4)
65         stg     %r0,S390X_KM+8(%r4)
66         stg     %r0,S390X_KMC(%r4)
67         stg     %r0,S390X_KMC+8(%r4)
68         stg     %r0,S390X_KMAC(%r4)
69         stg     %r0,S390X_KMAC+8(%r4)
70         stg     %r0,S390X_KMCTR(%r4)
71         stg     %r0,S390X_KMCTR+8(%r4)
72         stg     %r0,S390X_KMO(%r4)
73         stg     %r0,S390X_KMO+8(%r4)
74         stg     %r0,S390X_KMF(%r4)
75         stg     %r0,S390X_KMF+8(%r4)
76         stg     %r0,S390X_PRNO(%r4)
77         stg     %r0,S390X_PRNO+8(%r4)
78         stg     %r0,S390X_KMA(%r4)
79         stg     %r0,S390X_KMA+8(%r4)
80
81         lmg     %r2,%r3,S390X_STFLE(%r4)
82         tmhl    %r2,0x4000              # check for message-security-assist
83         jz      .Lret
84
85         lghi    %r0,S390X_QUERY         # query kimd capabilities
86         la      %r1,S390X_KIMD(%r4)
87         .long   0xb93e0002              # kimd %r0,%r2
88
89         lghi    %r0,S390X_QUERY         # query klmd capabilities
90         la      %r1,S390X_KLMD(%r4)
91         .long   0xb93f0002              # klmd %r0,%r2
92
93         lghi    %r0,S390X_QUERY         # query km capability vector
94         la      %r1,S390X_KM(%r4)
95         .long   0xb92e0042              # km %r4,%r2
96
97         lghi    %r0,S390X_QUERY         # query kmc capability vector
98         la      %r1,S390X_KMC(%r4)
99         .long   0xb92f0042              # kmc %r4,%r2
100
101         lghi    %r0,S390X_QUERY         # query kmac capability vector
102         la      %r1,S390X_KMAC(%r4)
103         .long   0xb91e0042              # kmac %r4,%r2
104
105         tmhh    %r3,0x0004              # check for message-security-assist-4
106         jz      .Lret
107
108         lghi    %r0,S390X_QUERY         # query kmctr capability vector
109         la      %r1,S390X_KMCTR(%r4)
110         .long   0xb92d2042              # kmctr %r4,%r2,%r2
111
112         lghi    %r0,S390X_QUERY         # query kmo capability vector
113         la      %r1,S390X_KMO(%r4)
114         .long   0xb92b0042              # kmo %r4,%r2
115
116         lghi    %r0,S390X_QUERY         # query kmf capability vector
117         la      %r1,S390X_KMF(%r4)
118         .long   0xb92a0042              # kmf %r4,%r2
119
120         tml     %r2,0x40                # check for message-security-assist-5
121         jz      .Lret
122
123         lghi    %r0,S390X_QUERY         # query prno capability vector
124         la      %r1,S390X_PRNO(%r4)
125         .long   0xb93c0042              # prno %r4,%r2
126
127         lg      %r2,S390X_STFLE+16(%r4)
128         tmhl    %r2,0x2000              # check for message-security-assist-8
129         jz      .Lret
130
131         lghi    %r0,S390X_QUERY         # query kma capability vector
132         la      %r1,S390X_KMA(%r4)
133         .long   0xb9294022              # kma %r2,%r4,%r2
134
135 .Lret:
136         br      $ra
137 .size   OPENSSL_s390x_functions,.-OPENSSL_s390x_functions
138
139 .globl  OPENSSL_rdtsc
140 .type   OPENSSL_rdtsc,\@function
141 .align  16
142 OPENSSL_rdtsc:
143         larl    %r4,OPENSSL_s390xcap_P
144         tm      S390X_STFLE+3(%r4),0x40 # check for store-clock-fast facility
145         jz      .Lstck
146
147         .long   0xb27cf010      # stckf 16($sp)
148         lg      %r2,16($sp)
149         br      $ra
150 .Lstck:
151         stck    16($sp)
152         lg      %r2,16($sp)
153         br      $ra
154 .size   OPENSSL_rdtsc,.-OPENSSL_rdtsc
155
156 .globl  OPENSSL_atomic_add
157 .type   OPENSSL_atomic_add,\@function
158 .align  16
159 OPENSSL_atomic_add:
160         l       %r1,0(%r2)
161 .Lspin: lr      %r0,%r1
162         ar      %r0,%r3
163         cs      %r1,%r0,0(%r2)
164         brc     4,.Lspin
165         lgfr    %r2,%r0         # OpenSSL expects the new value
166         br      $ra
167 .size   OPENSSL_atomic_add,.-OPENSSL_atomic_add
168
169 .globl  OPENSSL_wipe_cpu
170 .type   OPENSSL_wipe_cpu,\@function
171 .align  16
172 OPENSSL_wipe_cpu:
173         xgr     %r0,%r0
174         xgr     %r1,%r1
175         lgr     %r2,$sp
176         xgr     %r3,%r3
177         xgr     %r4,%r4
178         lzdr    %f0
179         lzdr    %f1
180         lzdr    %f2
181         lzdr    %f3
182         lzdr    %f4
183         lzdr    %f5
184         lzdr    %f6
185         lzdr    %f7
186         br      $ra
187 .size   OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
188
189 .globl  OPENSSL_cleanse
190 .type   OPENSSL_cleanse,\@function
191 .align  16
192 OPENSSL_cleanse:
193 #if !defined(__s390x__) && !defined(__s390x)
194         llgfr   %r3,%r3
195 #endif
196         lghi    %r4,15
197         lghi    %r0,0
198         clgr    %r3,%r4
199         jh      .Lot
200         clgr    %r3,%r0
201         bcr     8,%r14
202 .Little:
203         stc     %r0,0(%r2)
204         la      %r2,1(%r2)
205         brctg   %r3,.Little
206         br      %r14
207 .align  4
208 .Lot:   tmll    %r2,7
209         jz      .Laligned
210         stc     %r0,0(%r2)
211         la      %r2,1(%r2)
212         brctg   %r3,.Lot
213 .Laligned:
214         srlg    %r4,%r3,3
215 .Loop:  stg     %r0,0(%r2)
216         la      %r2,8(%r2)
217         brctg   %r4,.Loop
218         lghi    %r4,7
219         ngr     %r3,%r4
220         jnz     .Little
221         br      $ra
222 .size   OPENSSL_cleanse,.-OPENSSL_cleanse
223
224 .globl  CRYPTO_memcmp
225 .type   CRYPTO_memcmp,\@function
226 .align  16
227 CRYPTO_memcmp:
228 #if !defined(__s390x__) && !defined(__s390x)
229         llgfr   %r4,%r4
230 #endif
231         lghi    %r5,0
232         clgr    %r4,%r5
233         je      .Lno_data
234
235 .Loop_cmp:
236         llgc    %r0,0(%r2)
237         la      %r2,1(%r2)
238         llgc    %r1,0(%r3)
239         la      %r3,1(%r3)
240         xr      %r1,%r0
241         or      %r5,%r1
242         brctg   %r4,.Loop_cmp
243
244         lnr     %r5,%r5
245         srl     %r5,31
246 .Lno_data:
247         lgr     %r2,%r5
248         br      $ra
249 .size   CRYPTO_memcmp,.-CRYPTO_memcmp
250
251 .globl  OPENSSL_instrument_bus
252 .type   OPENSSL_instrument_bus,\@function
253 .align  16
254 OPENSSL_instrument_bus:
255         lghi    %r2,0
256         br      %r14
257 .size   OPENSSL_instrument_bus,.-OPENSSL_instrument_bus
258
259 .globl  OPENSSL_instrument_bus2
260 .type   OPENSSL_instrument_bus2,\@function
261 .align  16
262 OPENSSL_instrument_bus2:
263         lghi    %r2,0
264         br      $ra
265 .size   OPENSSL_instrument_bus2,.-OPENSSL_instrument_bus2
266
267 .globl  OPENSSL_vx_probe
268 .type   OPENSSL_vx_probe,\@function
269 .align  16
270 OPENSSL_vx_probe:
271         .word   0xe700,0x0000,0x0044    # vzero %v0
272         br      $ra
273 .size   OPENSSL_vx_probe,.-OPENSSL_vx_probe
274 ___
275
276 {
277 ################
278 # void s390x_kimd(const unsigned char *in, size_t len, unsigned int fc,
279 #                 void *param)
280 my ($in,$len,$fc,$param) = map("%r$_",(2..5));
281 $code.=<<___;
282 .globl  s390x_kimd
283 .type   s390x_kimd,\@function
284 .align  16
285 s390x_kimd:
286         llgfr   %r0,$fc
287         lgr     %r1,$param
288
289         .long   0xb93e0002      # kimd %r0,%r2
290         brc     1,.-4           # pay attention to "partial completion"
291
292         br      $ra
293 .size   s390x_kimd,.-s390x_kimd
294 ___
295 }
296
297 {
298 ################
299 # void s390x_klmd(const unsigned char *in, size_t inlen, unsigned char *out,
300 #                 size_t outlen, unsigned int fc, void *param)
301 my ($in,$inlen,$out,$outlen,$fc) = map("%r$_",(2..6));
302 $code.=<<___;
303 .globl  s390x_klmd
304 .type   s390x_klmd,\@function
305 .align  32
306 s390x_klmd:
307         llgfr   %r0,$fc
308         l${g}   %r1,$stdframe($sp)
309
310         .long   0xb93f0042      # klmd %r4,%r2
311         brc     1,.-4           # pay attention to "partial completion"
312
313         br      $ra
314 .size   s390x_klmd,.-s390x_klmd
315 ___
316 }
317
318 ################
319 # void s390x_km(const unsigned char *in, size_t len, unsigned char *out,
320 #               unsigned int fc, void *param)
321 {
322 my ($in,$len,$out,$fc,$param) = map("%r$_",(2..6));
323 $code.=<<___;
324 .globl  s390x_km
325 .type   s390x_km,\@function
326 .align  16
327 s390x_km:
328         lr      %r0,$fc
329         l${g}r  %r1,$param
330
331         .long   0xb92e0042      # km $out,$in
332         brc     1,.-4           # pay attention to "partial completion"
333
334         br      $ra
335 .size   s390x_km,.-s390x_km
336 ___
337 }
338
339 ################
340 # void s390x_kmac(const unsigned char *in, size_t len, unsigned int fc,
341 #                 void *param)
342 {
343 my ($in,$len,$fc,$param) = map("%r$_",(2..5));
344 $code.=<<___;
345 .globl  s390x_kmac
346 .type   s390x_kmac,\@function
347 .align  16
348 s390x_kmac:
349         lr      %r0,$fc
350         l${g}r  %r1,$param
351
352         .long   0xb91e0002      # kmac %r0,$in
353         brc     1,.-4           # pay attention to "partial completion"
354
355         br      $ra
356 .size   s390x_kmac,.-s390x_kmac
357 ___
358 }
359
360 ################
361 # void s390x_kmo(const unsigned char *in, size_t len, unsigned char *out,
362 #                unsigned int fc, void *param)
363 {
364 my ($in,$len,$out,$fc,$param) = map("%r$_",(2..6));
365 $code.=<<___;
366 .globl  s390x_kmo
367 .type   s390x_kmo,\@function
368 .align  16
369 s390x_kmo:
370         lr      %r0,$fc
371         l${g}r  %r1,$param
372
373         .long   0xb92b0042      # kmo $out,$in
374         brc     1,.-4           # pay attention to "partial completion"
375
376         br      $ra
377 .size   s390x_kmo,.-s390x_kmo
378 ___
379 }
380
381 ################
382 # void s390x_kmf(const unsigned char *in, size_t len, unsigned char *out,
383 #                unsigned int fc, void *param)
384 {
385 my ($in,$len,$out,$fc,$param) = map("%r$_",(2..6));
386 $code.=<<___;
387 .globl  s390x_kmf
388 .type   s390x_kmf,\@function
389 .align  16
390 s390x_kmf:
391         lr      %r0,$fc
392         l${g}r  %r1,$param
393
394         .long   0xb92a0042      # kmf $out,$in
395         brc     1,.-4           # pay attention to "partial completion"
396
397         br      $ra
398 .size   s390x_kmf,.-s390x_kmf
399 ___
400 }
401
402 ################
403 # void s390x_kma(const unsigned char *aad, size_t alen,
404 #                const unsigned char *in, size_t len,
405 #                unsigned char *out, unsigned int fc, void *param)
406 {
407 my ($aad,$alen,$in,$len,$out) = map("%r$_",(2..6));
408 $code.=<<___;
409 .globl  s390x_kma
410 .type   s390x_kma,\@function
411 .align  16
412 s390x_kma:
413         st${g}  $out,6*$SIZE_T($sp)
414         lm${g}  %r0,%r1,$stdframe($sp)
415
416         .long   0xb9292064      # kma $out,$aad,$in
417         brc     1,.-4           # pay attention to "partial completion"
418
419         l${g}   $out,6*$SIZE_T($sp)
420         br      $ra
421 .size   s390x_kma,.-s390x_kma
422 ___
423 }
424
425 $code.=<<___;
426 .section        .init
427         brasl   $ra,OPENSSL_cpuid_setup
428 ___
429
430 $code =~ s/\`([^\`]*)\`/eval $1/gem;
431 print $code;
432 close STDOUT;   # force flush