summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/ppccap.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/ppccap.c')
-rw-r--r--src/lib/libcrypto/ppccap.c112
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;
15static sigset_t all_masked; 15static sigset_t all_masked;
16 16
17#ifdef OPENSSL_BN_ASM_MONT 17#ifdef OPENSSL_BN_ASM_MONT
18int bn_mul_mont(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, const BN_ULONG *np, const BN_ULONG *n0, int num) 18int
19 { 19bn_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
53static sigjmp_buf ill_jmp; 52static sigjmp_buf ill_jmp;
54static void ill_handler (int sig) { siglongjmp(ill_jmp,sig); } 53static void ill_handler (int sig)
54{
55 siglongjmp(ill_jmp, sig);
56}
55 57
56void OPENSSL_ppc64_probe(void); 58void OPENSSL_ppc64_probe(void);
57void OPENSSL_altivec_probe(void); 59void OPENSSL_altivec_probe(void);
58 60
59void OPENSSL_cpuid_setup(void) 61void
60 { 62OPENSSL_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}