From d6ee8f3dc4414cd97bd63b801f8644f0ff8a1f17 Mon Sep 17 00:00:00 2001 From: Andy Polyakov Date: Sun, 5 Nov 2017 20:03:17 +0100 Subject: [PATCH] OPENSSL_ia32cap: reserve for new extensions. Reviewed-by: Rich Salz --- crypto/cryptlib.c | 22 ++++++++++++++++------ crypto/x86_64cpuid.pl | 3 ++- doc/man3/OPENSSL_ia32cap.pod | 5 +++++ 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/crypto/cryptlib.c b/crypto/cryptlib.c index eb24b27808..c2bd2193b7 100644 --- a/crypto/cryptlib.c +++ b/crypto/cryptlib.c @@ -61,16 +61,26 @@ void OPENSSL_cpuid_setup(void) } if ((env = strchr(env, ':'))) { - unsigned int vecx; + IA32CAP 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; +# if defined(_WIN32) + if (!sscanf(env + off, "%I64i", &vecx)) + vecx = strtoul(env + off, NULL, 0); +# else + if (!sscanf(env + off, "%lli", (long long *)&vecx)) + vecx = strtoul(env + off, NULL, 0); +# endif + if (off) { + OPENSSL_ia32cap_P[2] &= ~(unsigned int)vecx; + OPENSSL_ia32cap_P[3] &= ~(unsigned int)(vecx >> 32); + } else { + OPENSSL_ia32cap_P[2] = (unsigned int)vecx; + OPENSSL_ia32cap_P[3] = (unsigned int)(vecx >> 32); + } } else { OPENSSL_ia32cap_P[2] = 0; + OPENSSL_ia32cap_P[3] = 0; } } else { vec = OPENSSL_ia32_cpuid(OPENSSL_ia32cap_P); diff --git a/crypto/x86_64cpuid.pl b/crypto/x86_64cpuid.pl index f228c24ba1..7c8952e721 100644 --- a/crypto/x86_64cpuid.pl +++ b/crypto/x86_64cpuid.pl @@ -68,7 +68,7 @@ OPENSSL_ia32_cpuid: .cfi_register %rbx,%r8 xor %eax,%eax - mov %eax,8(%rdi) # clear extended feature flags + mov %rax,8(%rdi) # clear extended feature flags cpuid mov %eax,%r11d # max value for standard query level @@ -187,6 +187,7 @@ OPENSSL_ia32_cpuid: and \$0xfff7ffff,%ebx # clear ADCX/ADOX flag .Lnotknights: mov %ebx,8(%rdi) # save extended feature flags + mov %ecx,12(%rdi) .Lno_extended_info: bt \$27,%r9d # check OSXSAVE bit diff --git a/doc/man3/OPENSSL_ia32cap.pod b/doc/man3/OPENSSL_ia32cap.pod index 7c5fde313d..e4f5037588 100644 --- a/doc/man3/OPENSSL_ia32cap.pod +++ b/doc/man3/OPENSSL_ia32cap.pod @@ -110,6 +110,10 @@ a.k.a. AVX512IFMA extension; =item bit #64+31 denoting availability of AVX512VL extension; +=item bit #64+41 denoting availability of VAES extension; + +=item bit #64+42 denoting availability of VPCLMULQDQ extension; + =back To control this extended capability word use ':' as delimiter when @@ -130,6 +134,7 @@ requirements are summarized in below table: ADCX/ADOX | 2.23 | 2.10 | 3.3 AVX512 | 2.25 | 2.11.8 | see NOTES AVX512IFMA | 2.26 | 2.11.8 | see NOTES + VAES | n/a | n/a | =head1 NOTES -- 2.25.1