summaryrefslogtreecommitdiffstats
path: root/crypto/sparcv9cap.c
diff options
context:
space:
mode:
authorAndy Polyakov <appro@openssl.org>2010-07-08 07:47:35 +0000
committerAndy Polyakov <appro@openssl.org>2010-07-08 07:47:35 +0000
commit7c5889bf7a4ca21138e88d428fa3fa4ccc94789b (patch)
tree798e24f66fb3856ff972293ba89f331f9b71cd3f /crypto/sparcv9cap.c
parentdc53a037b0ce091f2ade0d067ce9e88dd1c2ca21 (diff)
sparcv9cap.c: reiterate CPU detection logic.
Diffstat (limited to 'crypto/sparcv9cap.c')
-rw-r--r--crypto/sparcv9cap.c32
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);