sparcv9cap.c: reiterate CPU detection logic.
[openssl.git] / crypto / sparcv9cap.c
index 1d820f4c0ab41356ac0fec4c77f4a9769adb3dba..bb0c8e73a912488ab8ff1dfe9d85730052e7fb9f 100644 (file)
@@ -27,8 +27,7 @@ int bn_mul_mont(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, const BN_U
        }
 
 unsigned long  _sparcv9_rdtick(void);
-unsigned long  _sparcv9_rdwrasi(unsigned long);
-void           _sparcv9_vis1_probe(void);
+unsigned long  _sparcv9_vis1_probe(void);
 
 unsigned long OPENSSL_rdtsc(void)
        {
@@ -150,7 +149,6 @@ void OPENSSL_cpuid_setup(void)
        char *e;
        struct sigaction        common_act,ill_oact,bus_oact;
        sigset_t                all_masked,oset;
-       unsigned long           oasi;
        int                     sig;
  
        if ((e=getenv("OPENSSL_sparcv9cap")))
@@ -178,35 +176,35 @@ void OPENSSL_cpuid_setup(void)
        common_act.sa_mask    = all_masked;
 
        sigaction(SIGILL,&common_act,&ill_oact);
-       sigaction(SIGBUS,&common_act,&bus_oact);/* T1 fails 16-bit ldda */
-       oasi = _sparcv9_rdwrasi(0xD2);          /* ASI_FL16_P */
-       if ((sig=sigsetjmp(common_jmp,0)) == 0)
-               {
-               _sparcv9_vis1_probe();
-               OPENSSL_sparcv9cap_P |= SPARCV9_VIS1;
-               }
-       else if (sig == SIGBUS)                 /* T1 fails 16-bit ldda */
+       if (sigsetjmp(common_jmp,0) == 0)
                {
-               OPENSSL_sparcv9cap_P &= ~SPARCV9_PREFER_FPU;
+               _sparcv9_rdtick();
+               OPENSSL_sparcv9cap_P &= ~SPARCV9_TICK_PRIVILEGED;
                }
        else
                {
-               OPENSSL_sparcv9cap_P &= ~SPARCV9_VIS1;
+               /* This happens on US-I&II, which have working VIS1
+                * and fast FPU... In other words we are done... */
+               OPENSSL_sparcv9cap_P |= SPARCV9_TICK_PRIVILEGED;
+               sigaction(SIGILL,&ill_oact,NULL);
+               sigprocmask(SIG_SETMASK,&oset,NULL);
+               return;
                }
-       _sparcv9_rdwrasi(oasi);
-       sigaction(SIGBUS,&bus_oact,NULL);
        sigaction(SIGILL,&ill_oact,NULL);
 
        sigaction(SIGILL,&common_act,&ill_oact);
-       if (sigsetjmp(common_jmp,0) == 0)
+       sigaction(SIGBUS,&common_act,&bus_oact);/* T1 fails 16-bit ldda */
+       if ((sig=sigsetjmp(common_jmp,0)) == 0)
                {
-               _sparcv9_rdtick();
-               OPENSSL_sparcv9cap_P &= ~SPARCV9_TICK_PRIVILEGED;
+               /* see sparccpud.S for details... */
+               if (_sparcv9_vis1_probe() >= 12)
+                       OPENSSL_sparcv9cap_P &= ~SPARCV9_VIS1;
                }
        else
                {
-               OPENSSL_sparcv9cap_P |= SPARCV9_TICK_PRIVILEGED;
+               OPENSSL_sparcv9cap_P &= ~SPARCV9_VIS1;
                }
+       sigaction(SIGBUS,&bus_oact,NULL);
        sigaction(SIGILL,&ill_oact,NULL);
 
        sigprocmask(SIG_SETMASK,&oset,NULL);