diff options
author | Andy Polyakov <appro@openssl.org> | 2013-09-15 22:13:54 +0200 |
---|---|---|
committer | Andy Polyakov <appro@openssl.org> | 2013-09-15 22:13:54 +0200 |
commit | d75e384ff8973f5eeeb6b606f3a6b92218ffa45c (patch) | |
tree | d015c1eef1749236290bb73a6fdc5546a8c0e103 /crypto/cryptlib.c | |
parent | c340c7a88c84bf7d02143f5705b4cc5726c48e25 (diff) |
Extend OPENSSL_ia32cap_P (backport from HEAD).
Diffstat (limited to 'crypto/cryptlib.c')
-rw-r--r-- | crypto/cryptlib.c | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/crypto/cryptlib.c b/crypto/cryptlib.c index 304c6b7062..680dd0a78c 100644 --- a/crypto/cryptlib.c +++ b/crypto/cryptlib.c @@ -665,7 +665,7 @@ const char *CRYPTO_get_lock_name(int type) defined(__INTEL__) || \ defined(__x86_64) || defined(__x86_64__) || defined(_M_AMD64) || defined(_M_X64) -unsigned int OPENSSL_ia32cap_P[2]; +extern unsigned int OPENSSL_ia32cap_P[4]; unsigned long *OPENSSL_ia32cap_loc(void) { if (sizeof(long)==4) /* @@ -674,6 +674,9 @@ unsigned long *OPENSSL_ia32cap_loc(void) * is 32-bit. */ OPENSSL_ia32cap_P[1]=0; + + OPENSSL_ia32cap_P[2]=0; + return (unsigned long *)OPENSSL_ia32cap_P; } @@ -686,7 +689,7 @@ typedef unsigned long long IA32CAP; #endif void OPENSSL_cpuid_setup(void) { static int trigger=0; - IA32CAP OPENSSL_ia32_cpuid(void); + IA32CAP OPENSSL_ia32_cpuid(unsigned int *); IA32CAP vec; char *env; @@ -700,10 +703,21 @@ void OPENSSL_cpuid_setup(void) #else if (!sscanf(env+off,"%lli",(long long *)&vec)) vec = strtoul(env+off,NULL,0); #endif - if (off) vec = OPENSSL_ia32_cpuid()&~vec; + if (off) vec = OPENSSL_ia32_cpuid(OPENSSL_ia32cap_P)&~vec; + else if (env[0]==':') vec = OPENSSL_ia32_cpuid(OPENSSL_ia32cap_P); + + OPENSSL_ia32cap_P[2] = 0; + if ((env=strchr(env,':'))) { + unsigned int vecx; + env++; + off = (env[0]=='~')?1:0; + vecx = strtoul(env+off,NULL,0); + if (off) OPENSSL_ia32cap_P[2] &= ~vecx; + else OPENSSL_ia32cap_P[2] = vecx; + } } else - vec = OPENSSL_ia32_cpuid(); + vec = OPENSSL_ia32_cpuid(OPENSSL_ia32cap_P); /* * |(1<<10) sets a reserved bit to signal that variable @@ -713,6 +727,8 @@ void OPENSSL_cpuid_setup(void) OPENSSL_ia32cap_P[0] = (unsigned int)vec|(1<<10); OPENSSL_ia32cap_P[1] = (unsigned int)(vec>>32); } +#else +unsigned int OPENSSL_ia32cap_P[4]; #endif #else |