]>
Commit | Line | Data |
---|---|---|
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 | ||
11 | if ($flavour =~ /3[12]/) { | |
12 | $SIZE_T=4; | |
13 | $g=""; | |
14 | } else { | |
15 | $SIZE_T=8; | |
16 | $g="g"; | |
17 | } | |
8626230a | 18 | |
96530eea PS |
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=<<___; | |
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 |
34 | OPENSSL_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 | |
56 | OPENSSL_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 |
142 | OPENSSL_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 |
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 | |
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 |
172 | OPENSSL_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 |
192 | OPENSSL_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 |
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: | |
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 |
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 | |
96530eea | 260 | .type OPENSSL_instrument_bus2,\@function |
5fabb88a AP |
261 | .align 16 |
262 | OPENSSL_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 |
270 | OPENSSL_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) | |
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 | ||
96530eea PS |
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" | |
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 | { | |
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 | ||
dacd2a87 PS |
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 | ||
74d38a86 PS |
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 | ||
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 | { | |
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.=<<___; | |
91fdacb2 | 426 | .section .init |
96530eea PS |
427 | brasl $ra,OPENSSL_cpuid_setup |
428 | ___ | |
429 | ||
430 | $code =~ s/\`([^\`]*)\`/eval $1/gem; | |
431 | print $code; | |
432 | close STDOUT; # force flush |