diff options
author | Andy Polyakov <appro@openssl.org> | 2010-07-08 09:47:35 +0200 |
---|---|---|
committer | Andy Polyakov <appro@openssl.org> | 2010-07-08 09:47:35 +0200 |
commit | 7c5889bf7a4ca21138e88d428fa3fa4ccc94789b (patch) | |
tree | 798e24f66fb3856ff972293ba89f331f9b71cd3f /crypto/sparcv9cap.c | |
parent | i variable is used on some platforms (diff) | |
download | openssl-7c5889bf7a4ca21138e88d428fa3fa4ccc94789b.tar.xz openssl-7c5889bf7a4ca21138e88d428fa3fa4ccc94789b.zip |
sparcv9cap.c: reiterate CPU detection logic.
Diffstat (limited to 'crypto/sparcv9cap.c')
-rw-r--r-- | crypto/sparcv9cap.c | 32 |
1 files changed, 17 insertions, 15 deletions
diff --git a/crypto/sparcv9cap.c b/crypto/sparcv9cap.c index 6308036250..bb0c8e73a9 100644 --- a/crypto/sparcv9cap.c +++ b/crypto/sparcv9cap.c @@ -27,7 +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); -void _sparcv9_vis1_probe(void); +unsigned long _sparcv9_vis1_probe(void); unsigned long OPENSSL_rdtsc(void) { @@ -176,33 +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 */ - 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; } - 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); |