diff options
Diffstat (limited to 'src/lib/libcrypto/ppccap.c')
| -rw-r--r-- | src/lib/libcrypto/ppccap.c | 112 | 
1 files changed, 55 insertions, 57 deletions
| diff --git a/src/lib/libcrypto/ppccap.c b/src/lib/libcrypto/ppccap.c index f71ba66aa3..16cc9c445e 100644 --- a/src/lib/libcrypto/ppccap.c +++ b/src/lib/libcrypto/ppccap.c | |||
| @@ -15,112 +15,110 @@ static int OPENSSL_ppccap_P = 0; | |||
| 15 | static sigset_t all_masked; | 15 | static sigset_t all_masked; | 
| 16 | 16 | ||
| 17 | #ifdef OPENSSL_BN_ASM_MONT | 17 | #ifdef OPENSSL_BN_ASM_MONT | 
| 18 | 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) | 18 | int | 
| 19 | { | 19 | bn_mul_mont(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, | 
| 20 | const BN_ULONG *np, const BN_ULONG *n0, int num) | ||
| 21 | { | ||
| 20 | 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); | 22 | 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); | 
| 21 | 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); | 23 | 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); | 
| 22 | 24 | ||
| 23 | if (sizeof(size_t)==4) | 25 | if (sizeof(size_t) == 4) { | 
| 24 | { | ||
| 25 | #if (defined(__APPLE__) && defined(__MACH__)) | 26 | #if (defined(__APPLE__) && defined(__MACH__)) | 
| 26 | if (num>=8 && (num&3)==0 && (OPENSSL_ppccap_P&PPC_FPU64)) | 27 | if (num >= 8 && (num&3) == 0 && (OPENSSL_ppccap_P&PPC_FPU64)) | 
| 27 | return bn_mul_mont_fpu64(rp,ap,bp,np,n0,num); | 28 | return bn_mul_mont_fpu64(rp, ap, bp, np, n0, num); | 
| 28 | #else | 29 | #else | 
| 29 | /* boundary of 32 was experimentally determined on | 30 | /* boundary of 32 was experimentally determined on | 
| 30 | Linux 2.6.22, might have to be adjusted on AIX... */ | 31 | Linux 2.6.22, might have to be adjusted on AIX... */ | 
| 31 | if (num>=32 && (num&3)==0 && (OPENSSL_ppccap_P&PPC_FPU64)) | 32 | if (num >= 32 && (num&3) == 0 && (OPENSSL_ppccap_P&PPC_FPU64)) { | 
| 32 | { | ||
| 33 | sigset_t oset; | 33 | sigset_t oset; | 
| 34 | int ret; | 34 | int ret; | 
| 35 | 35 | ||
| 36 | sigprocmask(SIG_SETMASK,&all_masked,&oset); | 36 | sigprocmask(SIG_SETMASK, &all_masked, &oset); | 
| 37 | ret=bn_mul_mont_fpu64(rp,ap,bp,np,n0,num); | 37 | ret = bn_mul_mont_fpu64(rp, ap, bp, np, n0, num); | 
| 38 | sigprocmask(SIG_SETMASK,&oset,NULL); | 38 | sigprocmask(SIG_SETMASK, &oset, NULL); | 
| 39 | 39 | ||
| 40 | return ret; | 40 | return ret; | 
| 41 | } | ||
| 42 | #endif | ||
| 43 | } | 41 | } | 
| 44 | else if ((OPENSSL_ppccap_P&PPC_FPU64)) | 42 | #endif | 
| 43 | } else if ((OPENSSL_ppccap_P&PPC_FPU64)) | ||
| 45 | /* this is a "must" on POWER6, but run-time detection | 44 | /* this is a "must" on POWER6, but run-time detection | 
| 46 | * is not implemented yet... */ | 45 | * is not implemented yet... */ | 
| 47 | return bn_mul_mont_fpu64(rp,ap,bp,np,n0,num); | 46 | return bn_mul_mont_fpu64(rp, ap, bp, np, n0, num); | 
| 48 | 47 | ||
| 49 | return bn_mul_mont_int(rp,ap,bp,np,n0,num); | 48 | return bn_mul_mont_int(rp, ap, bp, np, n0, num); | 
| 50 | } | 49 | } | 
| 51 | #endif | 50 | #endif | 
| 52 | 51 | ||
| 53 | static sigjmp_buf ill_jmp; | 52 | static sigjmp_buf ill_jmp; | 
| 54 | static void ill_handler (int sig) { siglongjmp(ill_jmp,sig); } | 53 | static void ill_handler (int sig) | 
| 54 | { | ||
| 55 | siglongjmp(ill_jmp, sig); | ||
| 56 | } | ||
| 55 | 57 | ||
| 56 | void OPENSSL_ppc64_probe(void); | 58 | void OPENSSL_ppc64_probe(void); | 
| 57 | void OPENSSL_altivec_probe(void); | 59 | void OPENSSL_altivec_probe(void); | 
| 58 | 60 | ||
| 59 | void OPENSSL_cpuid_setup(void) | 61 | void | 
| 60 | { | 62 | OPENSSL_cpuid_setup(void) | 
| 63 | { | ||
| 61 | char *e; | 64 | char *e; | 
| 62 | struct sigaction ill_oact,ill_act; | 65 | struct sigaction ill_oact, ill_act; | 
| 63 | sigset_t oset; | 66 | sigset_t oset; | 
| 64 | static int trigger=0; | 67 | static int trigger = 0; | 
| 68 | |||
| 69 | if (trigger) | ||
| 70 | return; | ||
| 71 | trigger = 1; | ||
| 65 | 72 | ||
| 66 | if (trigger) return; | ||
| 67 | trigger=1; | ||
| 68 | |||
| 69 | sigfillset(&all_masked); | 73 | sigfillset(&all_masked); | 
| 70 | sigdelset(&all_masked,SIGILL); | 74 | sigdelset(&all_masked, SIGILL); | 
| 71 | sigdelset(&all_masked,SIGTRAP); | 75 | sigdelset(&all_masked, SIGTRAP); | 
| 72 | #ifdef SIGEMT | 76 | #ifdef SIGEMT | 
| 73 | sigdelset(&all_masked,SIGEMT); | 77 | sigdelset(&all_masked, SIGEMT); | 
| 74 | #endif | 78 | #endif | 
| 75 | sigdelset(&all_masked,SIGFPE); | 79 | sigdelset(&all_masked, SIGFPE); | 
| 76 | sigdelset(&all_masked,SIGBUS); | 80 | sigdelset(&all_masked, SIGBUS); | 
| 77 | sigdelset(&all_masked,SIGSEGV); | 81 | sigdelset(&all_masked, SIGSEGV); | 
| 78 | 82 | ||
| 79 | if ((e=getenv("OPENSSL_ppccap"))) | 83 | if ((e = getenv("OPENSSL_ppccap"))) { | 
| 80 | { | 84 | OPENSSL_ppccap_P = strtoul(e, NULL, 0); | 
| 81 | OPENSSL_ppccap_P=strtoul(e,NULL,0); | ||
| 82 | return; | 85 | return; | 
| 83 | } | 86 | } | 
| 84 | 87 | ||
| 85 | OPENSSL_ppccap_P = 0; | 88 | OPENSSL_ppccap_P = 0; | 
| 86 | 89 | ||
| 87 | #if defined(_AIX) | 90 | #if defined(_AIX) | 
| 88 | if (sizeof(size_t)==4 | 91 | if (sizeof(size_t) == 4 | 
| 89 | # if defined(_SC_AIX_KERNEL_BITMODE) | 92 | # if defined(_SC_AIX_KERNEL_BITMODE) | 
| 90 | && sysconf(_SC_AIX_KERNEL_BITMODE)!=64 | 93 | && sysconf(_SC_AIX_KERNEL_BITMODE) != 64 | 
| 91 | # endif | 94 | # endif | 
| 92 | ) | 95 | ) | 
| 93 | return; | 96 | return; | 
| 94 | #endif | 97 | #endif | 
| 95 | 98 | ||
| 96 | memset(&ill_act,0,sizeof(ill_act)); | 99 | memset(&ill_act, 0, sizeof(ill_act)); | 
| 97 | ill_act.sa_handler = ill_handler; | 100 | ill_act.sa_handler = ill_handler; | 
| 98 | ill_act.sa_mask = all_masked; | 101 | ill_act.sa_mask = all_masked; | 
| 99 | 102 | ||
| 100 | sigprocmask(SIG_SETMASK,&ill_act.sa_mask,&oset); | 103 | sigprocmask(SIG_SETMASK, &ill_act.sa_mask, &oset); | 
| 101 | sigaction(SIGILL,&ill_act,&ill_oact); | 104 | sigaction(SIGILL, &ill_act, &ill_oact); | 
| 102 | 105 | ||
| 103 | if (sizeof(size_t)==4) | 106 | if (sizeof(size_t) == 4) { | 
| 104 | { | 107 | if (sigsetjmp(ill_jmp, 1) == 0) { | 
| 105 | if (sigsetjmp(ill_jmp,1) == 0) | ||
| 106 | { | ||
| 107 | OPENSSL_ppc64_probe(); | 108 | OPENSSL_ppc64_probe(); | 
| 108 | OPENSSL_ppccap_P |= PPC_FPU64; | 109 | OPENSSL_ppccap_P |= PPC_FPU64; | 
| 109 | } | ||
| 110 | } | 110 | } | 
| 111 | else | 111 | } else { | 
| 112 | { | ||
| 113 | /* | 112 | /* | 
| 114 | * Wanted code detecting POWER6 CPU and setting PPC_FPU64 | 113 | * Wanted code detecting POWER6 CPU and setting PPC_FPU64 | 
| 115 | */ | 114 | */ | 
| 116 | } | 115 | } | 
| 117 | 116 | ||
| 118 | if (sigsetjmp(ill_jmp,1) == 0) | 117 | if (sigsetjmp(ill_jmp, 1) == 0) { | 
| 119 | { | ||
| 120 | OPENSSL_altivec_probe(); | 118 | OPENSSL_altivec_probe(); | 
| 121 | OPENSSL_ppccap_P |= PPC_ALTIVEC; | 119 | OPENSSL_ppccap_P |= PPC_ALTIVEC; | 
| 122 | } | ||
| 123 | |||
| 124 | sigaction (SIGILL,&ill_oact,NULL); | ||
| 125 | sigprocmask(SIG_SETMASK,&oset,NULL); | ||
| 126 | } | 120 | } | 
| 121 | |||
| 122 | sigaction (SIGILL, &ill_oact, NULL); | ||
| 123 | sigprocmask(SIG_SETMASK, &oset, NULL); | ||
| 124 | } | ||
