}
unsigned long _sparcv9_rdtick(void);
-unsigned long _sparcv9_rdwrasi(unsigned long);
-void _sparcv9_vis1_probe(void);
+unsigned long _sparcv9_vis1_probe(void);
unsigned long OPENSSL_rdtsc(void)
{
char *e;
struct sigaction common_act,ill_oact,bus_oact;
sigset_t all_masked,oset;
- unsigned long oasi;
int sig;
if ((e=getenv("OPENSSL_sparcv9cap")))
common_act.sa_mask = all_masked;
sigaction(SIGILL,&common_act,&ill_oact);
- sigaction(SIGBUS,&common_act,&bus_oact);/* T1 fails 16-bit ldda */
- oasi = _sparcv9_rdwrasi(0xD2); /* ASI_FL16_P */
- 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;
}
- _sparcv9_rdwrasi(oasi);
- 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);