Unify s_client/s_server srtp profiles option handling
[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 # void s390x_km(const unsigned char *in, size_t len, unsigned char *out,
267 #               unsigned int fc, void *param)
268 {
269 my ($in,$len,$out,$fc,$param) = map("%r$_",(2..6));
270 $code.=<<___;
271 .globl  s390x_km
272 .type   s390x_km,\@function
273 .align  16
274 s390x_km:
275         lr      %r0,$fc
276         l${g}r  %r1,$param
277
278         .long   0xb92e0042      # km $out,$in
279         brc     1,.-4           # pay attention to "partial completion"
280
281         br      $ra
282 .size   s390x_km,.-s390x_km
283 ___
284 }
285
286 ################
287 # void s390x_kmac(const unsigned char *in, size_t len, unsigned int fc,
288 #                 void *param)
289 {
290 my ($in,$len,$fc,$param) = map("%r$_",(2..5));
291 $code.=<<___;
292 .globl  s390x_kmac
293 .type   s390x_kmac,\@function
294 .align  16
295 s390x_kmac:
296         lr      %r0,$fc
297         l${g}r  %r1,$param
298
299         .long   0xb91e0002      # kmac %r0,$in
300         brc     1,.-4           # pay attention to "partial completion"
301
302         br      $ra
303 .size   s390x_kmac,.-s390x_kmac
304 ___
305 }
306
307 ################
308 # void s390x_kma(const unsigned char *aad, size_t alen,
309 #                const unsigned char *in, size_t len,
310 #                unsigned char *out, unsigned int fc, void *param)
311 {
312 my ($aad,$alen,$in,$len,$out) = map("%r$_",(2..6));
313 $code.=<<___;
314 .globl  s390x_kma
315 .type   s390x_kma,\@function
316 .align  16
317 s390x_kma:
318         st${g}  $out,6*$SIZE_T($sp)
319         lm${g}  %r0,%r1,$stdframe($sp)
320
321         .long   0xb9292064      # kma $out,$aad,$in
322         brc     1,.-4           # pay attention to "partial completion"
323
324         l${g}   $out,6*$SIZE_T($sp)
325         br      $ra
326 .size   s390x_kma,.-s390x_kma
327 ___
328 }
329
330 $code.=<<___;
331 .section        .init
332         brasl   $ra,OPENSSL_cpuid_setup
333 ___
334
335 $code =~ s/\`([^\`]*)\`/eval $1/gem;
336 print $code;
337 close STDOUT;   # force flush