sparcv9cap.c: add Fujitsu SPARC64 X AES capability detection.
authorAndy Polyakov <appro@openssl.org>
Tue, 19 Apr 2016 11:08:47 +0000 (13:08 +0200)
committerAndy Polyakov <appro@openssl.org>
Wed, 20 Apr 2016 07:57:37 +0000 (09:57 +0200)
Reviewed-by: Richard Levitte <levitte@openssl.org>
crypto/sparc_arch.h
crypto/sparccpuid.S
crypto/sparcv9cap.c

index e30d322a4ae219bb741fbb68d2cdadf43c6cff74..6f8969fc252f208cd2633350878b978380d8245b 100644 (file)
@@ -10,6 +10,7 @@
 # define SPARCV9_VIS3            (1<<6)
 # define SPARCV9_RANDOM          (1<<7)
 # define SPARCV9_64BIT_STACK     (1<<8)
+# define SPARCV9_FJAESX          (1<<9)/* Fujitsu SPARC64 X AES */
 
 /*
  * OPENSSL_sparcv9cap_P[1] is copy of Compatibility Feature Register,
index 72c7adfc74cbe4462b8dd1396a2ca2ff02e3127c..6f1dded8e2166b442206ecb1e0e13bf825f28003 100644 (file)
@@ -349,6 +349,14 @@ _sparcv9_random:
 .type  _sparcv9_random,#function
 .size  _sparcv9_random,.-_sparcv9_vis3_probe
 
+.global        _sparcv9_fjaesx_probe
+.align 8
+_sparcv9_fjaesx_probe:
+       .word   0x81b09206      !faesencx %f2,%f6,%f0
+       retl
+       nop
+.size  _sparcv9_fjaesx_probe,.-_sparcv9_fjaesx_probe
+
 .global        OPENSSL_cleanse
 .align 32
 OPENSSL_cleanse:
index 2058640377b24a9d96223aabf62301c6790fe1e3..e1e6d7395559c5787f419bd202c45cf628178bba 100644 (file)
@@ -149,11 +149,12 @@ void OPENSSL_cpuid_setup(void)
         unsigned int vec[1];
 
         if (getisax (vec,1)) {
-            if (vec[0]&0x0020) OPENSSL_sparcv9cap_P[0] |= SPARCV9_VIS1;
-            if (vec[0]&0x0040) OPENSSL_sparcv9cap_P[0] |= SPARCV9_VIS2;
-            if (vec[0]&0x0080) OPENSSL_sparcv9cap_P[0] |= SPARCV9_BLK;
-            if (vec[0]&0x0100) OPENSSL_sparcv9cap_P[0] |= SPARCV9_FMADD;
-            if (vec[0]&0x0400) OPENSSL_sparcv9cap_P[0] |= SPARCV9_VIS3;
+            if (vec[0]&0x0020)  OPENSSL_sparcv9cap_P[0] |= SPARCV9_VIS1;
+            if (vec[0]&0x0040)  OPENSSL_sparcv9cap_P[0] |= SPARCV9_VIS2;
+            if (vec[0]&0x0080)  OPENSSL_sparcv9cap_P[0] |= SPARCV9_BLK;
+            if (vec[0]&0x0100)  OPENSSL_sparcv9cap_P[0] |= SPARCV9_FMADD;
+            if (vec[0]&0x0400)  OPENSSL_sparcv9cap_P[0] |= SPARCV9_VIS3;
+            if (vec[0]&0x10000) OPENSSL_sparcv9cap_P[0] |= SPARCV9_FJAESX;
 
             /* reconstruct %cfr copy */
             OPENSSL_sparcv9cap_P[1] = (vec[0]>>17)&0x3ff;
@@ -233,6 +234,11 @@ void OPENSSL_cpuid_setup(void)
         OPENSSL_sparcv9cap_P[0] |= SPARCV9_VIS3;
     }
 
+    if (sigsetjmp(common_jmp, 1) == 0) {
+        _sparcv9_fjaesx_probe();
+        OPENSSL_sparcv9cap_P[0] |= SPARCV9_FJAESX;
+    }
+
     /*
      * In wait for better solution _sparcv9_rdcfr is masked by
      * VIS3 flag, because it goes to uninterruptable endless