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