]>
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) | |
e382f507 PS |
80 | stg %r0,S390X_PCC(%r4) |
81 | stg %r0,S390X_PCC+8(%r4) | |
82 | stg %r0,S390X_KDSA(%r4) | |
83 | stg %r0,S390X_KDSA+8(%r4) | |
bc4e831c | 84 | |
bc4e831c | 85 | lmg %r2,%r3,S390X_STFLE(%r4) |
e382f507 | 86 | |
bc4e831c | 87 | tmhl %r2,0x4000 # check for message-security-assist |
670ad0fb AP |
88 | jz .Lret |
89 | ||
bc4e831c PS |
90 | lghi %r0,S390X_QUERY # query kimd capabilities |
91 | la %r1,S390X_KIMD(%r4) | |
92 | .long 0xb93e0002 # kimd %r0,%r2 | |
93 | ||
94 | lghi %r0,S390X_QUERY # query klmd capabilities | |
95 | la %r1,S390X_KLMD(%r4) | |
96 | .long 0xb93f0002 # klmd %r0,%r2 | |
97 | ||
98 | lghi %r0,S390X_QUERY # query km capability vector | |
99 | la %r1,S390X_KM(%r4) | |
100 | .long 0xb92e0042 # km %r4,%r2 | |
670ad0fb | 101 | |
bc4e831c PS |
102 | lghi %r0,S390X_QUERY # query kmc capability vector |
103 | la %r1,S390X_KMC(%r4) | |
104 | .long 0xb92f0042 # kmc %r4,%r2 | |
670ad0fb | 105 | |
bc4e831c PS |
106 | lghi %r0,S390X_QUERY # query kmac capability vector |
107 | la %r1,S390X_KMAC(%r4) | |
108 | .long 0xb91e0042 # kmac %r4,%r2 | |
670ad0fb | 109 | |
e382f507 PS |
110 | tmhh %r3,0x0003 # check for message-security-assist-3 |
111 | jz .Lret | |
112 | ||
113 | lghi %r0,S390X_QUERY # query pcc capability vector | |
114 | la %r1,S390X_PCC(%r4) | |
115 | .long 0xb92c0000 # pcc | |
116 | ||
bc4e831c | 117 | tmhh %r3,0x0004 # check for message-security-assist-4 |
670ad0fb AP |
118 | jz .Lret |
119 | ||
bc4e831c PS |
120 | lghi %r0,S390X_QUERY # query kmctr capability vector |
121 | la %r1,S390X_KMCTR(%r4) | |
122 | .long 0xb92d2042 # kmctr %r4,%r2,%r2 | |
123 | ||
124 | lghi %r0,S390X_QUERY # query kmo capability vector | |
125 | la %r1,S390X_KMO(%r4) | |
126 | .long 0xb92b0042 # kmo %r4,%r2 | |
127 | ||
128 | lghi %r0,S390X_QUERY # query kmf capability vector | |
129 | la %r1,S390X_KMF(%r4) | |
130 | .long 0xb92a0042 # kmf %r4,%r2 | |
131 | ||
132 | tml %r2,0x40 # check for message-security-assist-5 | |
133 | jz .Lret | |
134 | ||
135 | lghi %r0,S390X_QUERY # query prno capability vector | |
136 | la %r1,S390X_PRNO(%r4) | |
137 | .long 0xb93c0042 # prno %r4,%r2 | |
138 | ||
139 | lg %r2,S390X_STFLE+16(%r4) | |
e382f507 | 140 | |
bc4e831c PS |
141 | tmhl %r2,0x2000 # check for message-security-assist-8 |
142 | jz .Lret | |
143 | ||
144 | lghi %r0,S390X_QUERY # query kma capability vector | |
145 | la %r1,S390X_KMA(%r4) | |
146 | .long 0xb9294022 # kma %r2,%r4,%r2 | |
670ad0fb | 147 | |
e382f507 PS |
148 | tmhl %r2,0x0010 # check for message-security-assist-9 |
149 | jz .Lret | |
150 | ||
151 | lghi %r0,S390X_QUERY # query kdsa capability vector | |
152 | la %r1,S390X_KDSA(%r4) | |
153 | .long 0xb93a0002 # kdsa %r0,%r2 | |
154 | ||
670ad0fb | 155 | .Lret: |
96530eea | 156 | br $ra |
f39ad8dc | 157 | .size OPENSSL_s390x_functions,.-OPENSSL_s390x_functions |
8626230a AP |
158 | |
159 | .globl OPENSSL_rdtsc | |
96530eea | 160 | .type OPENSSL_rdtsc,\@function |
8626230a AP |
161 | .align 16 |
162 | OPENSSL_rdtsc: | |
19308587 PS |
163 | larl %r4,OPENSSL_s390xcap_P |
164 | tm S390X_STFLE+3(%r4),0x40 # check for store-clock-fast facility | |
165 | jz .Lstck | |
166 | ||
167 | .long 0xb27cf010 # stckf 16($sp) | |
168 | lg %r2,16($sp) | |
169 | br $ra | |
170 | .Lstck: | |
96530eea PS |
171 | stck 16($sp) |
172 | lg %r2,16($sp) | |
173 | br $ra | |
8626230a AP |
174 | .size OPENSSL_rdtsc,.-OPENSSL_rdtsc |
175 | ||
176 | .globl OPENSSL_atomic_add | |
96530eea | 177 | .type OPENSSL_atomic_add,\@function |
8626230a AP |
178 | .align 16 |
179 | OPENSSL_atomic_add: | |
180 | l %r1,0(%r2) | |
181 | .Lspin: lr %r0,%r1 | |
182 | ar %r0,%r3 | |
183 | cs %r1,%r0,0(%r2) | |
184 | brc 4,.Lspin | |
185 | lgfr %r2,%r0 # OpenSSL expects the new value | |
96530eea | 186 | br $ra |
8626230a AP |
187 | .size OPENSSL_atomic_add,.-OPENSSL_atomic_add |
188 | ||
189 | .globl OPENSSL_wipe_cpu | |
96530eea | 190 | .type OPENSSL_wipe_cpu,\@function |
8626230a AP |
191 | .align 16 |
192 | OPENSSL_wipe_cpu: | |
193 | xgr %r0,%r0 | |
194 | xgr %r1,%r1 | |
96530eea | 195 | lgr %r2,$sp |
8626230a AP |
196 | xgr %r3,%r3 |
197 | xgr %r4,%r4 | |
198 | lzdr %f0 | |
199 | lzdr %f1 | |
200 | lzdr %f2 | |
201 | lzdr %f3 | |
202 | lzdr %f4 | |
203 | lzdr %f5 | |
204 | lzdr %f6 | |
205 | lzdr %f7 | |
96530eea | 206 | br $ra |
8626230a AP |
207 | .size OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu |
208 | ||
209 | .globl OPENSSL_cleanse | |
96530eea | 210 | .type OPENSSL_cleanse,\@function |
8626230a AP |
211 | .align 16 |
212 | OPENSSL_cleanse: | |
e822c756 AP |
213 | #if !defined(__s390x__) && !defined(__s390x) |
214 | llgfr %r3,%r3 | |
215 | #endif | |
8626230a AP |
216 | lghi %r4,15 |
217 | lghi %r0,0 | |
218 | clgr %r3,%r4 | |
219 | jh .Lot | |
7676eebf AP |
220 | clgr %r3,%r0 |
221 | bcr 8,%r14 | |
8626230a AP |
222 | .Little: |
223 | stc %r0,0(%r2) | |
224 | la %r2,1(%r2) | |
225 | brctg %r3,.Little | |
226 | br %r14 | |
227 | .align 4 | |
228 | .Lot: tmll %r2,7 | |
229 | jz .Laligned | |
230 | stc %r0,0(%r2) | |
231 | la %r2,1(%r2) | |
232 | brctg %r3,.Lot | |
233 | .Laligned: | |
234 | srlg %r4,%r3,3 | |
235 | .Loop: stg %r0,0(%r2) | |
236 | la %r2,8(%r2) | |
237 | brctg %r4,.Loop | |
238 | lghi %r4,7 | |
239 | ngr %r3,%r4 | |
240 | jnz .Little | |
96530eea | 241 | br $ra |
8626230a | 242 | .size OPENSSL_cleanse,.-OPENSSL_cleanse |
91fdacb2 | 243 | |
e33826f0 | 244 | .globl CRYPTO_memcmp |
96530eea | 245 | .type CRYPTO_memcmp,\@function |
e33826f0 AP |
246 | .align 16 |
247 | CRYPTO_memcmp: | |
248 | #if !defined(__s390x__) && !defined(__s390x) | |
249 | llgfr %r4,%r4 | |
250 | #endif | |
251 | lghi %r5,0 | |
252 | clgr %r4,%r5 | |
253 | je .Lno_data | |
254 | ||
255 | .Loop_cmp: | |
0a4c87a9 | 256 | llgc %r0,0(%r2) |
e33826f0 | 257 | la %r2,1(%r2) |
0a4c87a9 | 258 | llgc %r1,0(%r3) |
e33826f0 AP |
259 | la %r3,1(%r3) |
260 | xr %r1,%r0 | |
261 | or %r5,%r1 | |
262 | brctg %r4,.Loop_cmp | |
263 | ||
264 | lnr %r5,%r5 | |
265 | srl %r5,31 | |
266 | .Lno_data: | |
267 | lgr %r2,%r5 | |
96530eea | 268 | br $ra |
e33826f0 AP |
269 | .size CRYPTO_memcmp,.-CRYPTO_memcmp |
270 | ||
5fabb88a | 271 | .globl OPENSSL_instrument_bus |
96530eea | 272 | .type OPENSSL_instrument_bus,\@function |
5fabb88a AP |
273 | .align 16 |
274 | OPENSSL_instrument_bus: | |
275 | lghi %r2,0 | |
276 | br %r14 | |
277 | .size OPENSSL_instrument_bus,.-OPENSSL_instrument_bus | |
278 | ||
279 | .globl OPENSSL_instrument_bus2 | |
96530eea | 280 | .type OPENSSL_instrument_bus2,\@function |
5fabb88a AP |
281 | .align 16 |
282 | OPENSSL_instrument_bus2: | |
283 | lghi %r2,0 | |
96530eea | 284 | br $ra |
5fabb88a AP |
285 | .size OPENSSL_instrument_bus2,.-OPENSSL_instrument_bus2 |
286 | ||
bc4e831c | 287 | .globl OPENSSL_vx_probe |
96530eea | 288 | .type OPENSSL_vx_probe,\@function |
bc4e831c PS |
289 | .align 16 |
290 | OPENSSL_vx_probe: | |
291 | .word 0xe700,0x0000,0x0044 # vzero %v0 | |
96530eea | 292 | br $ra |
bc4e831c | 293 | .size OPENSSL_vx_probe,.-OPENSSL_vx_probe |
96530eea PS |
294 | ___ |
295 | ||
f38edcab PS |
296 | { |
297 | ################ | |
298 | # void s390x_kimd(const unsigned char *in, size_t len, unsigned int fc, | |
299 | # void *param) | |
300 | my ($in,$len,$fc,$param) = map("%r$_",(2..5)); | |
301 | $code.=<<___; | |
302 | .globl s390x_kimd | |
303 | .type s390x_kimd,\@function | |
304 | .align 16 | |
305 | s390x_kimd: | |
306 | llgfr %r0,$fc | |
307 | lgr %r1,$param | |
308 | ||
309 | .long 0xb93e0002 # kimd %r0,%r2 | |
310 | brc 1,.-4 # pay attention to "partial completion" | |
311 | ||
312 | br $ra | |
313 | .size s390x_kimd,.-s390x_kimd | |
314 | ___ | |
315 | } | |
316 | ||
317 | { | |
318 | ################ | |
319 | # void s390x_klmd(const unsigned char *in, size_t inlen, unsigned char *out, | |
320 | # size_t outlen, unsigned int fc, void *param) | |
321 | my ($in,$inlen,$out,$outlen,$fc) = map("%r$_",(2..6)); | |
322 | $code.=<<___; | |
323 | .globl s390x_klmd | |
324 | .type s390x_klmd,\@function | |
325 | .align 32 | |
326 | s390x_klmd: | |
327 | llgfr %r0,$fc | |
328 | l${g} %r1,$stdframe($sp) | |
329 | ||
330 | .long 0xb93f0042 # klmd %r4,%r2 | |
331 | brc 1,.-4 # pay attention to "partial completion" | |
332 | ||
333 | br $ra | |
334 | .size s390x_klmd,.-s390x_klmd | |
335 | ___ | |
336 | } | |
337 | ||
96530eea PS |
338 | ################ |
339 | # void s390x_km(const unsigned char *in, size_t len, unsigned char *out, | |
340 | # unsigned int fc, void *param) | |
341 | { | |
342 | my ($in,$len,$out,$fc,$param) = map("%r$_",(2..6)); | |
343 | $code.=<<___; | |
344 | .globl s390x_km | |
345 | .type s390x_km,\@function | |
346 | .align 16 | |
347 | s390x_km: | |
348 | lr %r0,$fc | |
349 | l${g}r %r1,$param | |
350 | ||
351 | .long 0xb92e0042 # km $out,$in | |
352 | brc 1,.-4 # pay attention to "partial completion" | |
bc4e831c | 353 | |
96530eea PS |
354 | br $ra |
355 | .size s390x_km,.-s390x_km | |
356 | ___ | |
357 | } | |
358 | ||
39f5b069 PS |
359 | ################ |
360 | # void s390x_kmac(const unsigned char *in, size_t len, unsigned int fc, | |
361 | # void *param) | |
362 | { | |
363 | my ($in,$len,$fc,$param) = map("%r$_",(2..5)); | |
364 | $code.=<<___; | |
365 | .globl s390x_kmac | |
366 | .type s390x_kmac,\@function | |
367 | .align 16 | |
368 | s390x_kmac: | |
369 | lr %r0,$fc | |
370 | l${g}r %r1,$param | |
371 | ||
372 | .long 0xb91e0002 # kmac %r0,$in | |
373 | brc 1,.-4 # pay attention to "partial completion" | |
374 | ||
375 | br $ra | |
376 | .size s390x_kmac,.-s390x_kmac | |
377 | ___ | |
378 | } | |
379 | ||
dacd2a87 PS |
380 | ################ |
381 | # void s390x_kmo(const unsigned char *in, size_t len, unsigned char *out, | |
382 | # unsigned int fc, void *param) | |
383 | { | |
384 | my ($in,$len,$out,$fc,$param) = map("%r$_",(2..6)); | |
385 | $code.=<<___; | |
386 | .globl s390x_kmo | |
387 | .type s390x_kmo,\@function | |
388 | .align 16 | |
389 | s390x_kmo: | |
390 | lr %r0,$fc | |
391 | l${g}r %r1,$param | |
392 | ||
393 | .long 0xb92b0042 # kmo $out,$in | |
394 | brc 1,.-4 # pay attention to "partial completion" | |
395 | ||
396 | br $ra | |
397 | .size s390x_kmo,.-s390x_kmo | |
398 | ___ | |
399 | } | |
400 | ||
74d38a86 PS |
401 | ################ |
402 | # void s390x_kmf(const unsigned char *in, size_t len, unsigned char *out, | |
403 | # unsigned int fc, void *param) | |
404 | { | |
405 | my ($in,$len,$out,$fc,$param) = map("%r$_",(2..6)); | |
406 | $code.=<<___; | |
407 | .globl s390x_kmf | |
408 | .type s390x_kmf,\@function | |
409 | .align 16 | |
410 | s390x_kmf: | |
411 | lr %r0,$fc | |
412 | l${g}r %r1,$param | |
413 | ||
414 | .long 0xb92a0042 # kmf $out,$in | |
415 | brc 1,.-4 # pay attention to "partial completion" | |
416 | ||
417 | br $ra | |
418 | .size s390x_kmf,.-s390x_kmf | |
419 | ___ | |
420 | } | |
421 | ||
96530eea PS |
422 | ################ |
423 | # void s390x_kma(const unsigned char *aad, size_t alen, | |
424 | # const unsigned char *in, size_t len, | |
425 | # unsigned char *out, unsigned int fc, void *param) | |
426 | { | |
427 | my ($aad,$alen,$in,$len,$out) = map("%r$_",(2..6)); | |
428 | $code.=<<___; | |
429 | .globl s390x_kma | |
430 | .type s390x_kma,\@function | |
431 | .align 16 | |
432 | s390x_kma: | |
433 | st${g} $out,6*$SIZE_T($sp) | |
434 | lm${g} %r0,%r1,$stdframe($sp) | |
435 | ||
436 | .long 0xb9292064 # kma $out,$aad,$in | |
437 | brc 1,.-4 # pay attention to "partial completion" | |
438 | ||
439 | l${g} $out,6*$SIZE_T($sp) | |
440 | br $ra | |
441 | .size s390x_kma,.-s390x_kma | |
442 | ___ | |
443 | } | |
444 | ||
e382f507 | 445 | ################ |
9baa4d5f | 446 | # int s390x_pcc(unsigned int fc, void *param) |
e382f507 PS |
447 | { |
448 | my ($fc,$param) = map("%r$_",(2..3)); | |
449 | $code.=<<___; | |
450 | .globl s390x_pcc | |
451 | .type s390x_pcc,\@function | |
452 | .align 16 | |
453 | s390x_pcc: | |
454 | lr %r0,$fc | |
455 | l${g}r %r1,$param | |
456 | lhi %r2,0 | |
457 | ||
458 | .long 0xb92c0000 # pcc | |
459 | brc 1,.-4 # pay attention to "partial completion" | |
460 | brc 7,.Lpcc_err # if CC==0 return 0, else return 1 | |
461 | .Lpcc_out: | |
462 | br $ra | |
463 | .Lpcc_err: | |
464 | lhi %r2,1 | |
465 | j .Lpcc_out | |
466 | .size s390x_pcc,.-s390x_pcc | |
467 | ___ | |
468 | } | |
469 | ||
470 | ################ | |
9baa4d5f PS |
471 | # int s390x_kdsa(unsigned int fc, void *param, |
472 | # const unsigned char *in, size_t len) | |
e382f507 PS |
473 | { |
474 | my ($fc,$param,$in,$len) = map("%r$_",(2..5)); | |
475 | $code.=<<___; | |
476 | .globl s390x_kdsa | |
477 | .type s390x_kdsa,\@function | |
478 | .align 16 | |
479 | s390x_kdsa: | |
480 | lr %r0,$fc | |
481 | l${g}r %r1,$param | |
482 | lhi %r2,0 | |
483 | ||
484 | .long 0xb93a0004 # kdsa %r0,$in | |
485 | brc 1,.-4 # pay attention to "partial completion" | |
486 | brc 7,.Lkdsa_err # if CC==0 return 0, else return 1 | |
487 | .Lkdsa_out: | |
488 | br $ra | |
489 | .Lkdsa_err: | |
490 | lhi %r2,1 | |
491 | j .Lkdsa_out | |
492 | .size s390x_kdsa,.-s390x_kdsa | |
493 | ___ | |
494 | } | |
495 | ||
96530eea | 496 | $code.=<<___; |
91fdacb2 | 497 | .section .init |
96530eea PS |
498 | brasl $ra,OPENSSL_cpuid_setup |
499 | ___ | |
500 | ||
501 | $code =~ s/\`([^\`]*)\`/eval $1/gem; | |
502 | print $code; | |
503 | close STDOUT; # force flush |