Detect Altivec support with the machdep.altivec sysctl rather than setmp and
authormiod <miod@openbsd.org>
Sat, 3 May 2014 11:39:46 +0000 (11:39 +0000)
committermiod <miod@openbsd.org>
Sat, 3 May 2014 11:39:46 +0000 (11:39 +0000)
a SIGILL handler.
Do not attempt to detect and use a 64-bit FPU yet.

lib/libcrypto/ppccap.c
lib/libcrypto/ppccpuid.pl
lib/libssl/src/crypto/ppccap.c
lib/libssl/src/crypto/ppccpuid.pl

index 4d7dd38..4cedefe 100644 (file)
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <setjmp.h>
-#include <signal.h>
 #include <unistd.h>
+#include <sys/param.h>
+#include <sys/sysctl.h>
+#include <machine/cpu.h>
+
 #include <crypto.h>
 #include <openssl/bn.h>
 
+#ifdef unused
 #define PPC_FPU64      (1<<0)
 #define PPC_ALTIVEC    (1<<1)
 
 static int OPENSSL_ppccap_P = 0;
-
-static sigset_t all_masked;
+#endif
 
 #ifdef OPENSSL_BN_ASM_MONT
+extern int bn_mul_mont_int(BN_ULONG *, const BN_ULONG *, const BN_ULONG *,
+           const BN_ULONG *, const BN_ULONG *, int);
 int
 bn_mul_mont(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp,
     const BN_ULONG *np, const BN_ULONG *n0, int num)
 {
-       int bn_mul_mont_fpu64(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, const BN_ULONG *np, const BN_ULONG *n0, int num);
-       int bn_mul_mont_int(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, const BN_ULONG *np, const BN_ULONG *n0, int num);
-
-       if (sizeof(size_t) == 4) {
-#if (defined(__APPLE__) && defined(__MACH__))
-               if (num >= 8 && (num&3) == 0 && (OPENSSL_ppccap_P&PPC_FPU64))
-                       return bn_mul_mont_fpu64(rp, ap, bp, np, n0, num);
-#else
-               /* boundary of 32 was experimentally determined on
-                  Linux 2.6.22, might have to be adjusted on AIX... */
-               if (num >= 32 && (num&3) == 0 && (OPENSSL_ppccap_P&PPC_FPU64)) {
-                       sigset_t oset;
-                       int ret;
-
-                       sigprocmask(SIG_SETMASK, &all_masked, &oset);
-                       ret = bn_mul_mont_fpu64(rp, ap, bp, np, n0, num);
-                       sigprocmask(SIG_SETMASK, &oset, NULL);
-
-                       return ret;
-               }
-#endif
-       } else if ((OPENSSL_ppccap_P&PPC_FPU64))
-               /* 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);
-
        return bn_mul_mont_int(rp, ap, bp, np, n0, num);
 }
 #endif
 
-static sigjmp_buf ill_jmp;
-static void ill_handler (int sig)
-{
-       siglongjmp(ill_jmp, sig);
-}
-
-void OPENSSL_ppc64_probe(void);
-void OPENSSL_altivec_probe(void);
+#ifdef unused
+void OPENSSL_cpuid_setup(void) __attribute__((constructor));
 
 void
 OPENSSL_cpuid_setup(void)
 {
-       char *e;
-       struct sigaction        ill_oact, ill_act;
-       sigset_t                oset;
+       static const int mib[2] = { CTL_MACHDEP, CPU_ALTIVEC };
        static int trigger = 0;
+       int altivec = 0;
+       size_t size;
 
        if (trigger)
                return;
        trigger = 1;
 
-       sigfillset(&all_masked);
-       sigdelset(&all_masked, SIGILL);
-       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"))) {
-               OPENSSL_ppccap_P = strtoul(e, NULL, 0);
-               return;
-       }
-
-       OPENSSL_ppccap_P = 0;
-
-#if defined(_AIX)
-       if (sizeof(size_t) == 4
-# if defined(_SC_AIX_KERNEL_BITMODE)
-           && sysconf(_SC_AIX_KERNEL_BITMODE) != 64
-# endif
-       )
-       return;
-#endif
-
-       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) {
-               if (sigsetjmp(ill_jmp, 1) == 0) {
-                       OPENSSL_ppc64_probe();
-                       OPENSSL_ppccap_P |= PPC_FPU64;
-               }
-       } else {
-               /*
-                * Wanted code detecting POWER6 CPU and setting PPC_FPU64
-                */
-       }
-
-       if (sigsetjmp(ill_jmp, 1) == 0) {
-               OPENSSL_altivec_probe();
-               OPENSSL_ppccap_P |= PPC_ALTIVEC;
+       size = sizeof altivec;
+       if (sysctl(mib, 2, &altivec, &size, NULL, 0) != -1) {
+               if (altivec != 0)
+                       OPENSSL_ppccap_P |= PPC_ALTIVEC;
        }
-
-       sigaction (SIGILL, &ill_oact, NULL);
-       sigprocmask(SIG_SETMASK, &oset, NULL);
 }
+#endif
index 37c33c0..0cef701 100755 (executable)
@@ -23,6 +23,7 @@ $code=<<___;
 .machine       "any"
 .text
 
+#if 0
 .globl .OPENSSL_ppc64_probe
 .align 4
 .OPENSSL_ppc64_probe:
@@ -31,14 +32,7 @@ $code=<<___;
        blr
        .long   0
        .byte   0,12,0x14,0,0,0,0,0
-
-.globl .OPENSSL_altivec_probe
-.align 4
-.OPENSSL_altivec_probe:
-       .long   0x10000484      # vor   v0,v0,v0
-       blr
-       .long   0
-       .byte   0,12,0x14,0,0,0,0,0
+#endif
 
 .globl .OPENSSL_wipe_cpu
 .align 4
index 4d7dd38..4cedefe 100644 (file)
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <setjmp.h>
-#include <signal.h>
 #include <unistd.h>
+#include <sys/param.h>
+#include <sys/sysctl.h>
+#include <machine/cpu.h>
+
 #include <crypto.h>
 #include <openssl/bn.h>
 
+#ifdef unused
 #define PPC_FPU64      (1<<0)
 #define PPC_ALTIVEC    (1<<1)
 
 static int OPENSSL_ppccap_P = 0;
-
-static sigset_t all_masked;
+#endif
 
 #ifdef OPENSSL_BN_ASM_MONT
+extern int bn_mul_mont_int(BN_ULONG *, const BN_ULONG *, const BN_ULONG *,
+           const BN_ULONG *, const BN_ULONG *, int);
 int
 bn_mul_mont(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp,
     const BN_ULONG *np, const BN_ULONG *n0, int num)
 {
-       int bn_mul_mont_fpu64(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, const BN_ULONG *np, const BN_ULONG *n0, int num);
-       int bn_mul_mont_int(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, const BN_ULONG *np, const BN_ULONG *n0, int num);
-
-       if (sizeof(size_t) == 4) {
-#if (defined(__APPLE__) && defined(__MACH__))
-               if (num >= 8 && (num&3) == 0 && (OPENSSL_ppccap_P&PPC_FPU64))
-                       return bn_mul_mont_fpu64(rp, ap, bp, np, n0, num);
-#else
-               /* boundary of 32 was experimentally determined on
-                  Linux 2.6.22, might have to be adjusted on AIX... */
-               if (num >= 32 && (num&3) == 0 && (OPENSSL_ppccap_P&PPC_FPU64)) {
-                       sigset_t oset;
-                       int ret;
-
-                       sigprocmask(SIG_SETMASK, &all_masked, &oset);
-                       ret = bn_mul_mont_fpu64(rp, ap, bp, np, n0, num);
-                       sigprocmask(SIG_SETMASK, &oset, NULL);
-
-                       return ret;
-               }
-#endif
-       } else if ((OPENSSL_ppccap_P&PPC_FPU64))
-               /* 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);
-
        return bn_mul_mont_int(rp, ap, bp, np, n0, num);
 }
 #endif
 
-static sigjmp_buf ill_jmp;
-static void ill_handler (int sig)
-{
-       siglongjmp(ill_jmp, sig);
-}
-
-void OPENSSL_ppc64_probe(void);
-void OPENSSL_altivec_probe(void);
+#ifdef unused
+void OPENSSL_cpuid_setup(void) __attribute__((constructor));
 
 void
 OPENSSL_cpuid_setup(void)
 {
-       char *e;
-       struct sigaction        ill_oact, ill_act;
-       sigset_t                oset;
+       static const int mib[2] = { CTL_MACHDEP, CPU_ALTIVEC };
        static int trigger = 0;
+       int altivec = 0;
+       size_t size;
 
        if (trigger)
                return;
        trigger = 1;
 
-       sigfillset(&all_masked);
-       sigdelset(&all_masked, SIGILL);
-       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"))) {
-               OPENSSL_ppccap_P = strtoul(e, NULL, 0);
-               return;
-       }
-
-       OPENSSL_ppccap_P = 0;
-
-#if defined(_AIX)
-       if (sizeof(size_t) == 4
-# if defined(_SC_AIX_KERNEL_BITMODE)
-           && sysconf(_SC_AIX_KERNEL_BITMODE) != 64
-# endif
-       )
-       return;
-#endif
-
-       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) {
-               if (sigsetjmp(ill_jmp, 1) == 0) {
-                       OPENSSL_ppc64_probe();
-                       OPENSSL_ppccap_P |= PPC_FPU64;
-               }
-       } else {
-               /*
-                * Wanted code detecting POWER6 CPU and setting PPC_FPU64
-                */
-       }
-
-       if (sigsetjmp(ill_jmp, 1) == 0) {
-               OPENSSL_altivec_probe();
-               OPENSSL_ppccap_P |= PPC_ALTIVEC;
+       size = sizeof altivec;
+       if (sysctl(mib, 2, &altivec, &size, NULL, 0) != -1) {
+               if (altivec != 0)
+                       OPENSSL_ppccap_P |= PPC_ALTIVEC;
        }
-
-       sigaction (SIGILL, &ill_oact, NULL);
-       sigprocmask(SIG_SETMASK, &oset, NULL);
 }
+#endif
index 37c33c0..0cef701 100755 (executable)
@@ -23,6 +23,7 @@ $code=<<___;
 .machine       "any"
 .text
 
+#if 0
 .globl .OPENSSL_ppc64_probe
 .align 4
 .OPENSSL_ppc64_probe:
@@ -31,14 +32,7 @@ $code=<<___;
        blr
        .long   0
        .byte   0,12,0x14,0,0,0,0,0
-
-.globl .OPENSSL_altivec_probe
-.align 4
-.OPENSSL_altivec_probe:
-       .long   0x10000484      # vor   v0,v0,v0
-       blr
-       .long   0
-       .byte   0,12,0x14,0,0,0,0,0
+#endif
 
 .globl .OPENSSL_wipe_cpu
 .align 4