The %cfr (Compatability Features Register) is the mechanism by which
crypto opcode presence is probed on SPARC-T4 and later processors.

%cfr is simply a mnenomic for %asr26

Trying to access %asr26 on all previous cpus will result in an
illegal instruction trap.

Signed-off-by: David S. Miller <[email protected]>
---
 crypto/sparccpuid.S |    9 +++++++++
 crypto/sparcv9cap.c |    8 ++++++++
 2 files changed, 17 insertions(+)

diff --git a/crypto/sparccpuid.S b/crypto/sparccpuid.S
index ccdd31e..164abd0 100644
--- a/crypto/sparccpuid.S
+++ b/crypto/sparccpuid.S
@@ -318,6 +318,15 @@ _sparcv9_fmadd_probe:
 .type  _sparcv9_fmadd_probe,#function
 .size  _sparcv9_fmadd_probe,.-_sparcv9_fmadd_probe
 
+.global        _sparcv9_cfr_probe
+.align 8
+_sparcv9_cfr_probe:
+       .word   0x91468000      !rd     %asr26, %o0
+       retl
+        nop
+.type  _sparcv9_cfr_probe,#function
+.size  _sparcv9_cfr_probe,.-_sparcv9_cfr_probe
+
 .global        OPENSSL_cleanse
 .align 32
 OPENSSL_cleanse:
diff --git a/crypto/sparcv9cap.c b/crypto/sparcv9cap.c
index b961cbe..240b9cd 100644
--- a/crypto/sparcv9cap.c
+++ b/crypto/sparcv9cap.c
@@ -12,6 +12,7 @@
 #define SPARCV9_VIS2           (1<<3)  /* reserved */
 #define SPARCV9_FMADD          (1<<4)  /* reserved for SPARC64 V */
 #define SPARCV9_BLK            (1<<5)  /* VIS1 block copy */
+#define SPARCV9_CFR            (1<<6)
 
 static int OPENSSL_sparcv9cap_P=SPARCV9_TICK_PRIVILEGED;
 
@@ -33,6 +34,7 @@ void          _sparcv9_vis1_probe(void);
 unsigned long  _sparcv9_vis1_instrument(void);
 void           _sparcv9_vis2_probe(void);
 void           _sparcv9_fmadd_probe(void);
+void           _sparcv9_cfr_probe(void);
 size_t                 _sparcv9_vis1_instrument_bus(unsigned int *,size_t);
 size_t         _sparcv8_vis1_instrument_bus2(unsigned int *,size_t,size_t);
 
@@ -249,6 +251,12 @@ void OPENSSL_cpuid_setup(void)
                OPENSSL_sparcv9cap_P |= SPARCV9_FMADD;
                }
 
+       if (sigsetjmp(common_jmp,1) == 0)
+               {
+               _sparcv9_cfr_probe();
+               OPENSSL_sparcv9cap_P |= SPARCV9_CFR;
+               }
+
        sigaction(SIGBUS,&bus_oact,NULL);
        sigaction(SIGILL,&ill_oact,NULL);
 
-- 
1.7.10.4

______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
Development Mailing List                       [email protected]
Automated List Manager                           [email protected]

Reply via email to