1480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#include <stdio.h> 2480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#include <stdlib.h> 3480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#include <string.h> 4480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#include <setjmp.h> 5480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#include <signal.h> 6480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#include <sys/time.h> 7480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#include <openssl/bn.h> 8480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 9480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#define SPARCV9_TICK_PRIVILEGED (1<<0) 10480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#define SPARCV9_PREFER_FPU (1<<1) 11480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#define SPARCV9_VIS1 (1<<2) 12480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#define SPARCV9_VIS2 (1<<3) /* reserved */ 13480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#define SPARCV9_FMADD (1<<4) /* reserved for SPARC64 V */ 14480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 15480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgstatic int OPENSSL_sparcv9cap_P=SPARCV9_TICK_PRIVILEGED; 16480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 17480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgint bn_mul_mont(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, const BN_ULONG *np,const BN_ULONG *n0, int num) 18480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 19480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org int bn_mul_mont_fpu(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, const BN_ULONG *np,const BN_ULONG *n0, int num); 20480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 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); 21480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 222c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org if (num>=8 && !(num&1) && 232c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org (OPENSSL_sparcv9cap_P&(SPARCV9_PREFER_FPU|SPARCV9_VIS1)) == 24480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org (SPARCV9_PREFER_FPU|SPARCV9_VIS1)) 25480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org return bn_mul_mont_fpu(rp,ap,bp,np,n0,num); 26480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org else 27480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org return bn_mul_mont_int(rp,ap,bp,np,n0,num); 28480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 29480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 30480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgunsigned long _sparcv9_rdtick(void); 31480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgvoid _sparcv9_vis1_probe(void); 32480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgunsigned long _sparcv9_vis1_instrument(void); 33480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgvoid _sparcv9_vis2_probe(void); 34480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgvoid _sparcv9_fmadd_probe(void); 35480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 36480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgunsigned long OPENSSL_rdtsc(void) 37480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 38480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (OPENSSL_sparcv9cap_P&SPARCV9_TICK_PRIVILEGED) 39480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#if defined(__sun) && defined(__SVR4) 40480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org return gethrtime(); 41480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#else 42480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org return 0; 43480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#endif 44480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org else 45480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org return _sparcv9_rdtick(); 46480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 47480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 48480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#if 0 && defined(__sun) && defined(__SVR4) 49480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org/* This code path is disabled, because of incompatibility of 50480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org * libdevinfo.so.1 and libmalloc.so.1 (see below for details) 51480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org */ 52480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#include <malloc.h> 53480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#include <dlfcn.h> 54480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#include <libdevinfo.h> 55480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#include <sys/systeminfo.h> 56480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 57480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgtypedef di_node_t (*di_init_t)(const char *,uint_t); 58480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgtypedef void (*di_fini_t)(di_node_t); 59480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgtypedef char * (*di_node_name_t)(di_node_t); 60480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgtypedef int (*di_walk_node_t)(di_node_t,uint_t,di_node_name_t,int (*)(di_node_t,di_node_name_t)); 61480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 62480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#define DLLINK(h,name) (name=(name##_t)dlsym((h),#name)) 63480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 64480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgstatic int walk_nodename(di_node_t node, di_node_name_t di_node_name) 65480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 66480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org char *name = (*di_node_name)(node); 67480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 68480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org /* This is expected to catch all UltraSPARC flavors prior T1 */ 69480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (!strcmp (name,"SUNW,UltraSPARC") || 70480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org !strncmp(name,"SUNW,UltraSPARC-I",17)) /* covers II,III,IV */ 71480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 72480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org OPENSSL_sparcv9cap_P |= SPARCV9_PREFER_FPU|SPARCV9_VIS1; 73480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 74480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org /* %tick is privileged only on UltraSPARC-I/II, but not IIe */ 75480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (name[14]!='\0' && name[17]!='\0' && name[18]!='\0') 76480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org OPENSSL_sparcv9cap_P &= ~SPARCV9_TICK_PRIVILEGED; 77480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 78480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org return DI_WALK_TERMINATE; 79480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 80480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org /* This is expected to catch remaining UltraSPARCs, such as T1 */ 81480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org else if (!strncmp(name,"SUNW,UltraSPARC",15)) 82480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 83480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org OPENSSL_sparcv9cap_P &= ~SPARCV9_TICK_PRIVILEGED; 84480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 85480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org return DI_WALK_TERMINATE; 86480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 87480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 88480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org return DI_WALK_CONTINUE; 89480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 90480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 91480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgvoid OPENSSL_cpuid_setup(void) 92480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 93480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org void *h; 94480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org char *e,si[256]; 95480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org static int trigger=0; 96480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 97480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (trigger) return; 98480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org trigger=1; 99480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 100480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if ((e=getenv("OPENSSL_sparcv9cap"))) 101480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 102480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org OPENSSL_sparcv9cap_P=strtoul(e,NULL,0); 103480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org return; 104480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 105480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 106480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (sysinfo(SI_MACHINE,si,sizeof(si))>0) 107480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 108480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (strcmp(si,"sun4v")) 109480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org /* FPU is preferred for all CPUs, but US-T1/2 */ 110480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org OPENSSL_sparcv9cap_P |= SPARCV9_PREFER_FPU; 111480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 112480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 113480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (sysinfo(SI_ISALIST,si,sizeof(si))>0) 114480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 115480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (strstr(si,"+vis")) 116480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org OPENSSL_sparcv9cap_P |= SPARCV9_VIS1; 117480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (strstr(si,"+vis2")) 118480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 119480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org OPENSSL_sparcv9cap_P |= SPARCV9_VIS2; 120480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org OPENSSL_sparcv9cap_P &= ~SPARCV9_TICK_PRIVILEGED; 121480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org return; 122480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 123480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 124480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#ifdef M_KEEP 125480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org /* 126480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org * Solaris libdevinfo.so.1 is effectively incomatible with 127480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org * libmalloc.so.1. Specifically, if application is linked with 128480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org * -lmalloc, it crashes upon startup with SIGSEGV in 129480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org * free(3LIBMALLOC) called by di_fini. Prior call to 130480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org * mallopt(M_KEEP,0) somehow helps... But not always... 131480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org */ 132480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if ((h = dlopen(NULL,RTLD_LAZY))) 133480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 134480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org union { void *p; int (*f)(int,int); } sym; 135480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if ((sym.p = dlsym(h,"mallopt"))) (*sym.f)(M_KEEP,0); 136480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org dlclose(h); 137480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 138480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#endif 139480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if ((h = dlopen("libdevinfo.so.1",RTLD_LAZY))) do 140480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 141480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org di_init_t di_init; 142480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org di_fini_t di_fini; 143480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org di_walk_node_t di_walk_node; 144480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org di_node_name_t di_node_name; 145480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org di_node_t root_node; 146480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 147480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (!DLLINK(h,di_init)) break; 148480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (!DLLINK(h,di_fini)) break; 149480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (!DLLINK(h,di_walk_node)) break; 150480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (!DLLINK(h,di_node_name)) break; 151480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 152480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if ((root_node = (*di_init)("/",DINFOSUBTREE))!=DI_NODE_NIL) 153480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 154480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org (*di_walk_node)(root_node,DI_WALK_SIBFIRST, 155480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org di_node_name,walk_nodename); 156480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org (*di_fini)(root_node); 157480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 158480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } while(0); 159480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 160480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (h) dlclose(h); 161480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 162480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 163480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#else 164480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 165480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgstatic sigjmp_buf common_jmp; 166480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgstatic void common_handler(int sig) { siglongjmp(common_jmp,sig); } 167480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 168480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.orgvoid OPENSSL_cpuid_setup(void) 169480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 170480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org char *e; 171480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org struct sigaction common_act,ill_oact,bus_oact; 172480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org sigset_t all_masked,oset; 173480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org static int trigger=0; 174480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 175480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (trigger) return; 176480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org trigger=1; 177480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 178480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if ((e=getenv("OPENSSL_sparcv9cap"))) 179480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 180480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org OPENSSL_sparcv9cap_P=strtoul(e,NULL,0); 181480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org return; 182480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 183480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 184480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org /* Initial value, fits UltraSPARC-I&II... */ 185480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org OPENSSL_sparcv9cap_P = SPARCV9_PREFER_FPU|SPARCV9_TICK_PRIVILEGED; 186480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 187480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org sigfillset(&all_masked); 188480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org sigdelset(&all_masked,SIGILL); 189480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org sigdelset(&all_masked,SIGTRAP); 190480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#ifdef SIGEMT 191480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org sigdelset(&all_masked,SIGEMT); 192480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#endif 193480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org sigdelset(&all_masked,SIGFPE); 194480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org sigdelset(&all_masked,SIGBUS); 195480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org sigdelset(&all_masked,SIGSEGV); 196480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org sigprocmask(SIG_SETMASK,&all_masked,&oset); 197480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 198480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org memset(&common_act,0,sizeof(common_act)); 199480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org common_act.sa_handler = common_handler; 200480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org common_act.sa_mask = all_masked; 201480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 202480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org sigaction(SIGILL,&common_act,&ill_oact); 203480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org sigaction(SIGBUS,&common_act,&bus_oact);/* T1 fails 16-bit ldda [on Linux] */ 204480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 205480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (sigsetjmp(common_jmp,1) == 0) 206480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 207480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org _sparcv9_rdtick(); 208480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org OPENSSL_sparcv9cap_P &= ~SPARCV9_TICK_PRIVILEGED; 209480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 210480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 211480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (sigsetjmp(common_jmp,1) == 0) 212480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 213480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org _sparcv9_vis1_probe(); 214480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org OPENSSL_sparcv9cap_P |= SPARCV9_VIS1; 215480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org /* detect UltraSPARC-Tx, see sparccpud.S for details... */ 216480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (_sparcv9_vis1_instrument() >= 12) 217480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org OPENSSL_sparcv9cap_P &= ~(SPARCV9_VIS1|SPARCV9_PREFER_FPU); 218480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org else 219480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 220480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org _sparcv9_vis2_probe(); 221480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org OPENSSL_sparcv9cap_P |= SPARCV9_VIS2; 222480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 223480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 224480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 225480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org if (sigsetjmp(common_jmp,1) == 0) 226480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org { 227480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org _sparcv9_fmadd_probe(); 228480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org OPENSSL_sparcv9cap_P |= SPARCV9_FMADD; 229480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 230480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 231480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org sigaction(SIGBUS,&bus_oact,NULL); 232480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org sigaction(SIGILL,&ill_oact,NULL); 233480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 234480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org sigprocmask(SIG_SETMASK,&oset,NULL); 235480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org } 236480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org 237480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#endif 238