]> git.ipfire.org Git - thirdparty/openssl.git/blame - crypto/s390xcpuid.pl
Fix the S390X support for the basic AES ciphers
[thirdparty/openssl.git] / crypto / s390xcpuid.pl
CommitLineData
96530eea 1#! /usr/bin/env perl
3c7d0945 2# Copyright 2009-2018 The OpenSSL Project Authors. All Rights Reserved.
96530eea 3#
0e9725bc 4# Licensed under the Apache License 2.0 (the "License"). You may not use
96530eea
PS
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
11if ($flavour =~ /3[12]/) {
12 $SIZE_T=4;
13 $g="";
14} else {
15 $SIZE_T=8;
16 $g="g";
17}
8626230a 18
96530eea
PS
19while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {}
20open STDOUT,">$output";
21
22$ra="%r14";
23$sp="%r15";
24$stdframe=16*$SIZE_T+4*8;
25
26$code=<<___;
bc4e831c
PS
27#include "s390x_arch.h"
28
96530eea
PS
29.text
30
8626230a 31.globl OPENSSL_s390x_facilities
96530eea 32.type OPENSSL_s390x_facilities,\@function
8626230a
AP
33.align 16
34OPENSSL_s390x_facilities:
35 lghi %r0,0
670ad0fb 36 larl %r4,OPENSSL_s390xcap_P
bc4e831c
PS
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)
f39ad8dc
PS
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
56OPENSSL_s390x_functions:
57 lghi %r0,0
58 larl %r4,OPENSSL_s390xcap_P
59
60 stg %r0,S390X_KIMD(%r4) # wipe capability vectors
bc4e831c
PS
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
bc4e831c
PS
81 lmg %r2,%r3,S390X_STFLE(%r4)
82 tmhl %r2,0x4000 # check for message-security-assist
670ad0fb
AP
83 jz .Lret
84
bc4e831c
PS
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
670ad0fb 96
bc4e831c
PS
97 lghi %r0,S390X_QUERY # query kmc capability vector
98 la %r1,S390X_KMC(%r4)
99 .long 0xb92f0042 # kmc %r4,%r2
670ad0fb 100
bc4e831c
PS
101 lghi %r0,S390X_QUERY # query kmac capability vector
102 la %r1,S390X_KMAC(%r4)
103 .long 0xb91e0042 # kmac %r4,%r2
670ad0fb 104
bc4e831c 105 tmhh %r3,0x0004 # check for message-security-assist-4
670ad0fb
AP
106 jz .Lret
107
bc4e831c
PS
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
670ad0fb
AP
134
135.Lret:
96530eea 136 br $ra
f39ad8dc 137.size OPENSSL_s390x_functions,.-OPENSSL_s390x_functions
8626230a
AP
138
139.globl OPENSSL_rdtsc
96530eea 140.type OPENSSL_rdtsc,\@function
8626230a
AP
141.align 16
142OPENSSL_rdtsc:
19308587
PS
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:
96530eea
PS
151 stck 16($sp)
152 lg %r2,16($sp)
153 br $ra
8626230a
AP
154.size OPENSSL_rdtsc,.-OPENSSL_rdtsc
155
156.globl OPENSSL_atomic_add
96530eea 157.type OPENSSL_atomic_add,\@function
8626230a
AP
158.align 16
159OPENSSL_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
96530eea 166 br $ra
8626230a
AP
167.size OPENSSL_atomic_add,.-OPENSSL_atomic_add
168
169.globl OPENSSL_wipe_cpu
96530eea 170.type OPENSSL_wipe_cpu,\@function
8626230a
AP
171.align 16
172OPENSSL_wipe_cpu:
173 xgr %r0,%r0
174 xgr %r1,%r1
96530eea 175 lgr %r2,$sp
8626230a
AP
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
96530eea 186 br $ra
8626230a
AP
187.size OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
188
189.globl OPENSSL_cleanse
96530eea 190.type OPENSSL_cleanse,\@function
8626230a
AP
191.align 16
192OPENSSL_cleanse:
e822c756
AP
193#if !defined(__s390x__) && !defined(__s390x)
194 llgfr %r3,%r3
195#endif
8626230a
AP
196 lghi %r4,15
197 lghi %r0,0
198 clgr %r3,%r4
199 jh .Lot
7676eebf
AP
200 clgr %r3,%r0
201 bcr 8,%r14
8626230a
AP
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
96530eea 221 br $ra
8626230a 222.size OPENSSL_cleanse,.-OPENSSL_cleanse
91fdacb2 223
e33826f0 224.globl CRYPTO_memcmp
96530eea 225.type CRYPTO_memcmp,\@function
e33826f0
AP
226.align 16
227CRYPTO_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:
0a4c87a9 236 llgc %r0,0(%r2)
e33826f0 237 la %r2,1(%r2)
0a4c87a9 238 llgc %r1,0(%r3)
e33826f0
AP
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
96530eea 248 br $ra
e33826f0
AP
249.size CRYPTO_memcmp,.-CRYPTO_memcmp
250
5fabb88a 251.globl OPENSSL_instrument_bus
96530eea 252.type OPENSSL_instrument_bus,\@function
5fabb88a
AP
253.align 16
254OPENSSL_instrument_bus:
255 lghi %r2,0
256 br %r14
257.size OPENSSL_instrument_bus,.-OPENSSL_instrument_bus
258
259.globl OPENSSL_instrument_bus2
96530eea 260.type OPENSSL_instrument_bus2,\@function
5fabb88a
AP
261.align 16
262OPENSSL_instrument_bus2:
263 lghi %r2,0
96530eea 264 br $ra
5fabb88a
AP
265.size OPENSSL_instrument_bus2,.-OPENSSL_instrument_bus2
266
bc4e831c 267.globl OPENSSL_vx_probe
96530eea 268.type OPENSSL_vx_probe,\@function
bc4e831c
PS
269.align 16
270OPENSSL_vx_probe:
271 .word 0xe700,0x0000,0x0044 # vzero %v0
96530eea 272 br $ra
bc4e831c 273.size OPENSSL_vx_probe,.-OPENSSL_vx_probe
96530eea
PS
274___
275
f38edcab
PS
276{
277################
278# void s390x_kimd(const unsigned char *in, size_t len, unsigned int fc,
279# void *param)
280my ($in,$len,$fc,$param) = map("%r$_",(2..5));
281$code.=<<___;
282.globl s390x_kimd
283.type s390x_kimd,\@function
284.align 16
285s390x_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)
301my ($in,$inlen,$out,$outlen,$fc) = map("%r$_",(2..6));
302$code.=<<___;
303.globl s390x_klmd
304.type s390x_klmd,\@function
305.align 32
306s390x_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
96530eea
PS
318################
319# void s390x_km(const unsigned char *in, size_t len, unsigned char *out,
320# unsigned int fc, void *param)
321{
322my ($in,$len,$out,$fc,$param) = map("%r$_",(2..6));
323$code.=<<___;
324.globl s390x_km
325.type s390x_km,\@function
326.align 16
327s390x_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"
bc4e831c 333
96530eea
PS
334 br $ra
335.size s390x_km,.-s390x_km
336___
337}
338
39f5b069
PS
339################
340# void s390x_kmac(const unsigned char *in, size_t len, unsigned int fc,
341# void *param)
342{
343my ($in,$len,$fc,$param) = map("%r$_",(2..5));
344$code.=<<___;
345.globl s390x_kmac
346.type s390x_kmac,\@function
347.align 16
348s390x_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
dacd2a87
PS
360################
361# void s390x_kmo(const unsigned char *in, size_t len, unsigned char *out,
362# unsigned int fc, void *param)
363{
364my ($in,$len,$out,$fc,$param) = map("%r$_",(2..6));
365$code.=<<___;
366.globl s390x_kmo
367.type s390x_kmo,\@function
368.align 16
369s390x_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
74d38a86
PS
381################
382# void s390x_kmf(const unsigned char *in, size_t len, unsigned char *out,
383# unsigned int fc, void *param)
384{
385my ($in,$len,$out,$fc,$param) = map("%r$_",(2..6));
386$code.=<<___;
387.globl s390x_kmf
388.type s390x_kmf,\@function
389.align 16
390s390x_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
96530eea
PS
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{
407my ($aad,$alen,$in,$len,$out) = map("%r$_",(2..6));
408$code.=<<___;
409.globl s390x_kma
410.type s390x_kma,\@function
411.align 16
412s390x_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.=<<___;
91fdacb2 426.section .init
96530eea
PS
427 brasl $ra,OPENSSL_cpuid_setup
428___
429
430$code =~ s/\`([^\`]*)\`/eval $1/gem;
431print $code;
432close STDOUT; # force flush