CORE: query for operations only once per provider (unless no_store is true)
[openssl.git] / crypto / s390xcpuid.pl
index 36f742068bb87df60d32221a22665a1e7d153061..560a2f09e97eb9412db78cc2bb8ff768af901fac 100755 (executable)
@@ -1,5 +1,5 @@
 #! /usr/bin/env perl
-# Copyright 2009-2018 The OpenSSL Project Authors. All Rights Reserved.
+# Copyright 2009-2020 The OpenSSL Project Authors. All Rights Reserved.
 #
 # Licensed under the Apache License 2.0 (the "License").  You may not use
 # this file except in compliance with the License.  You can obtain a copy
@@ -109,7 +109,7 @@ OPENSSL_s390x_functions:
        la      %r1,S390X_KMAC(%r4)
        .long   0xb91e0042              # kmac %r4,%r2
 
-       tmhh    %r3,0x0003              # check for message-security-assist-3
+       tmhh    %r3,0x0008              # check for message-security-assist-3
        jz      .Lret
 
        lghi    %r0,S390X_QUERY         # query pcc capability vector
@@ -495,6 +495,62 @@ s390x_kdsa:
 ___
 }
 
+################
+# void s390x_flip_endian32(unsigned char dst[32], const unsigned char src[32])
+{
+my ($dst,$src) = map("%r$_",(2..3));
+$code.=<<___;
+.globl s390x_flip_endian32
+.type  s390x_flip_endian32,\@function
+.align 16
+s390x_flip_endian32:
+       lrvg    %r0,0($src)
+       lrvg    %r1,8($src)
+       lrvg    %r4,16($src)
+       lrvg    %r5,24($src)
+       stg     %r0,24($dst)
+       stg     %r1,16($dst)
+       stg     %r4,8($dst)
+       stg     %r5,0($dst)
+       br      $ra
+.size  s390x_flip_endian32,.-s390x_flip_endian32
+___
+}
+
+################
+# void s390x_flip_endian64(unsigned char dst[64], const unsigned char src[64])
+{
+my ($dst,$src) = map("%r$_",(2..3));
+$code.=<<___;
+.globl s390x_flip_endian64
+.type  s390x_flip_endian64,\@function
+.align 16
+s390x_flip_endian64:
+       stmg    %r6,%r9,6*$SIZE_T($sp)
+
+       lrvg    %r0,0($src)
+       lrvg    %r1,8($src)
+       lrvg    %r4,16($src)
+       lrvg    %r5,24($src)
+       lrvg    %r6,32($src)
+       lrvg    %r7,40($src)
+       lrvg    %r8,48($src)
+       lrvg    %r9,56($src)
+       stg     %r0,56($dst)
+       stg     %r1,48($dst)
+       stg     %r4,40($dst)
+       stg     %r5,32($dst)
+       stg     %r6,24($dst)
+       stg     %r7,16($dst)
+       stg     %r8,8($dst)
+       stg     %r9,0($dst)
+
+       lmg     %r6,%r9,6*$SIZE_T($sp)
+       br      $ra
+.size  s390x_flip_endian64,.-s390x_flip_endian64
+___
+}
+
 $code.=<<___;
 .section       .init
        brasl   $ra,OPENSSL_cpuid_setup
@@ -502,4 +558,4 @@ ___
 
 $code =~ s/\`([^\`]*)\`/eval $1/gem;
 print $code;
-close STDOUT;  # force flush
+close STDOUT or die "error closing STDOUT: $!";        # force flush