summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@gnutls.org>2019-08-02 21:57:40 +0200
committerNikos Mavrogiannopoulos <nmav@gnutls.org>2019-08-05 20:57:25 +0200
commitef80617d1e17e0878a909baad62a75ba265c0e00 (patch)
tree16b70933c185aa51994ab39732d8eef09f924573
parent11dc122ebd3f6acd87fffa0b6bceb8606787d3fe (diff)
downloadgnutls-tmp-fixes.tar.gz
read_cpuid_vals: use __get_cpuid_count() only when availabletmp-fixes
This makes the functionality available on gcc 4.8. Resolves: #812 Signed-off-by: Nikos Mavrogiannopoulos <nmav@gnutls.org>
-rw-r--r--configure.ac11
-rw-r--r--lib/accelerated/x86/x86-common.c24
2 files changed, 31 insertions, 4 deletions
diff --git a/configure.ac b/configure.ac
index 6a1d3dbc5c..1bf9bce95e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -182,6 +182,17 @@ case $host_cpu in
;;
esac
+# check for gcc's __get_cpuid_count functionality
+AC_MSG_CHECKING([for __get_cpuid_count])
+AC_LINK_IFELSE(
+ [AC_LANG_SOURCE([
+ #include <cpuid.h>
+ int main(void) { unsigned t1; return __get_cpuid_count(7, 0, &t1, &t1, &t1, &t1); }
+ ])],
+ [AC_DEFINE([HAVE_GET_CPUID_COUNT], [1], [use __get_cpuid_count]) AC_MSG_RESULT([yes])],
+ [AC_MSG_RESULT([no])]
+)
+
fi
AC_ARG_ENABLE(tls13-interop,
diff --git a/lib/accelerated/x86/x86-common.c b/lib/accelerated/x86/x86-common.c
index fb3ff90919..516d6776c5 100644
--- a/lib/accelerated/x86/x86-common.c
+++ b/lib/accelerated/x86/x86-common.c
@@ -106,17 +106,33 @@ unsigned int _gnutls_x86_cpuid_s[4];
#define VIA_PADLOCK_PHE (1<<21)
#define VIA_PADLOCK_PHE_SHA512 (1<<22)
+#ifndef HAVE_GET_CPUID_COUNT
+static inline void
+get_cpuid_level7(unsigned int *eax, unsigned int *ebx,
+ unsigned int *ecx, unsigned int *edx)
+{
+ /* we avoid using __get_cpuid_count, because it is not available with gcc 4.8 */
+ if (__get_cpuid_max(7, 0) < 7)
+ return;
+
+ __cpuid_count(7, 0, *eax, *ebx, *ecx, *edx);
+ return;
+}
+#else
+# define get_cpuid_level7(a,b,c,d) __get_cpuid_count(7, 0, a, b, c, d)
+#endif
+
static unsigned read_cpuid_vals(unsigned int vals[4])
{
unsigned t1, t2, t3;
- if (!__get_cpuid(1, &t1, &vals[0],
- &vals[1], &t2))
+ vals[0] = vals[1] = vals[2] = vals[3] = 0;
+
+ if (!__get_cpuid(1, &t1, &vals[0], &vals[1], &t2))
return 0;
/* suppress AVX512; it works conditionally on certain CPUs on the original code */
vals[1] &= 0xfffff7ff;
- if (!__get_cpuid_count(7, 0, &t1, &vals[2], &t2, &t3))
- return 0;
+ get_cpuid_level7(&t1, &vals[2], &t2, &t3);
return 1;
}