s390x assembler update: add support for run-time facility detection.
authorAndy Polyakov <appro@openssl.org>
Tue, 19 Jan 2010 12:24:59 +0000 (12:24 +0000)
committerAndy Polyakov <appro@openssl.org>
Tue, 19 Jan 2010 12:24:59 +0000 (12:24 +0000)
Configure
TABLE
crypto/aes/asm/aes-s390x.pl
crypto/s390xcap.c [new file with mode: 0644]
crypto/s390xcpuid.S
crypto/sha/asm/sha1-s390x.pl
crypto/sha/asm/sha512-s390x.pl

index e00b9235b43f492c5dee7e57214524ffa0a31367..80b4555d08116f96a1ae7097dd8d6b707033ecc3 100755 (executable)
--- a/Configure
+++ b/Configure
@@ -133,7 +133,7 @@ my $sparcv9_asm="sparcv9cap.o sparccpuid.o:bn-sparcv9.o sparcv9-mont.o sparcv9a-
 my $sparcv8_asm=":sparcv8.o:des_enc-sparc.o fcrypt_b.o:::::::::::void";
 my $alpha_asm="alphacpuid.o:bn_asm.o alpha-mont.o::::::::::::void";
 my $mips3_asm=":bn-mips3.o::::::::::::void";
-my $s390x_asm="s390xcpuid.o:bn-s390x.o s390x-mont.o::aes-s390x.o:::sha1-s390x.o sha256-s390x.o sha512-s390x.o::rc4-s390x.o:::::void";
+my $s390x_asm="s390xcap.o s390xcpuid.o:bn-s390x.o s390x-mont.o::aes-s390x.o:::sha1-s390x.o sha256-s390x.o sha512-s390x.o::rc4-s390x.o:::::void";
 my $armv4_asm=":bn_asm.o armv4-mont.o::aes_cbc.o aes-armv4.o:::sha1-armv4-large.o sha256-armv4.o sha512-armv4.o:::::::void";
 my $ppc32_asm="ppccpuid.o ppccap.o:bn-ppc.o ppc-mont.o ppc64-mont.o::aes_core.o aes_cbc.o aes-ppc.o:::sha1-ppc.o sha256-ppc.o::::::";
 my $ppc64_asm="ppccpuid.o ppccap.o:bn-ppc.o ppc-mont.o ppc64-mont.o::aes_core.o aes_cbc.o aes-ppc.o:::sha1-ppc.o sha256-ppc.o sha512-ppc.o::::::";
diff --git a/TABLE b/TABLE
index 6b7f415953f2202d91bb17d3350cb277d3a742cd..2b8a60c6e73501eda513a926b36b24a2075ff515 100644 (file)
--- a/TABLE
+++ b/TABLE
@@ -3728,7 +3728,7 @@ $thread_cflag = -D_REENTRANT
 $sys_id       = 
 $lflags       = -ldl
 $bn_ops       = SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL
-$cpuid_obj    = s390xcpuid.o
+$cpuid_obj    = s390xcap.o s390xcpuid.o
 $bn_obj       = bn-s390x.o s390x-mont.o
 $des_obj      = 
 $aes_obj      = aes-s390x.o
index 4b27afd92fc479773abd64e875901cfcb506242c..7e018892982ced4c99b170ac3641d09d59735bca 100644 (file)
@@ -765,6 +765,11 @@ $code.=<<___ if (!$softonly);
        srl     %r5,6
        ar      %r5,%r0
 
+       larl    %r1,OPENSSL_s390xcap_P
+       lg      %r0,0(%r1)
+       tmhl    %r0,0x4000      # check for message-security assist
+       jz      .Lekey_internal
+
        lghi    %r0,0           # query capability vector
        la      %r1,16($sp)
        .long   0xb92f0042      # kmc %r4,%r2
@@ -1323,6 +1328,7 @@ $code.=<<___;
 4:     ex      $len,0($s1)
        j       .Lcbc_dec_exit
 .size  AES_cbc_encrypt,.-AES_cbc_encrypt
+.comm  OPENSSL_s390xcap_P,8,8
 ___
 }
 $code.=<<___;
diff --git a/crypto/s390xcap.c b/crypto/s390xcap.c
new file mode 100644 (file)
index 0000000..ffbe023
--- /dev/null
@@ -0,0 +1,37 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <setjmp.h>
+#include <signal.h>
+
+extern unsigned long OPENSSL_s390xcap_P;
+
+static sigjmp_buf ill_jmp;
+static void ill_handler (int sig) { siglongjmp(ill_jmp,sig); }
+
+unsigned long OPENSSL_s390x_facilities(void);
+
+void OPENSSL_cpuid_setup(void)
+       {
+       sigset_t oset;
+       struct sigaction ill_act,oact;
+
+       if (OPENSSL_s390xcap_P) return;
+
+       memset(&ill_act,0,sizeof(ill_act));
+       ill_act.sa_handler = ill_handler;
+       sigfillset(&ill_act.sa_mask);
+       sigdelset(&ill_act.sa_mask,SIGILL);
+       sigdelset(&ill_act.sa_mask,SIGTRAP);
+       sigprocmask(SIG_SETMASK,&ill_act.sa_mask,&oset);
+       sigaction (SIGILL,&ill_act,&oact);
+
+       /* protection against missing store-facility-list-extended */
+       if (sigsetjmp(ill_jmp,0) == 0)
+               OPENSSL_s390xcap_P = OPENSSL_s390x_facilities();
+       else
+               OPENSSL_s390xcap_P = 1UL<<63;
+
+       sigaction (SIGILL,&oact,NULL);
+       sigprocmask(SIG_SETMASK,&oset,NULL);
+       }
index 8500133ad0fa7adf7dcebe2bb86f9cf0ccb93ea1..aa704c033a426021ce4a0b75bc70d476a6c36341 100644 (file)
@@ -1,12 +1,5 @@
 .text
 
-.globl OPENSSL_cpuid_setup
-.type  OPENSSL_cpuid_setup,@function
-.align 16
-OPENSSL_cpuid_setup:
-       br      %r14            # reserved for future
-.size  OPENSSL_cpuid_setup,.-OPENSSL_cpuid_setup
-
 .globl OPENSSL_s390x_facilities
 .type  OPENSSL_s390x_facilities,@function
 .align 16
@@ -14,6 +7,8 @@ OPENSSL_s390x_facilities:
        lghi    %r0,0
        .long   0xb2b0f010      # stfle 16(%r15)
        lg      %r2,16(%r15)
+       larl    %r1,OPENSSL_s390xcap_P
+       stg     %r2,0(%r1)
        br      %r14
 .size  OPENSSL_s390x_facilities,.-OPENSSL_s390x_facilities
 
@@ -88,3 +83,8 @@ OPENSSL_cleanse:
        jnz     .Little
        br      %r14
 .size  OPENSSL_cleanse,.-OPENSSL_cleanse
+
+.section       .init
+       brasl   %r14,OPENSSL_cpuid_setup
+
+.comm  OPENSSL_s390xcap_P,8,8
index eb6f8dfc82e0ad150bfc996bad902a0712e4aa6c..4b17848287a12e598594fec86a88fab7c6953ac2 100644 (file)
@@ -143,6 +143,10 @@ Ktable: .long      0x5a827999,0x6ed9eba1,0x8f1bbcdc,0xca62c1d6
 sha1_block_data_order:
 ___
 $code.=<<___ if ($kimdfunc);
+       larl    %r1,OPENSSL_s390xcap_P
+       lg      %r0,0(%r1)
+       tmhl    %r0,0x4000      # check for message-security assist
+       jz      .Lsoftware
        lghi    %r0,0
        la      %r1,16($sp)
        .long   0xb93e0002      # kimd %r0,%r2
@@ -213,6 +217,7 @@ $code.=<<___;
        br      %r14
 .size  sha1_block_data_order,.-sha1_block_data_order
 .string        "SHA1 block transform for s390x, CRYPTOGAMS by <appro\@openssl.org>"
+.comm  OPENSSL_s390xcap_P,8,8
 ___
 
 $code =~ s/\`([^\`]*)\`/eval $1/gem;
index 5811d74d094f5abcde722da00151c395fa40802c..e7ef2d5a9f59dd2c810ee799e7952dbee667cc43 100644 (file)
@@ -214,6 +214,10 @@ $code.=<<___;
 $Func:
 ___
 $code.=<<___ if ($kimdfunc);
+       larl    %r1,OPENSSL_s390xcap_P
+       lg      %r0,0(%r1)
+       tmhl    %r0,0x4000      # check for message-security assist
+       jz      .Lsoftware
        lghi    %r0,0
        la      %r1,16($sp)
        .long   0xb93e0002      # kimd %r0,%r2
@@ -286,6 +290,7 @@ $code.=<<___;
        br      %r14
 .size  $Func,.-$Func
 .string        "SHA${label} block transform for s390x, CRYPTOGAMS by <appro\@openssl.org>"
+.comm  OPENSSL_s390xcap_P,8,8
 ___
 
 $code =~ s/\`([^\`]*)\`/eval $1/gem;