]> git.ipfire.org Git - thirdparty/openssl.git/blame - crypto/s390xcpuid.pl
s390x assembly pack: add KMA code path for aes-gcm.
[thirdparty/openssl.git] / crypto / s390xcpuid.pl
CommitLineData
96530eea
PS
1#! /usr/bin/env perl
2# Copyright 2009-2017 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
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)
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)
90ba3a28
AP
63 brc 8,.Ldone
64 lghi %r0,1
bc4e831c
PS
65 .long 0xb2b04000 # stfle 0(%r4)
66 brc 8,.Ldone
67 lghi %r0,2
68 .long 0xb2b04000 # stfle 0(%r4)
90ba3a28 69.Ldone:
bc4e831c
PS
70 lmg %r2,%r3,S390X_STFLE(%r4)
71 tmhl %r2,0x4000 # check for message-security-assist
670ad0fb
AP
72 jz .Lret
73
bc4e831c
PS
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
670ad0fb 85
bc4e831c
PS
86 lghi %r0,S390X_QUERY # query kmc capability vector
87 la %r1,S390X_KMC(%r4)
88 .long 0xb92f0042 # kmc %r4,%r2
670ad0fb 89
bc4e831c
PS
90 lghi %r0,S390X_QUERY # query kmac capability vector
91 la %r1,S390X_KMAC(%r4)
92 .long 0xb91e0042 # kmac %r4,%r2
670ad0fb 93
bc4e831c 94 tmhh %r3,0x0004 # check for message-security-assist-4
670ad0fb
AP
95 jz .Lret
96
bc4e831c
PS
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
670ad0fb
AP
123
124.Lret:
96530eea 125 br $ra
8626230a
AP
126.size OPENSSL_s390x_facilities,.-OPENSSL_s390x_facilities
127
128.globl OPENSSL_rdtsc
96530eea 129.type OPENSSL_rdtsc,\@function
8626230a
AP
130.align 16
131OPENSSL_rdtsc:
96530eea
PS
132 stck 16($sp)
133 lg %r2,16($sp)
134 br $ra
8626230a
AP
135.size OPENSSL_rdtsc,.-OPENSSL_rdtsc
136
137.globl OPENSSL_atomic_add
96530eea 138.type OPENSSL_atomic_add,\@function
8626230a
AP
139.align 16
140OPENSSL_atomic_add:
141 l %r1,0(%r2)
142.Lspin: lr %r0,%r1
143 ar %r0,%r3
144 cs %r1,%r0,0(%r2)
145 brc 4,.Lspin
146 lgfr %r2,%r0 # OpenSSL expects the new value
96530eea 147 br $ra
8626230a
AP
148.size OPENSSL_atomic_add,.-OPENSSL_atomic_add
149
150.globl OPENSSL_wipe_cpu
96530eea 151.type OPENSSL_wipe_cpu,\@function
8626230a
AP
152.align 16
153OPENSSL_wipe_cpu:
154 xgr %r0,%r0
155 xgr %r1,%r1
96530eea 156 lgr %r2,$sp
8626230a
AP
157 xgr %r3,%r3
158 xgr %r4,%r4
159 lzdr %f0
160 lzdr %f1
161 lzdr %f2
162 lzdr %f3
163 lzdr %f4
164 lzdr %f5
165 lzdr %f6
166 lzdr %f7
96530eea 167 br $ra
8626230a
AP
168.size OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
169
170.globl OPENSSL_cleanse
96530eea 171.type OPENSSL_cleanse,\@function
8626230a
AP
172.align 16
173OPENSSL_cleanse:
e822c756
AP
174#if !defined(__s390x__) && !defined(__s390x)
175 llgfr %r3,%r3
176#endif
8626230a
AP
177 lghi %r4,15
178 lghi %r0,0
179 clgr %r3,%r4
180 jh .Lot
7676eebf
AP
181 clgr %r3,%r0
182 bcr 8,%r14
8626230a
AP
183.Little:
184 stc %r0,0(%r2)
185 la %r2,1(%r2)
186 brctg %r3,.Little
187 br %r14
188.align 4
189.Lot: tmll %r2,7
190 jz .Laligned
191 stc %r0,0(%r2)
192 la %r2,1(%r2)
193 brctg %r3,.Lot
194.Laligned:
195 srlg %r4,%r3,3
196.Loop: stg %r0,0(%r2)
197 la %r2,8(%r2)
198 brctg %r4,.Loop
199 lghi %r4,7
200 ngr %r3,%r4
201 jnz .Little
96530eea 202 br $ra
8626230a 203.size OPENSSL_cleanse,.-OPENSSL_cleanse
91fdacb2 204
e33826f0 205.globl CRYPTO_memcmp
96530eea 206.type CRYPTO_memcmp,\@function
e33826f0
AP
207.align 16
208CRYPTO_memcmp:
209#if !defined(__s390x__) && !defined(__s390x)
210 llgfr %r4,%r4
211#endif
212 lghi %r5,0
213 clgr %r4,%r5
214 je .Lno_data
215
216.Loop_cmp:
0a4c87a9 217 llgc %r0,0(%r2)
e33826f0 218 la %r2,1(%r2)
0a4c87a9 219 llgc %r1,0(%r3)
e33826f0
AP
220 la %r3,1(%r3)
221 xr %r1,%r0
222 or %r5,%r1
223 brctg %r4,.Loop_cmp
224
225 lnr %r5,%r5
226 srl %r5,31
227.Lno_data:
228 lgr %r2,%r5
96530eea 229 br $ra
e33826f0
AP
230.size CRYPTO_memcmp,.-CRYPTO_memcmp
231
5fabb88a 232.globl OPENSSL_instrument_bus
96530eea 233.type OPENSSL_instrument_bus,\@function
5fabb88a
AP
234.align 16
235OPENSSL_instrument_bus:
236 lghi %r2,0
237 br %r14
238.size OPENSSL_instrument_bus,.-OPENSSL_instrument_bus
239
240.globl OPENSSL_instrument_bus2
96530eea 241.type OPENSSL_instrument_bus2,\@function
5fabb88a
AP
242.align 16
243OPENSSL_instrument_bus2:
244 lghi %r2,0
96530eea 245 br $ra
5fabb88a
AP
246.size OPENSSL_instrument_bus2,.-OPENSSL_instrument_bus2
247
bc4e831c 248.globl OPENSSL_vx_probe
96530eea 249.type OPENSSL_vx_probe,\@function
bc4e831c
PS
250.align 16
251OPENSSL_vx_probe:
252 .word 0xe700,0x0000,0x0044 # vzero %v0
96530eea 253 br $ra
bc4e831c 254.size OPENSSL_vx_probe,.-OPENSSL_vx_probe
96530eea
PS
255___
256
257################
258# void s390x_km(const unsigned char *in, size_t len, unsigned char *out,
259# unsigned int fc, void *param)
260{
261my ($in,$len,$out,$fc,$param) = map("%r$_",(2..6));
262$code.=<<___;
263.globl s390x_km
264.type s390x_km,\@function
265.align 16
266s390x_km:
267 lr %r0,$fc
268 l${g}r %r1,$param
269
270 .long 0xb92e0042 # km $out,$in
271 brc 1,.-4 # pay attention to "partial completion"
bc4e831c 272
96530eea
PS
273 br $ra
274.size s390x_km,.-s390x_km
275___
276}
277
278################
279# void s390x_kma(const unsigned char *aad, size_t alen,
280# const unsigned char *in, size_t len,
281# unsigned char *out, unsigned int fc, void *param)
282{
283my ($aad,$alen,$in,$len,$out) = map("%r$_",(2..6));
284$code.=<<___;
285.globl s390x_kma
286.type s390x_kma,\@function
287.align 16
288s390x_kma:
289 st${g} $out,6*$SIZE_T($sp)
290 lm${g} %r0,%r1,$stdframe($sp)
291
292 .long 0xb9292064 # kma $out,$aad,$in
293 brc 1,.-4 # pay attention to "partial completion"
294
295 l${g} $out,6*$SIZE_T($sp)
296 br $ra
297.size s390x_kma,.-s390x_kma
298___
299}
300
301$code.=<<___;
91fdacb2 302.section .init
96530eea
PS
303 brasl $ra,OPENSSL_cpuid_setup
304___
305
306$code =~ s/\`([^\`]*)\`/eval $1/gem;
307print $code;
308close STDOUT; # force flush