summaryrefslogtreecommitdiffstats
path: root/crypto/cryptlib.c
diff options
context:
space:
mode:
authorAndy Polyakov <appro@openssl.org>2013-09-15 22:13:54 +0200
committerAndy Polyakov <appro@openssl.org>2013-09-15 22:13:54 +0200
commitd75e384ff8973f5eeeb6b606f3a6b92218ffa45c (patch)
treed015c1eef1749236290bb73a6fdc5546a8c0e103 /crypto/cryptlib.c
parentc340c7a88c84bf7d02143f5705b4cc5726c48e25 (diff)
Extend OPENSSL_ia32cap_P (backport from HEAD).
Diffstat (limited to 'crypto/cryptlib.c')
-rw-r--r--crypto/cryptlib.c24
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