From b1e6a85443ccaf47c6a2c11b18b090bb0f97eea0 Mon Sep 17 00:00:00 2001 From: Jesse Selover Date: Thu, 19 Apr 2018 16:34:35 -0400 Subject: [PATCH] Change OPENSSL_cpuid_setup to reserve more extended feature space. Copy of openssl change https://git.openssl.org/gitweb/?p=openssl.git;h=d6ee8f3dc4414cd97bd63b801f8644f0ff8a1f17 OPENSSL_ia32cap: reserve for new extensions. Change-Id: I96b43c82ba6568bae848449972d3ad9d20f6d063 Reviewed-on: https://boringssl-review.googlesource.com/27564 Reviewed-by: David Benjamin Reviewed-by: Steven Valdez Commit-Queue: David Benjamin CQ-Verified: CQ bot account: commit-bot@chromium.org --- crypto/cpu-intel.c | 15 ++++++++------- include/openssl/cpu.h | 3 ++- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/crypto/cpu-intel.c b/crypto/cpu-intel.c index 1ac280c8..701ebedb 100644 --- a/crypto/cpu-intel.c +++ b/crypto/cpu-intel.c @@ -170,10 +170,11 @@ void OPENSSL_cpuid_setup(void) { } } - uint32_t extended_features = 0; + uint32_t extended_features[2] = {0}; if (num_ids >= 7) { OPENSSL_cpuid(&eax, &ebx, &ecx, &edx, 7); - extended_features = ebx; + extended_features[0] = ebx; + extended_features[1] = ecx; } // Determine the number of cores sharing an L1 data cache to adjust the @@ -241,26 +242,26 @@ void OPENSSL_cpuid_setup(void) { // // TODO(davidben): Should bits 17 and 26-28 also be cleared? Upstream // doesn't clear those. - extended_features &= + extended_features[0] &= ~((1u << 5) | (1u << 16) | (1u << 21) | (1u << 30) | (1u << 31)); } // See Intel manual, volume 1, section 15.2. if ((xcr0 & 0xe6) != 0xe6) { // Clear AVX512F. Note we don't touch other AVX512 extensions because they // can be used with YMM. - extended_features &= ~(1u << 16); + extended_features[0] &= ~(1u << 16); } // Disable ADX instructions on Knights Landing. See OpenSSL commit // 64d92d74985ebb3d0be58a9718f9e080a14a8e7f. if ((ecx & (1u << 26)) == 0) { - extended_features &= ~(1u << 19); + extended_features[0] &= ~(1u << 19); } OPENSSL_ia32cap_P[0] = edx; OPENSSL_ia32cap_P[1] = ecx; - OPENSSL_ia32cap_P[2] = extended_features; - OPENSSL_ia32cap_P[3] = 0; + OPENSSL_ia32cap_P[2] = extended_features[0]; + OPENSSL_ia32cap_P[3] = extended_features[1]; const char *env1, *env2; env1 = getenv("OPENSSL_ia32cap"); diff --git a/include/openssl/cpu.h b/include/openssl/cpu.h index dd95ddc6..bb847f96 100644 --- a/include/openssl/cpu.h +++ b/include/openssl/cpu.h @@ -86,7 +86,8 @@ extern "C" { // Bit 11 is used to indicate AMD XOP support, not SDBG // Index 2: // EBX for CPUID where EAX = 7 -// Index 3 is set to zero. +// Index 3: +// ECX for CPUID where EAX = 7 // // Note: the CPUID bits are pre-adjusted for the OSXSAVE bit and the YMM and XMM // bits in XCR0, so it is not necessary to check those.