summaryrefslogtreecommitdiffstats
path: root/crypto/sparcv9cap.c
diff options
context:
space:
mode:
authorAndy Polyakov <appro@openssl.org>2010-07-08 07:52:36 +0000
committerAndy Polyakov <appro@openssl.org>2010-07-08 07:52:36 +0000
commitf90bf72280f7e83bb540abfd4961b213b9d16d9e (patch)
treecd4300913b58482a228e8639efbe81caf2467832 /crypto/sparcv9cap.c
parentabcf7aa591b601f514dc98763650627a8ea3b457 (diff)
sparcv9cap.c: reiterate CPU detection logic [from HEAD].
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);