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 |