crypto/bio/build.info: split the source files in categories
[openssl.git] / crypto / s390xcpuid.pl
index 03e89a4b67ed773cd1b1ba4d6c3cb4ebcdd9a6e8..ac0c5b48cbbf90f18f79fb7ce0ed8d3535ab46c2 100755 (executable)
@@ -1,12 +1,15 @@
 #! /usr/bin/env perl
-# Copyright 2009-2017 The OpenSSL Project Authors. All Rights Reserved.
+# Copyright 2009-2018 The OpenSSL Project Authors. All Rights Reserved.
 #
-# Licensed under the OpenSSL license (the "License").  You may not use
+# 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
 # in the file LICENSE in the source distribution or at
 # https://www.openssl.org/source/license.html
 
-$flavour = shift;
+# $output is the last argument if it looks like a file (it has an extension)
+# $flavour is the first argument if it doesn't look like a file
+$output = $#ARGV >= 0 && $ARGV[$#ARGV] =~ m|\.\w+$| ? pop : undef;
+$flavour = $#ARGV >= 0 && $ARGV[0] !~ m|\.| ? shift : undef;
 
 if ($flavour =~ /3[12]/) {
        $SIZE_T=4;
@@ -16,8 +19,7 @@ if ($flavour =~ /3[12]/) {
        $g="g";
 }
 
-while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {}
-open STDOUT,">$output";
+$output and open STDOUT,">$output";
 
 $ra="%r14";
 $sp="%r15";
@@ -38,7 +40,26 @@ OPENSSL_s390x_facilities:
        stg     %r0,S390X_STFLE+8(%r4)  # wipe capability vectors
        stg     %r0,S390X_STFLE+16(%r4)
        stg     %r0,S390X_STFLE+24(%r4)
-       stg     %r0,S390X_KIMD(%r4)
+
+       .long   0xb2b04000              # stfle 0(%r4)
+       brc     8,.Ldone
+       lghi    %r0,1
+       .long   0xb2b04000              # stfle 0(%r4)
+       brc     8,.Ldone
+       lghi    %r0,2
+       .long   0xb2b04000              # stfle 0(%r4)
+.Ldone:
+       br      $ra
+.size  OPENSSL_s390x_facilities,.-OPENSSL_s390x_facilities
+
+.globl OPENSSL_s390x_functions
+.type  OPENSSL_s390x_functions,\@function
+.align 16
+OPENSSL_s390x_functions:
+       lghi    %r0,0
+       larl    %r4,OPENSSL_s390xcap_P
+
+       stg     %r0,S390X_KIMD(%r4)     # wipe capability vectors
        stg     %r0,S390X_KIMD+8(%r4)
        stg     %r0,S390X_KLMD(%r4)
        stg     %r0,S390X_KLMD+8(%r4)
@@ -58,16 +79,13 @@ OPENSSL_s390x_facilities:
        stg     %r0,S390X_PRNO+8(%r4)
        stg     %r0,S390X_KMA(%r4)
        stg     %r0,S390X_KMA+8(%r4)
+       stg     %r0,S390X_PCC(%r4)
+       stg     %r0,S390X_PCC+8(%r4)
+       stg     %r0,S390X_KDSA(%r4)
+       stg     %r0,S390X_KDSA+8(%r4)
 
-       .long   0xb2b04000              # stfle 0(%r4)
-       brc     8,.Ldone
-       lghi    %r0,1
-       .long   0xb2b04000              # stfle 0(%r4)
-       brc     8,.Ldone
-       lghi    %r0,2
-       .long   0xb2b04000              # stfle 0(%r4)
-.Ldone:
        lmg     %r2,%r3,S390X_STFLE(%r4)
+
        tmhl    %r2,0x4000              # check for message-security-assist
        jz      .Lret
 
@@ -91,6 +109,13 @@ OPENSSL_s390x_facilities:
        la      %r1,S390X_KMAC(%r4)
        .long   0xb91e0042              # kmac %r4,%r2
 
+       tmhh    %r3,0x0008              # check for message-security-assist-3
+       jz      .Lret
+
+       lghi    %r0,S390X_QUERY         # query pcc capability vector
+       la      %r1,S390X_PCC(%r4)
+       .long   0xb92c0000              # pcc
+
        tmhh    %r3,0x0004              # check for message-security-assist-4
        jz      .Lret
 
@@ -114,6 +139,7 @@ OPENSSL_s390x_facilities:
        .long   0xb93c0042              # prno %r4,%r2
 
        lg      %r2,S390X_STFLE+16(%r4)
+
        tmhl    %r2,0x2000              # check for message-security-assist-8
        jz      .Lret
 
@@ -121,14 +147,29 @@ OPENSSL_s390x_facilities:
        la      %r1,S390X_KMA(%r4)
        .long   0xb9294022              # kma %r2,%r4,%r2
 
+       tmhl    %r2,0x0010              # check for message-security-assist-9
+       jz      .Lret
+
+       lghi    %r0,S390X_QUERY         # query kdsa capability vector
+       la      %r1,S390X_KDSA(%r4)
+       .long   0xb93a0002              # kdsa %r0,%r2
+
 .Lret:
        br      $ra
-.size  OPENSSL_s390x_facilities,.-OPENSSL_s390x_facilities
+.size  OPENSSL_s390x_functions,.-OPENSSL_s390x_functions
 
 .globl OPENSSL_rdtsc
 .type  OPENSSL_rdtsc,\@function
 .align 16
 OPENSSL_rdtsc:
+       larl    %r4,OPENSSL_s390xcap_P
+       tm      S390X_STFLE+3(%r4),0x40 # check for store-clock-fast facility
+       jz      .Lstck
+
+       .long   0xb27cf010      # stckf 16($sp)
+       lg      %r2,16($sp)
+       br      $ra
+.Lstck:
        stck    16($sp)
        lg      %r2,16($sp)
        br      $ra
@@ -254,6 +295,48 @@ OPENSSL_vx_probe:
 .size  OPENSSL_vx_probe,.-OPENSSL_vx_probe
 ___
 
+{
+################
+# void s390x_kimd(const unsigned char *in, size_t len, unsigned int fc,
+#                 void *param)
+my ($in,$len,$fc,$param) = map("%r$_",(2..5));
+$code.=<<___;
+.globl s390x_kimd
+.type  s390x_kimd,\@function
+.align 16
+s390x_kimd:
+       llgfr   %r0,$fc
+       lgr     %r1,$param
+
+       .long   0xb93e0002      # kimd %r0,%r2
+       brc     1,.-4           # pay attention to "partial completion"
+
+       br      $ra
+.size  s390x_kimd,.-s390x_kimd
+___
+}
+
+{
+################
+# void s390x_klmd(const unsigned char *in, size_t inlen, unsigned char *out,
+#                 size_t outlen, unsigned int fc, void *param)
+my ($in,$inlen,$out,$outlen,$fc) = map("%r$_",(2..6));
+$code.=<<___;
+.globl s390x_klmd
+.type  s390x_klmd,\@function
+.align 32
+s390x_klmd:
+       llgfr   %r0,$fc
+       l${g}   %r1,$stdframe($sp)
+
+       .long   0xb93f0042      # klmd %r4,%r2
+       brc     1,.-4           # pay attention to "partial completion"
+
+       br      $ra
+.size  s390x_klmd,.-s390x_klmd
+___
+}
+
 ################
 # void s390x_km(const unsigned char *in, size_t len, unsigned char *out,
 #               unsigned int fc, void *param)
@@ -275,6 +358,69 @@ s390x_km:
 ___
 }
 
+################
+# void s390x_kmac(const unsigned char *in, size_t len, unsigned int fc,
+#                 void *param)
+{
+my ($in,$len,$fc,$param) = map("%r$_",(2..5));
+$code.=<<___;
+.globl s390x_kmac
+.type  s390x_kmac,\@function
+.align 16
+s390x_kmac:
+       lr      %r0,$fc
+       l${g}r  %r1,$param
+
+       .long   0xb91e0002      # kmac %r0,$in
+       brc     1,.-4           # pay attention to "partial completion"
+
+       br      $ra
+.size  s390x_kmac,.-s390x_kmac
+___
+}
+
+################
+# void s390x_kmo(const unsigned char *in, size_t len, unsigned char *out,
+#                unsigned int fc, void *param)
+{
+my ($in,$len,$out,$fc,$param) = map("%r$_",(2..6));
+$code.=<<___;
+.globl s390x_kmo
+.type  s390x_kmo,\@function
+.align 16
+s390x_kmo:
+       lr      %r0,$fc
+       l${g}r  %r1,$param
+
+       .long   0xb92b0042      # kmo $out,$in
+       brc     1,.-4           # pay attention to "partial completion"
+
+       br      $ra
+.size  s390x_kmo,.-s390x_kmo
+___
+}
+
+################
+# void s390x_kmf(const unsigned char *in, size_t len, unsigned char *out,
+#                unsigned int fc, void *param)
+{
+my ($in,$len,$out,$fc,$param) = map("%r$_",(2..6));
+$code.=<<___;
+.globl s390x_kmf
+.type  s390x_kmf,\@function
+.align 16
+s390x_kmf:
+       lr      %r0,$fc
+       l${g}r  %r1,$param
+
+       .long   0xb92a0042      # kmf $out,$in
+       brc     1,.-4           # pay attention to "partial completion"
+
+       br      $ra
+.size  s390x_kmf,.-s390x_kmf
+___
+}
+
 ################
 # void s390x_kma(const unsigned char *aad, size_t alen,
 #                const unsigned char *in, size_t len,
@@ -298,6 +444,113 @@ s390x_kma:
 ___
 }
 
+################
+# int s390x_pcc(unsigned int fc, void *param)
+{
+my ($fc,$param) = map("%r$_",(2..3));
+$code.=<<___;
+.globl s390x_pcc
+.type  s390x_pcc,\@function
+.align 16
+s390x_pcc:
+       lr      %r0,$fc
+       l${g}r  %r1,$param
+       lhi     %r2,0
+
+       .long   0xb92c0000      # pcc
+       brc     1,.-4           # pay attention to "partial completion"
+       brc     7,.Lpcc_err     # if CC==0 return 0, else return 1
+.Lpcc_out:
+       br      $ra
+.Lpcc_err:
+       lhi     %r2,1
+       j       .Lpcc_out
+.size  s390x_pcc,.-s390x_pcc
+___
+}
+
+################
+# int s390x_kdsa(unsigned int fc, void *param,
+#                const unsigned char *in, size_t len)
+{
+my ($fc,$param,$in,$len) = map("%r$_",(2..5));
+$code.=<<___;
+.globl s390x_kdsa
+.type  s390x_kdsa,\@function
+.align 16
+s390x_kdsa:
+       lr      %r0,$fc
+       l${g}r  %r1,$param
+       lhi     %r2,0
+
+       .long   0xb93a0004      # kdsa %r0,$in
+       brc     1,.-4           # pay attention to "partial completion"
+       brc     7,.Lkdsa_err    # if CC==0 return 0, else return 1
+.Lkdsa_out:
+       br      $ra
+.Lkdsa_err:
+       lhi     %r2,1
+       j       .Lkdsa_out
+.size  s390x_kdsa,.-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