1 #include "s390x_arch.h" 2 3 .text 4 5 .globl OPENSSL_s390x_facilities 6 .type OPENSSL_s390x_facilities,@function 7 .align 16 8 OPENSSL_s390x_facilities: 9 lghi %r0,0 10 larl %r4,OPENSSL_s390xcap_P 11 12 stg %r0,S390X_STFLE+8(%r4) # wipe capability vectors 13 stg %r0,S390X_STFLE+16(%r4) 14 stg %r0,S390X_STFLE+24(%r4) 15 16 .long 0xb2b04000 # stfle 0(%r4) 17 brc 8,.Ldone 18 lghi %r0,1 19 .long 0xb2b04000 # stfle 0(%r4) 20 brc 8,.Ldone 21 lghi %r0,2 22 .long 0xb2b04000 # stfle 0(%r4) 23 .Ldone: 24 br %r14 25 .size OPENSSL_s390x_facilities,.-OPENSSL_s390x_facilities 26 27 .globl OPENSSL_s390x_functions 28 .type OPENSSL_s390x_functions,@function 29 .align 16 30 OPENSSL_s390x_functions: 31 lghi %r0,0 32 larl %r4,OPENSSL_s390xcap_P 33 34 stg %r0,S390X_KIMD(%r4) # wipe capability vectors 35 stg %r0,S390X_KIMD+8(%r4) 36 stg %r0,S390X_KLMD(%r4) 37 stg %r0,S390X_KLMD+8(%r4) 38 stg %r0,S390X_KM(%r4) 39 stg %r0,S390X_KM+8(%r4) 40 stg %r0,S390X_KMC(%r4) 41 stg %r0,S390X_KMC+8(%r4) 42 stg %r0,S390X_KMAC(%r4) 43 stg %r0,S390X_KMAC+8(%r4) 44 stg %r0,S390X_KMCTR(%r4) 45 stg %r0,S390X_KMCTR+8(%r4) 46 stg %r0,S390X_KMO(%r4) 47 stg %r0,S390X_KMO+8(%r4) 48 stg %r0,S390X_KMF(%r4) 49 stg %r0,S390X_KMF+8(%r4) 50 stg %r0,S390X_PRNO(%r4) 51 stg %r0,S390X_PRNO+8(%r4) 52 stg %r0,S390X_KMA(%r4) 53 stg %r0,S390X_KMA+8(%r4) 54 stg %r0,S390X_PCC(%r4) 55 stg %r0,S390X_PCC+8(%r4) 56 stg %r0,S390X_KDSA(%r4) 57 stg %r0,S390X_KDSA+8(%r4) 58 59 lmg %r2,%r3,S390X_STFLE(%r4) 60 61 tmhl %r2,0x4000 # check for message-security-assist 62 jz .Lret 63 64 lghi %r0,S390X_QUERY # query kimd capabilities 65 la %r1,S390X_KIMD(%r4) 66 .long 0xb93e0002 # kimd %r0,%r2 67 68 lghi %r0,S390X_QUERY # query klmd capabilities 69 la %r1,S390X_KLMD(%r4) 70 .long 0xb93f0002 # klmd %r0,%r2 71 72 lghi %r0,S390X_QUERY # query km capability vector 73 la %r1,S390X_KM(%r4) 74 .long 0xb92e0042 # km %r4,%r2 75 76 lghi %r0,S390X_QUERY # query kmc capability vector 77 la %r1,S390X_KMC(%r4) 78 .long 0xb92f0042 # kmc %r4,%r2 79 80 lghi %r0,S390X_QUERY # query kmac capability vector 81 la %r1,S390X_KMAC(%r4) 82 .long 0xb91e0042 # kmac %r4,%r2 83 84 tmhh %r3,0x0008 # check for message-security-assist-3 85 jz .Lret 86 87 lghi %r0,S390X_QUERY # query pcc capability vector 88 la %r1,S390X_PCC(%r4) 89 .long 0xb92c0000 # pcc 90 91 tmhh %r3,0x0004 # check for message-security-assist-4 92 jz .Lret 93 94 lghi %r0,S390X_QUERY # query kmctr capability vector 95 la %r1,S390X_KMCTR(%r4) 96 .long 0xb92d2042 # kmctr %r4,%r2,%r2 97 98 lghi %r0,S390X_QUERY # query kmo capability vector 99 la %r1,S390X_KMO(%r4) 100 .long 0xb92b0042 # kmo %r4,%r2 101 102 lghi %r0,S390X_QUERY # query kmf capability vector 103 la %r1,S390X_KMF(%r4) 104 .long 0xb92a0042 # kmf %r4,%r2 105 106 tml %r2,0x40 # check for message-security-assist-5 107 jz .Lret 108 109 lghi %r0,S390X_QUERY # query prno capability vector 110 la %r1,S390X_PRNO(%r4) 111 .long 0xb93c0042 # prno %r4,%r2 112 113 lg %r2,S390X_STFLE+16(%r4) 114 115 tmhl %r2,0x2000 # check for message-security-assist-8 116 jz .Lret 117 118 lghi %r0,S390X_QUERY # query kma capability vector 119 la %r1,S390X_KMA(%r4) 120 .long 0xb9294022 # kma %r2,%r4,%r2 121 122 tmhl %r2,0x0010 # check for message-security-assist-9 123 jz .Lret 124 125 lghi %r0,S390X_QUERY # query kdsa capability vector 126 la %r1,S390X_KDSA(%r4) 127 .long 0xb93a0002 # kdsa %r0,%r2 128 129 .Lret: 130 br %r14 131 .size OPENSSL_s390x_functions,.-OPENSSL_s390x_functions 132 133 .globl OPENSSL_rdtsc 134 .type OPENSSL_rdtsc,@function 135 .align 16 136 OPENSSL_rdtsc: 137 larl %r4,OPENSSL_s390xcap_P 138 tm S390X_STFLE+3(%r4),0x40 # check for store-clock-fast facility 139 jz .Lstck 140 141 .long 0xb27cf010 # stckf 16(%r15) 142 lg %r2,16(%r15) 143 br %r14 144 .Lstck: 145 stck 16(%r15) 146 lg %r2,16(%r15) 147 br %r14 148 .size OPENSSL_rdtsc,.-OPENSSL_rdtsc 149 150 .globl OPENSSL_atomic_add 151 .type OPENSSL_atomic_add,@function 152 .align 16 153 OPENSSL_atomic_add: 154 l %r1,0(%r2) 155 .Lspin: lr %r0,%r1 156 ar %r0,%r3 157 cs %r1,%r0,0(%r2) 158 brc 4,.Lspin 159 lgfr %r2,%r0 # OpenSSL expects the new value 160 br %r14 161 .size OPENSSL_atomic_add,.-OPENSSL_atomic_add 162 163 .globl OPENSSL_wipe_cpu 164 .type OPENSSL_wipe_cpu,@function 165 .align 16 166 OPENSSL_wipe_cpu: 167 xgr %r0,%r0 168 xgr %r1,%r1 169 lgr %r2,%r15 170 xgr %r3,%r3 171 xgr %r4,%r4 172 lzdr %f0 173 lzdr %f1 174 lzdr %f2 175 lzdr %f3 176 lzdr %f4 177 lzdr %f5 178 lzdr %f6 179 lzdr %f7 180 br %r14 181 .size OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu 182 183 .globl OPENSSL_cleanse 184 .type OPENSSL_cleanse,@function 185 .align 16 186 OPENSSL_cleanse: 187 #if !defined(__s390x__) && !defined(__s390x) 188 llgfr %r3,%r3 189 #endif 190 lghi %r4,15 191 lghi %r0,0 192 clgr %r3,%r4 193 jh .Lot 194 clgr %r3,%r0 195 bcr 8,%r14 196 .Little: 197 stc %r0,0(%r2) 198 la %r2,1(%r2) 199 brctg %r3,.Little 200 br %r14 201 .align 4 202 .Lot: tmll %r2,7 203 jz .Laligned 204 stc %r0,0(%r2) 205 la %r2,1(%r2) 206 brctg %r3,.Lot 207 .Laligned: 208 srlg %r4,%r3,3 209 .Loop: stg %r0,0(%r2) 210 la %r2,8(%r2) 211 brctg %r4,.Loop 212 lghi %r4,7 213 ngr %r3,%r4 214 jnz .Little 215 br %r14 216 .size OPENSSL_cleanse,.-OPENSSL_cleanse 217 218 .globl CRYPTO_memcmp 219 .type CRYPTO_memcmp,@function 220 .align 16 221 CRYPTO_memcmp: 222 #if !defined(__s390x__) && !defined(__s390x) 223 llgfr %r4,%r4 224 #endif 225 lghi %r5,0 226 clgr %r4,%r5 227 je .Lno_data 228 229 .Loop_cmp: 230 llgc %r0,0(%r2) 231 la %r2,1(%r2) 232 llgc %r1,0(%r3) 233 la %r3,1(%r3) 234 xr %r1,%r0 235 or %r5,%r1 236 brctg %r4,.Loop_cmp 237 238 lnr %r5,%r5 239 srl %r5,31 240 .Lno_data: 241 lgr %r2,%r5 242 br %r14 243 .size CRYPTO_memcmp,.-CRYPTO_memcmp 244 245 .globl OPENSSL_instrument_bus 246 .type OPENSSL_instrument_bus,@function 247 .align 16 248 OPENSSL_instrument_bus: 249 lghi %r2,0 250 br %r14 251 .size OPENSSL_instrument_bus,.-OPENSSL_instrument_bus 252 253 .globl OPENSSL_instrument_bus2 254 .type OPENSSL_instrument_bus2,@function 255 .align 16 256 OPENSSL_instrument_bus2: 257 lghi %r2,0 258 br %r14 259 .size OPENSSL_instrument_bus2,.-OPENSSL_instrument_bus2 260 261 .globl OPENSSL_vx_probe 262 .type OPENSSL_vx_probe,@function 263 .align 16 264 OPENSSL_vx_probe: 265 .word 0xe700,0x0000,0x0044 # vzero %v0 266 br %r14 267 .size OPENSSL_vx_probe,.-OPENSSL_vx_probe 268 .globl s390x_kimd 269 .type s390x_kimd,@function 270 .align 16 271 s390x_kimd: 272 llgfr %r0,%r4 273 lgr %r1,%r5 274 275 .long 0xb93e0002 # kimd %r0,%r2 276 brc 1,.-4 # pay attention to "partial completion" 277 278 br %r14 279 .size s390x_kimd,.-s390x_kimd 280 .globl s390x_klmd 281 .type s390x_klmd,@function 282 .align 32 283 s390x_klmd: 284 llgfr %r0,%r6 285 lg %r1,160(%r15) 286 287 .long 0xb93f0042 # klmd %r4,%r2 288 brc 1,.-4 # pay attention to "partial completion" 289 290 br %r14 291 .size s390x_klmd,.-s390x_klmd 292 .globl s390x_km 293 .type s390x_km,@function 294 .align 16 295 s390x_km: 296 lr %r0,%r5 297 lgr %r1,%r6 298 299 .long 0xb92e0042 # km %r4,%r2 300 brc 1,.-4 # pay attention to "partial completion" 301 302 br %r14 303 .size s390x_km,.-s390x_km 304 .globl s390x_kmac 305 .type s390x_kmac,@function 306 .align 16 307 s390x_kmac: 308 lr %r0,%r4 309 lgr %r1,%r5 310 311 .long 0xb91e0002 # kmac %r0,%r2 312 brc 1,.-4 # pay attention to "partial completion" 313 314 br %r14 315 .size s390x_kmac,.-s390x_kmac 316 .globl s390x_kmo 317 .type s390x_kmo,@function 318 .align 16 319 s390x_kmo: 320 lr %r0,%r5 321 lgr %r1,%r6 322 323 .long 0xb92b0042 # kmo %r4,%r2 324 brc 1,.-4 # pay attention to "partial completion" 325 326 br %r14 327 .size s390x_kmo,.-s390x_kmo 328 .globl s390x_kmf 329 .type s390x_kmf,@function 330 .align 16 331 s390x_kmf: 332 lr %r0,%r5 333 lgr %r1,%r6 334 335 .long 0xb92a0042 # kmf %r4,%r2 336 brc 1,.-4 # pay attention to "partial completion" 337 338 br %r14 339 .size s390x_kmf,.-s390x_kmf 340 .globl s390x_kma 341 .type s390x_kma,@function 342 .align 16 343 s390x_kma: 344 stg %r6,6*8(%r15) 345 lmg %r0,%r1,160(%r15) 346 347 .long 0xb9292064 # kma %r6,%r2,%r4 348 brc 1,.-4 # pay attention to "partial completion" 349 350 lg %r6,6*8(%r15) 351 br %r14 352 .size s390x_kma,.-s390x_kma 353 .globl s390x_pcc 354 .type s390x_pcc,@function 355 .align 16 356 s390x_pcc: 357 lr %r0,%r2 358 lgr %r1,%r3 359 lhi %r2,0 360 361 .long 0xb92c0000 # pcc 362 brc 1,.-4 # pay attention to "partial completion" 363 brc 7,.Lpcc_err # if CC==0 return 0, else return 1 364 .Lpcc_out: 365 br %r14 366 .Lpcc_err: 367 lhi %r2,1 368 j .Lpcc_out 369 .size s390x_pcc,.-s390x_pcc 370 .globl s390x_kdsa 371 .type s390x_kdsa,@function 372 .align 16 373 s390x_kdsa: 374 lr %r0,%r2 375 lgr %r1,%r3 376 lhi %r2,0 377 378 .long 0xb93a0004 # kdsa %r0,%r4 379 brc 1,.-4 # pay attention to "partial completion" 380 brc 7,.Lkdsa_err # if CC==0 return 0, else return 1 381 .Lkdsa_out: 382 br %r14 383 .Lkdsa_err: 384 lhi %r2,1 385 j .Lkdsa_out 386 .size s390x_kdsa,.-s390x_kdsa 387 .globl s390x_flip_endian32 388 .type s390x_flip_endian32,@function 389 .align 16 390 s390x_flip_endian32: 391 lrvg %r0,0(%r3) 392 lrvg %r1,8(%r3) 393 lrvg %r4,16(%r3) 394 lrvg %r5,24(%r3) 395 stg %r0,24(%r2) 396 stg %r1,16(%r2) 397 stg %r4,8(%r2) 398 stg %r5,0(%r2) 399 br %r14 400 .size s390x_flip_endian32,.-s390x_flip_endian32 401 .globl s390x_flip_endian64 402 .type s390x_flip_endian64,@function 403 .align 16 404 s390x_flip_endian64: 405 stmg %r6,%r9,6*8(%r15) 406 407 lrvg %r0,0(%r3) 408 lrvg %r1,8(%r3) 409 lrvg %r4,16(%r3) 410 lrvg %r5,24(%r3) 411 lrvg %r6,32(%r3) 412 lrvg %r7,40(%r3) 413 lrvg %r8,48(%r3) 414 lrvg %r9,56(%r3) 415 stg %r0,56(%r2) 416 stg %r1,48(%r2) 417 stg %r4,40(%r2) 418 stg %r5,32(%r2) 419 stg %r6,24(%r2) 420 stg %r7,16(%r2) 421 stg %r8,8(%r2) 422 stg %r9,0(%r2) 423 424 lmg %r6,%r9,6*8(%r15) 425 br %r14 426 .size s390x_flip_endian64,.-s390x_flip_endian64 427 .section .init 428 brasl %r14,OPENSSL_cpuid_setup 429