]> git.ipfire.org Git - thirdparty/openssl.git/blob - crypto/s390xcpuid.pl
s390x assembly pack: add OPENSSL_s390xcap environment variable.
[thirdparty/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
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