Include crypto.h in ppccap.c
[openssl.git] / crypto / ppccap.c
index 2c3e1f2fcbe2c0da53c3780255d5fb11602bda8d..6ccd99185d379d779c3a65960fc9ae47f8ccd2b4 100644 (file)
@@ -3,9 +3,11 @@
 #include <string.h>
 #include <setjmp.h>
 #include <signal.h>
+#include <crypto.h>
 #include <openssl/bn.h>
 
 #define PPC_FPU64      (1<<0)
+#define PPC_ALTIVEC    (1<<1)
 
 static int OPENSSL_ppccap_P = 0;
 
@@ -39,7 +41,7 @@ int bn_mul_mont(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, const BN_U
 #endif
                }
        else if ((OPENSSL_ppccap_P&PPC_FPU64))
-               /* this is a "must" on Power 6, but run-time detection
+               /* this is a "must" on POWER6, but run-time detection
                 * is not implemented yet... */
                return bn_mul_mont_fpu64(rp,ap,bp,np,n0,num);
 
@@ -55,12 +57,22 @@ void OPENSSL_ppc64_probe(void);
 void OPENSSL_cpuid_setup(void)
        {
        char *e;
+       struct sigaction        ill_oact,ill_act;
+       sigset_t                oset;
+       static int trigger=0;
 
+       if (trigger) return;
+       trigger=1;
        sigfillset(&all_masked);
-       sigdelset(&all_masked,SIGSEGV);
        sigdelset(&all_masked,SIGILL);
-       sigdelset(&all_masked,SIGBUS);
+       sigdelset(&all_masked,SIGTRAP);
+#ifdef SIGEMT
+       sigdelset(&all_masked,SIGEMT);
+#endif
        sigdelset(&all_masked,SIGFPE);
+       sigdelset(&all_masked,SIGBUS);
+       sigdelset(&all_masked,SIGSEGV);
 
        if ((e=getenv("OPENSSL_ppccap")))
                {
@@ -68,26 +80,36 @@ void OPENSSL_cpuid_setup(void)
                return;
                }
 
+       OPENSSL_ppccap_P = 0;
+
+       memset(&ill_act,0,sizeof(ill_act));
+       ill_act.sa_handler = ill_handler;
+       ill_act.sa_mask    = all_masked;
+
+       sigprocmask(SIG_SETMASK,&ill_act.sa_mask,&oset);
+       sigaction(SIGILL,&ill_act,&ill_oact);
+
        if (sizeof(size_t)==4)
                {
-               struct sigaction        ill_oact,ill_act;
-               sigset_t                oset;
-
-               memset(&ill_act,0,sizeof(ill_act));
-               ill_act.sa_handler = ill_handler;
-               ill_act.sa_mask    = all_masked;
-               sigprocmask(SIG_SETMASK,&ill_act.sa_mask,&oset);
-               sigaction (SIGILL,&ill_act,&ill_oact);
-               if (sigsetjmp(ill_jmp,0) == 0)
+               if (sigsetjmp(ill_jmp,1) == 0)
                        {
                        OPENSSL_ppc64_probe();
                        OPENSSL_ppccap_P |= PPC_FPU64;
                        }
-               else
-                       {
-                       OPENSSL_ppccap_P &= ~PPC_FPU64;
-                       }
-               sigaction (SIGILL,&ill_oact,NULL);
-               sigprocmask(SIG_SETMASK,&oset,NULL);
                }
+       else
+               {
+               /*
+                * Wanted code detecting POWER6 CPU and setting PPC_FPU64
+                */
+               }
+
+       if (sigsetjmp(ill_jmp,1) == 0)
+               {
+               OPENSSL_altivec_probe();
+               OPENSSL_ppccap_P |= PPC_ALTIVEC;
+               }
+
+       sigaction (SIGILL,&ill_oact,NULL);
+       sigprocmask(SIG_SETMASK,&oset,NULL);
        }