| lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 1 | #! /usr/bin/env perl | 
|  | 2 | # Copyright 2009-2020 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 | 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) | 
|  | 63 | brc	8,.Ldone | 
|  | 64 | lghi	%r0,1 | 
|  | 65 | .long	0xb2b04000		# stfle 0(%r4) | 
|  | 66 | brc	8,.Ldone | 
|  | 67 | lghi	%r0,2 | 
|  | 68 | .long	0xb2b04000		# stfle 0(%r4) | 
|  | 69 | .Ldone: | 
|  | 70 | lmg	%r2,%r3,S390X_STFLE(%r4) | 
|  | 71 | tmhl	%r2,0x4000		# check for message-security-assist | 
|  | 72 | jz	.Lret | 
|  | 73 |  | 
|  | 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 | 
|  | 85 |  | 
|  | 86 | lghi	%r0,S390X_QUERY		# query kmc capability vector | 
|  | 87 | la	%r1,S390X_KMC(%r4) | 
|  | 88 | .long	0xb92f0042		# kmc %r4,%r2 | 
|  | 89 |  | 
|  | 90 | lghi	%r0,S390X_QUERY		# query kmac capability vector | 
|  | 91 | la	%r1,S390X_KMAC(%r4) | 
|  | 92 | .long	0xb91e0042		# kmac %r4,%r2 | 
|  | 93 |  | 
|  | 94 | tmhh	%r3,0x0004		# check for message-security-assist-4 | 
|  | 95 | jz	.Lret | 
|  | 96 |  | 
|  | 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 | 
|  | 123 |  | 
|  | 124 | .Lret: | 
|  | 125 | br	$ra | 
|  | 126 | .size	OPENSSL_s390x_facilities,.-OPENSSL_s390x_facilities | 
|  | 127 |  | 
|  | 128 | .globl	OPENSSL_rdtsc | 
|  | 129 | .type	OPENSSL_rdtsc,\@function | 
|  | 130 | .align	16 | 
|  | 131 | OPENSSL_rdtsc: | 
|  | 132 | larl	%r4,OPENSSL_s390xcap_P | 
|  | 133 | tm	S390X_STFLE+3(%r4),0x40	# check for store-clock-fast facility | 
|  | 134 | jz	.Lstck | 
|  | 135 |  | 
|  | 136 | .long	0xb27cf010	# stckf 16($sp) | 
|  | 137 | lg	%r2,16($sp) | 
|  | 138 | br	$ra | 
|  | 139 | .Lstck: | 
|  | 140 | stck	16($sp) | 
|  | 141 | lg	%r2,16($sp) | 
|  | 142 | br	$ra | 
|  | 143 | .size	OPENSSL_rdtsc,.-OPENSSL_rdtsc | 
|  | 144 |  | 
|  | 145 | .globl	OPENSSL_atomic_add | 
|  | 146 | .type	OPENSSL_atomic_add,\@function | 
|  | 147 | .align	16 | 
|  | 148 | OPENSSL_atomic_add: | 
|  | 149 | l	%r1,0(%r2) | 
|  | 150 | .Lspin:	lr	%r0,%r1 | 
|  | 151 | ar	%r0,%r3 | 
|  | 152 | cs	%r1,%r0,0(%r2) | 
|  | 153 | brc	4,.Lspin | 
|  | 154 | lgfr	%r2,%r0		# OpenSSL expects the new value | 
|  | 155 | br	$ra | 
|  | 156 | .size	OPENSSL_atomic_add,.-OPENSSL_atomic_add | 
|  | 157 |  | 
|  | 158 | .globl	OPENSSL_wipe_cpu | 
|  | 159 | .type	OPENSSL_wipe_cpu,\@function | 
|  | 160 | .align	16 | 
|  | 161 | OPENSSL_wipe_cpu: | 
|  | 162 | xgr	%r0,%r0 | 
|  | 163 | xgr	%r1,%r1 | 
|  | 164 | lgr	%r2,$sp | 
|  | 165 | xgr	%r3,%r3 | 
|  | 166 | xgr	%r4,%r4 | 
|  | 167 | lzdr	%f0 | 
|  | 168 | lzdr	%f1 | 
|  | 169 | lzdr	%f2 | 
|  | 170 | lzdr	%f3 | 
|  | 171 | lzdr	%f4 | 
|  | 172 | lzdr	%f5 | 
|  | 173 | lzdr	%f6 | 
|  | 174 | lzdr	%f7 | 
|  | 175 | br	$ra | 
|  | 176 | .size	OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu | 
|  | 177 |  | 
|  | 178 | .globl	OPENSSL_cleanse | 
|  | 179 | .type	OPENSSL_cleanse,\@function | 
|  | 180 | .align	16 | 
|  | 181 | OPENSSL_cleanse: | 
|  | 182 | #if !defined(__s390x__) && !defined(__s390x) | 
|  | 183 | llgfr	%r3,%r3 | 
|  | 184 | #endif | 
|  | 185 | lghi	%r4,15 | 
|  | 186 | lghi	%r0,0 | 
|  | 187 | clgr	%r3,%r4 | 
|  | 188 | jh	.Lot | 
|  | 189 | clgr	%r3,%r0 | 
|  | 190 | bcr	8,%r14 | 
|  | 191 | .Little: | 
|  | 192 | stc	%r0,0(%r2) | 
|  | 193 | la	%r2,1(%r2) | 
|  | 194 | brctg	%r3,.Little | 
|  | 195 | br	%r14 | 
|  | 196 | .align	4 | 
|  | 197 | .Lot:	tmll	%r2,7 | 
|  | 198 | jz	.Laligned | 
|  | 199 | stc	%r0,0(%r2) | 
|  | 200 | la	%r2,1(%r2) | 
|  | 201 | brctg	%r3,.Lot | 
|  | 202 | .Laligned: | 
|  | 203 | srlg	%r4,%r3,3 | 
|  | 204 | .Loop:	stg	%r0,0(%r2) | 
|  | 205 | la	%r2,8(%r2) | 
|  | 206 | brctg	%r4,.Loop | 
|  | 207 | lghi	%r4,7 | 
|  | 208 | ngr	%r3,%r4 | 
|  | 209 | jnz	.Little | 
|  | 210 | br	$ra | 
|  | 211 | .size	OPENSSL_cleanse,.-OPENSSL_cleanse | 
|  | 212 |  | 
|  | 213 | .globl	CRYPTO_memcmp | 
|  | 214 | .type	CRYPTO_memcmp,\@function | 
|  | 215 | .align	16 | 
|  | 216 | CRYPTO_memcmp: | 
|  | 217 | #if !defined(__s390x__) && !defined(__s390x) | 
|  | 218 | llgfr	%r4,%r4 | 
|  | 219 | #endif | 
|  | 220 | lghi	%r5,0 | 
|  | 221 | clgr	%r4,%r5 | 
|  | 222 | je	.Lno_data | 
|  | 223 |  | 
|  | 224 | .Loop_cmp: | 
|  | 225 | llgc	%r0,0(%r2) | 
|  | 226 | la	%r2,1(%r2) | 
|  | 227 | llgc	%r1,0(%r3) | 
|  | 228 | la	%r3,1(%r3) | 
|  | 229 | xr	%r1,%r0 | 
|  | 230 | or	%r5,%r1 | 
|  | 231 | brctg	%r4,.Loop_cmp | 
|  | 232 |  | 
|  | 233 | lnr	%r5,%r5 | 
|  | 234 | srl	%r5,31 | 
|  | 235 | .Lno_data: | 
|  | 236 | lgr	%r2,%r5 | 
|  | 237 | br	$ra | 
|  | 238 | .size	CRYPTO_memcmp,.-CRYPTO_memcmp | 
|  | 239 |  | 
|  | 240 | .globl	OPENSSL_instrument_bus | 
|  | 241 | .type	OPENSSL_instrument_bus,\@function | 
|  | 242 | .align	16 | 
|  | 243 | OPENSSL_instrument_bus: | 
|  | 244 | lghi	%r2,0 | 
|  | 245 | br	%r14 | 
|  | 246 | .size	OPENSSL_instrument_bus,.-OPENSSL_instrument_bus | 
|  | 247 |  | 
|  | 248 | .globl	OPENSSL_instrument_bus2 | 
|  | 249 | .type	OPENSSL_instrument_bus2,\@function | 
|  | 250 | .align	16 | 
|  | 251 | OPENSSL_instrument_bus2: | 
|  | 252 | lghi	%r2,0 | 
|  | 253 | br	$ra | 
|  | 254 | .size	OPENSSL_instrument_bus2,.-OPENSSL_instrument_bus2 | 
|  | 255 |  | 
|  | 256 | .globl	OPENSSL_vx_probe | 
|  | 257 | .type	OPENSSL_vx_probe,\@function | 
|  | 258 | .align	16 | 
|  | 259 | OPENSSL_vx_probe: | 
|  | 260 | .word	0xe700,0x0000,0x0044	# vzero %v0 | 
|  | 261 | br	$ra | 
|  | 262 | .size	OPENSSL_vx_probe,.-OPENSSL_vx_probe | 
|  | 263 | ___ | 
|  | 264 |  | 
|  | 265 | { | 
|  | 266 | ################ | 
|  | 267 | # void s390x_kimd(const unsigned char *in, size_t len, unsigned int fc, | 
|  | 268 | #                 void *param) | 
|  | 269 | my ($in,$len,$fc,$param) = map("%r$_",(2..5)); | 
|  | 270 | $code.=<<___; | 
|  | 271 | .globl	s390x_kimd | 
|  | 272 | .type	s390x_kimd,\@function | 
|  | 273 | .align	16 | 
|  | 274 | s390x_kimd: | 
|  | 275 | llgfr	%r0,$fc | 
|  | 276 | lgr	%r1,$param | 
|  | 277 |  | 
|  | 278 | .long	0xb93e0002	# kimd %r0,%r2 | 
|  | 279 | brc	1,.-4		# pay attention to "partial completion" | 
|  | 280 |  | 
|  | 281 | br	$ra | 
|  | 282 | .size	s390x_kimd,.-s390x_kimd | 
|  | 283 | ___ | 
|  | 284 | } | 
|  | 285 |  | 
|  | 286 | { | 
|  | 287 | ################ | 
|  | 288 | # void s390x_klmd(const unsigned char *in, size_t inlen, unsigned char *out, | 
|  | 289 | #                 size_t outlen, unsigned int fc, void *param) | 
|  | 290 | my ($in,$inlen,$out,$outlen,$fc) = map("%r$_",(2..6)); | 
|  | 291 | $code.=<<___; | 
|  | 292 | .globl	s390x_klmd | 
|  | 293 | .type	s390x_klmd,\@function | 
|  | 294 | .align	32 | 
|  | 295 | s390x_klmd: | 
|  | 296 | llgfr	%r0,$fc | 
|  | 297 | l${g}	%r1,$stdframe($sp) | 
|  | 298 |  | 
|  | 299 | .long	0xb93f0042	# klmd %r4,%r2 | 
|  | 300 | brc	1,.-4		# pay attention to "partial completion" | 
|  | 301 |  | 
|  | 302 | br	$ra | 
|  | 303 | .size	s390x_klmd,.-s390x_klmd | 
|  | 304 | ___ | 
|  | 305 | } | 
|  | 306 |  | 
|  | 307 | ################ | 
|  | 308 | # void s390x_km(const unsigned char *in, size_t len, unsigned char *out, | 
|  | 309 | #               unsigned int fc, void *param) | 
|  | 310 | { | 
|  | 311 | my ($in,$len,$out,$fc,$param) = map("%r$_",(2..6)); | 
|  | 312 | $code.=<<___; | 
|  | 313 | .globl	s390x_km | 
|  | 314 | .type	s390x_km,\@function | 
|  | 315 | .align	16 | 
|  | 316 | s390x_km: | 
|  | 317 | lr	%r0,$fc | 
|  | 318 | l${g}r	%r1,$param | 
|  | 319 |  | 
|  | 320 | .long	0xb92e0042	# km $out,$in | 
|  | 321 | brc	1,.-4		# pay attention to "partial completion" | 
|  | 322 |  | 
|  | 323 | br	$ra | 
|  | 324 | .size	s390x_km,.-s390x_km | 
|  | 325 | ___ | 
|  | 326 | } | 
|  | 327 |  | 
|  | 328 | ################ | 
|  | 329 | # void s390x_kmac(const unsigned char *in, size_t len, unsigned int fc, | 
|  | 330 | #                 void *param) | 
|  | 331 | { | 
|  | 332 | my ($in,$len,$fc,$param) = map("%r$_",(2..5)); | 
|  | 333 | $code.=<<___; | 
|  | 334 | .globl	s390x_kmac | 
|  | 335 | .type	s390x_kmac,\@function | 
|  | 336 | .align	16 | 
|  | 337 | s390x_kmac: | 
|  | 338 | lr	%r0,$fc | 
|  | 339 | l${g}r	%r1,$param | 
|  | 340 |  | 
|  | 341 | .long	0xb91e0002	# kmac %r0,$in | 
|  | 342 | brc	1,.-4		# pay attention to "partial completion" | 
|  | 343 |  | 
|  | 344 | br	$ra | 
|  | 345 | .size	s390x_kmac,.-s390x_kmac | 
|  | 346 | ___ | 
|  | 347 | } | 
|  | 348 |  | 
|  | 349 | ################ | 
|  | 350 | # void s390x_kmo(const unsigned char *in, size_t len, unsigned char *out, | 
|  | 351 | #                unsigned int fc, void *param) | 
|  | 352 | { | 
|  | 353 | my ($in,$len,$out,$fc,$param) = map("%r$_",(2..6)); | 
|  | 354 | $code.=<<___; | 
|  | 355 | .globl	s390x_kmo | 
|  | 356 | .type	s390x_kmo,\@function | 
|  | 357 | .align	16 | 
|  | 358 | s390x_kmo: | 
|  | 359 | lr	%r0,$fc | 
|  | 360 | l${g}r	%r1,$param | 
|  | 361 |  | 
|  | 362 | .long	0xb92b0042	# kmo $out,$in | 
|  | 363 | brc	1,.-4		# pay attention to "partial completion" | 
|  | 364 |  | 
|  | 365 | br	$ra | 
|  | 366 | .size	s390x_kmo,.-s390x_kmo | 
|  | 367 | ___ | 
|  | 368 | } | 
|  | 369 |  | 
|  | 370 | ################ | 
|  | 371 | # void s390x_kmf(const unsigned char *in, size_t len, unsigned char *out, | 
|  | 372 | #                unsigned int fc, void *param) | 
|  | 373 | { | 
|  | 374 | my ($in,$len,$out,$fc,$param) = map("%r$_",(2..6)); | 
|  | 375 | $code.=<<___; | 
|  | 376 | .globl	s390x_kmf | 
|  | 377 | .type	s390x_kmf,\@function | 
|  | 378 | .align	16 | 
|  | 379 | s390x_kmf: | 
|  | 380 | lr	%r0,$fc | 
|  | 381 | l${g}r	%r1,$param | 
|  | 382 |  | 
|  | 383 | .long	0xb92a0042	# kmf $out,$in | 
|  | 384 | brc	1,.-4		# pay attention to "partial completion" | 
|  | 385 |  | 
|  | 386 | br	$ra | 
|  | 387 | .size	s390x_kmf,.-s390x_kmf | 
|  | 388 | ___ | 
|  | 389 | } | 
|  | 390 |  | 
|  | 391 | ################ | 
|  | 392 | # void s390x_kma(const unsigned char *aad, size_t alen, | 
|  | 393 | #                const unsigned char *in, size_t len, | 
|  | 394 | #                unsigned char *out, unsigned int fc, void *param) | 
|  | 395 | { | 
|  | 396 | my ($aad,$alen,$in,$len,$out) = map("%r$_",(2..6)); | 
|  | 397 | $code.=<<___; | 
|  | 398 | .globl	s390x_kma | 
|  | 399 | .type	s390x_kma,\@function | 
|  | 400 | .align	16 | 
|  | 401 | s390x_kma: | 
|  | 402 | st${g}	$out,6*$SIZE_T($sp) | 
|  | 403 | lm${g}	%r0,%r1,$stdframe($sp) | 
|  | 404 |  | 
|  | 405 | .long	0xb9292064	# kma $out,$aad,$in | 
|  | 406 | brc	1,.-4		# pay attention to "partial completion" | 
|  | 407 |  | 
|  | 408 | l${g}	$out,6*$SIZE_T($sp) | 
|  | 409 | br	$ra | 
|  | 410 | .size	s390x_kma,.-s390x_kma | 
|  | 411 | ___ | 
|  | 412 | } | 
|  | 413 |  | 
|  | 414 | $code.=<<___; | 
|  | 415 | .section	.init | 
|  | 416 | brasl	$ra,OPENSSL_cpuid_setup | 
|  | 417 | ___ | 
|  | 418 |  | 
|  | 419 | $code =~ s/\`([^\`]*)\`/eval $1/gem; | 
|  | 420 | print $code; | 
|  | 421 | close STDOUT or die "error closing STDOUT: $!";	# force flush |