Common cpuid wrappers, use SYS_cpuid when available

Message ID 20160309025455.786115eb@ultra.tux-net
State New, archived
Headers

Commit Message

Piotr Henryk Dabrowski March 9, 2016, 1:54 a.m. UTC
  Sorry for the malformed patch in the first post.
Here is a working one.

	* config.h.in: Check for SYS_cpuid and define HAVE_SYS_CPUID
	* configure: Check for SYS_cpuid and define HAVE_SYS_CPUID
	* configure.ac: Check for SYS_cpuid and define HAVE_SYS_CPUID
	* misc/cpuid.h: Common cpuid wrappers, use SYS_cpuid when available
	* sysdeps/x86/cpu-features.c: Use misc/cpuid.h wrappers
	* sysdeps/x86/fpu/test-fenv-clear-sse.c: Use misc/cpuid.h wrappers
	* sysdeps/x86/fpu/test-fenv-sse-2.c: Use misc/cpuid.h wrappers
	* sysdeps/x86/fpu/test-fenv-sse.c: Use misc/cpuid.h wrappers
	* sysdeps/x86_64/cacheinfo.c: Use misc/cpuid.h wrappers
	* sysdeps/x86_64/tst-audit10.c: Use misc/cpuid.h wrappers
	* sysdeps/x86_64/tst-audit4.c: Use misc/cpuid.h wrappers
	* sysdeps/x86_64/tst-audit6.c: Use misc/cpuid.h wrappers
	* sysdeps/x86_64/tst-auditmod10b.c: Use misc/cpuid.h wrappers
	* sysdeps/x86_64/tst-auditmod4b.c: Use misc/cpuid.h wrappers
	* sysdeps/x86_64/tst-auditmod6b.c: Use misc/cpuid.h wrappers
	* sysdeps/x86_64/tst-auditmod6c.c: Use misc/cpuid.h wrappers
	* sysdeps/x86_64/tst-auditmod7b.c: Use misc/cpuid.h wrappers
---
 ChangeLog                             | 20 +++++++++
 config.h.in                           |  3 ++
 configure                             | 37 ++++++++++++++++
 configure.ac                          | 18 ++++++++
 misc/cpuid.h                          | 82 +++++++++++++++++++++++++++++++++++
 sysdeps/x86/cpu-features.c            | 37 ++++++++--------
 sysdeps/x86/fpu/test-fenv-clear-sse.c |  4 +-
 sysdeps/x86/fpu/test-fenv-sse-2.c     |  4 +-
 sysdeps/x86/fpu/test-fenv-sse.c       |  4 +-
 sysdeps/x86_64/cacheinfo.c            | 24 +++++-----
 sysdeps/x86_64/tst-audit10.c          |  6 +--
 sysdeps/x86_64/tst-audit4.c           |  4 +-
 sysdeps/x86_64/tst-audit6.c           |  4 +-
 sysdeps/x86_64/tst-auditmod10b.c      |  6 +--
 sysdeps/x86_64/tst-auditmod4b.c       |  4 +-
 sysdeps/x86_64/tst-auditmod6b.c       |  4 +-
 sysdeps/x86_64/tst-auditmod6c.c       |  4 +-
 sysdeps/x86_64/tst-auditmod7b.c       |  4 +-
 18 files changed, 215 insertions(+), 54 deletions(-)
 create mode 100644 misc/cpuid.h
  

Comments

Joseph Myers March 9, 2016, 5:28 p.m. UTC | #1
On Wed, 9 Mar 2016, Piotr Henryk Dabrowski wrote:

> Sorry for the malformed patch in the first post.
> Here is a working one.
> 
> 	* config.h.in: Check for SYS_cpuid and define HAVE_SYS_CPUID
> 	* configure: Check for SYS_cpuid and define HAVE_SYS_CPUID
> 	* configure.ac: Check for SYS_cpuid and define HAVE_SYS_CPUID
> 	* misc/cpuid.h: Common cpuid wrappers, use SYS_cpuid when available

Non-sysdeps files should not have anything architecture-specific.

Now, *if* you need a configure test, you can't avoid changing the 
architecture-independent config.h.in (we don't yet have a way to split 
that by architecture).  But the rest can be avoided by using sysdeps 
configure fragments and headers.  And you don't need a configure test 
anyway - the code can use #ifdef __NR_cpuid to test if the syscall is 
available at compile time, and __ASSUME_CPUID to test if the syscall can 
be presumed to work (if the runtime kernel is known to be recent enough, 
since the kernel headers used to build glibc may be more recent than the 
kernel used by glibc at runtime).  Finally, misc/cpuid.h should go under a 
sysdeps directory, suitably named not to conflict with the compiler's 
<cpuid.h>.

There's a complication: sysdeps/x86 shouldn't contain anything 
Linux-specific either.  So what that suggests is that you have e.g. 
sysdeps/x86/x86-cpuid.h that uses just the cpuid instruction but that can 
be overridden by an OS-specific header that supports the syscall - and 
then have such an OS-specific version in sysdeps/unix/sysv/linux/x86 (you 
can also do more complicated schemes to avoid duplicating the code to use 
the instruction).
  

Patch

diff --git a/ChangeLog b/ChangeLog
index a6be762..3c67632 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,23 @@ 
+2016-03-07  Piotr Henryk Dabrowski  <ultr@ultr.pl>
+
+	* config.h.in: Check for SYS_cpuid and define HAVE_SYS_CPUID
+	* configure: Check for SYS_cpuid and define HAVE_SYS_CPUID
+	* configure.ac: Check for SYS_cpuid and define HAVE_SYS_CPUID
+	* misc/cpuid.h: Common cpuid wrappers, use SYS_cpuid when available
+	* sysdeps/x86/cpu-features.c: Use misc/cpuid.h wrappers
+	* sysdeps/x86/fpu/test-fenv-clear-sse.c: Use misc/cpuid.h wrappers
+	* sysdeps/x86/fpu/test-fenv-sse-2.c: Use misc/cpuid.h wrappers
+	* sysdeps/x86/fpu/test-fenv-sse.c: Use misc/cpuid.h wrappers
+	* sysdeps/x86_64/cacheinfo.c: Use misc/cpuid.h wrappers
+	* sysdeps/x86_64/tst-audit10.c: Use misc/cpuid.h wrappers
+	* sysdeps/x86_64/tst-audit4.c: Use misc/cpuid.h wrappers
+	* sysdeps/x86_64/tst-audit6.c: Use misc/cpuid.h wrappers
+	* sysdeps/x86_64/tst-auditmod10b.c: Use misc/cpuid.h wrappers
+	* sysdeps/x86_64/tst-auditmod4b.c: Use misc/cpuid.h wrappers
+	* sysdeps/x86_64/tst-auditmod6b.c: Use misc/cpuid.h wrappers
+	* sysdeps/x86_64/tst-auditmod6c.c: Use misc/cpuid.h wrappers
+	* sysdeps/x86_64/tst-auditmod7b.c: Use misc/cpuid.h wrappers
+
 2016-03-09  Joseph Myers  <joseph@codesourcery.com>
 
 	[BZ #19790]
diff --git a/config.h.in b/config.h.in
index 0147ba3..0f2231a 100644
--- a/config.h.in
+++ b/config.h.in
@@ -121,6 +121,9 @@ 
 /* Mach/i386 specific: define if the `i386_set_gdt' RPC is available.  */
 #undef	HAVE_I386_SET_GDT
 
+/* Define if the x86 kernel supports SYS_cpuid syscall.  */
+#undef HAVE_SYS_CPUID
+
 /* Defined of libidn is available.  */
 #undef HAVE_LIBIDN
 
diff --git a/configure b/configure
index 8fe5937..1138642 100755
--- a/configure
+++ b/configure
@@ -6420,6 +6420,43 @@  ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
+# SYS_cpuid syscall
+libc_cv_sys_cpuid=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 kernel with SYS_cpuid support" >&5
+$as_echo_n "checking for x86 kernel with SYS_cpuid support... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+  #if (defined(__i386__) || defined(__x86_64__)) && defined(__linux__)
+  #include <sys/syscall.h>
+  #if !defined(SYS_cpuid) || !defined(__NR_cpuid)
+  #error SYS_cpuid not defined
+  #endif
+  #else
+  #error Not a x86 Linux
+  #endif
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  libc_cv_sys_cpuid=yes
+else
+  libc_cv_sys_cpuid=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+if test "$libc_cv_sys_cpuid" = yes; then
+  $as_echo "#define HAVE_SYS_CPUID 1" >>confdefs.h
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_sys_cpuid" >&5
+$as_echo "$libc_cv_sys_cpuid" >&6; }
+
 ### End of automated tests.
 ### Now run sysdeps configure fragments.
 
diff --git a/configure.ac b/configure.ac
index 3c766b7..89a1779 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1704,6 +1704,24 @@  AC_SUBST(libc_cv_cxx_thread_local)
 AC_LANG_POP([C++])
 dnl End of C++ feature tests.
 
+# SYS_cpuid syscall
+libc_cv_sys_cpuid=no
+AC_MSG_CHECKING(for x86 kernel with SYS_cpuid support)
+AC_TRY_COMPILE([
+  #if (defined(__i386__) || defined(__x86_64__)) && defined(__linux__)
+  #include <sys/syscall.h>
+  #if !defined(SYS_cpuid) || !defined(__NR_cpuid)
+  #error SYS_cpuid not defined
+  #endif
+  #else
+  #error Not a x86 Linux
+  #endif
+], [], [libc_cv_sys_cpuid=yes], [libc_cv_sys_cpuid=no])
+if test "$libc_cv_sys_cpuid" = yes; then
+  AC_DEFINE(HAVE_SYS_CPUID)
+fi
+AC_MSG_RESULT($libc_cv_sys_cpuid)
+
 ### End of automated tests.
 ### Now run sysdeps configure fragments.
 
diff --git a/misc/cpuid.h b/misc/cpuid.h
new file mode 100644
index 0000000..6caea13
--- /dev/null
+++ b/misc/cpuid.h
@@ -0,0 +1,82 @@ 
+/* CPUID wrapper functions.
+   This file is part of the GNU C Library.
+   Copyright (C) 2016 Piotr Henryk Dabrowski <ultr@ultr.pl>
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _CPUID_H
+#define _CPUID_H 1
+
+/* NOTE: for new Linux kernels these functions try to use kernel-adjusted
+   values for cpuid returned by the SYS_cpuid sys call.
+   Otherwise they fallback to native cpuid implementation. */
+
+#include <config.h>
+
+#include <cpuid.h>
+#include <errno.h>
+#include <stddef.h>
+
+#ifdef HAVE_SYS_CPUID
+#include <sysdep.h>
+#include <sys/syscall.h>
+#endif
+
+#define get_cpuid_max __get_cpuid_max
+
+/* Return cpuid data for requested cpuid level (eax) and count register (ecx),
+   as found in returned eax, ebx, ecx and edx registers.
+   All pointers are required to be non-null. */
+static inline void
+cpuid_count (unsigned int level, unsigned int count,
+	     unsigned int *eax, unsigned int *ebx,
+	     unsigned int *ecx, unsigned int *edx)
+{
+#ifdef HAVE_SYS_CPUID
+	if (INLINE_SYSCALL(cpuid, 6, level, count, eax, ebx, ecx, edx) == 0)
+		return;
+#endif
+	__cpuid_count(level, count, *eax, *ebx, *ecx, *edx);
+}
+
+/* Return cpuid data for requested cpuid level (eax),
+   as found in returned eax, ebx, ecx and edx registers.
+   All pointers are required to be non-null. */
+static inline void
+cpuid (unsigned int level,
+       unsigned int *eax, unsigned int *ebx,
+       unsigned int *ecx, unsigned int *edx)
+{
+	cpuid_count(level, 0, eax, ebx, ecx, edx);
+}
+
+/* Return cpuid data for requested cpuid level (eax),
+   as found in returned eax, ebx, ecx and edx registers.
+   The function checks if cpuid is supported and returns 1 for valid cpuid
+   information or 0 for unsupported cpuid level.
+   All pointers are required to be non-null. */
+static inline int
+get_cpuid (unsigned int level,
+	   unsigned int *eax, unsigned int *ebx,
+	   unsigned int *ecx, unsigned int *edx)
+{
+	unsigned int ext = level & 0x80000000;
+	if (get_cpuid_max (ext, 0) < level)
+		return 0;
+	cpuid (level, eax, ebx, ecx, edx);
+	return 1;
+}
+
+#endif /* cpuid.h */
diff --git a/sysdeps/x86/cpu-features.c b/sysdeps/x86/cpu-features.c
index 218ff2b..a71c701 100644
--- a/sysdeps/x86/cpu-features.c
+++ b/sysdeps/x86/cpu-features.c
@@ -16,7 +16,7 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <cpuid.h>
+#include <misc/cpuid.h>
 #include <cpu-features.h>
 
 static inline void
@@ -25,9 +25,9 @@  get_common_indeces (struct cpu_features *cpu_features,
 		    unsigned int *extended_model)
 {
   unsigned int eax;
-  __cpuid (1, eax, cpu_features->cpuid[COMMON_CPUID_INDEX_1].ebx,
-	   cpu_features->cpuid[COMMON_CPUID_INDEX_1].ecx,
-	   cpu_features->cpuid[COMMON_CPUID_INDEX_1].edx);
+  cpuid (1, &eax, &(cpu_features->cpuid[COMMON_CPUID_INDEX_1].ebx),
+	 &(cpu_features->cpuid[COMMON_CPUID_INDEX_1].ecx),
+	 &(cpu_features->cpuid[COMMON_CPUID_INDEX_1].edx));
   GLRO(dl_x86_cpu_features).cpuid[COMMON_CPUID_INDEX_1].eax = eax;
   *family = (eax >> 8) & 0x0f;
   *model = (eax >> 4) & 0x0f;
@@ -42,20 +42,21 @@  get_common_indeces (struct cpu_features *cpu_features,
 static inline void
 init_cpu_features (struct cpu_features *cpu_features)
 {
-  unsigned int ebx, ecx, edx;
+  unsigned int eax, ebx, ecx, edx;
   unsigned int family = 0;
   unsigned int model = 0;
   enum cpu_features_kind kind;
 
 #if !HAS_CPUID
-  if (__get_cpuid_max (0, 0) == 0)
+  if (get_cpuid_max (0, 0) == 0)
     {
       kind = arch_kind_other;
       goto no_cpuid;
     }
 #endif
 
-  __cpuid (0, cpu_features->max_cpuid, ebx, ecx, edx);
+  cpuid (0, &eax, &ebx, &ecx, &edx);
+  cpu_features->max_cpuid = eax;
 
   /* This spells out "GenuineIntel".  */
   if (ebx == 0x756e6547 && ecx == 0x6c65746e && edx == 0x49656e69)
@@ -147,13 +148,13 @@  init_cpu_features (struct cpu_features *cpu_features)
       ecx = cpu_features->cpuid[COMMON_CPUID_INDEX_1].ecx;
 
       unsigned int eax;
-      __cpuid (0x80000000, eax, ebx, ecx, edx);
+      cpuid (0x80000000, &eax, &ebx, &ecx, &edx);
       if (eax >= 0x80000001)
-	__cpuid (0x80000001,
-		 cpu_features->cpuid[COMMON_CPUID_INDEX_80000001].eax,
-		 cpu_features->cpuid[COMMON_CPUID_INDEX_80000001].ebx,
-		 cpu_features->cpuid[COMMON_CPUID_INDEX_80000001].ecx,
-		 cpu_features->cpuid[COMMON_CPUID_INDEX_80000001].edx);
+	cpuid (0x80000001,
+	       &(cpu_features->cpuid[COMMON_CPUID_INDEX_80000001].eax),
+	       &(cpu_features->cpuid[COMMON_CPUID_INDEX_80000001].ebx),
+	       &(cpu_features->cpuid[COMMON_CPUID_INDEX_80000001].ecx),
+	       &(cpu_features->cpuid[COMMON_CPUID_INDEX_80000001].edx));
 
       if (family == 0x15)
 	{
@@ -175,11 +176,11 @@  init_cpu_features (struct cpu_features *cpu_features)
     cpu_features->feature[index_I686] |= bit_I686;
 
   if (cpu_features->max_cpuid >= 7)
-    __cpuid_count (7, 0,
-		   cpu_features->cpuid[COMMON_CPUID_INDEX_7].eax,
-		   cpu_features->cpuid[COMMON_CPUID_INDEX_7].ebx,
-		   cpu_features->cpuid[COMMON_CPUID_INDEX_7].ecx,
-		   cpu_features->cpuid[COMMON_CPUID_INDEX_7].edx);
+    cpuid_count (7, 0,
+		 &(cpu_features->cpuid[COMMON_CPUID_INDEX_7].eax),
+		 &(cpu_features->cpuid[COMMON_CPUID_INDEX_7].ebx),
+		 &(cpu_features->cpuid[COMMON_CPUID_INDEX_7].ecx),
+		 &(cpu_features->cpuid[COMMON_CPUID_INDEX_7].edx));
 
   /* Can we call xgetbv?  */
   if (HAS_CPU_FEATURE (OSXSAVE))
diff --git a/sysdeps/x86/fpu/test-fenv-clear-sse.c b/sysdeps/x86/fpu/test-fenv-clear-sse.c
index cc4b3f0..816470b 100644
--- a/sysdeps/x86/fpu/test-fenv-clear-sse.c
+++ b/sysdeps/x86/fpu/test-fenv-clear-sse.c
@@ -17,7 +17,7 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <cpuid.h>
+#include <misc/cpuid.h>
 #include <stdbool.h>
 
 static bool
@@ -25,7 +25,7 @@  have_sse2 (void)
 {
   unsigned int eax, ebx, ecx, edx;
 
-  if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
+  if (!get_cpuid (1, &eax, &ebx, &ecx, &edx))
     return false;
 
   return (edx & bit_SSE2) != 0;
diff --git a/sysdeps/x86/fpu/test-fenv-sse-2.c b/sysdeps/x86/fpu/test-fenv-sse-2.c
index d3197c3..c72d5ad 100644
--- a/sysdeps/x86/fpu/test-fenv-sse-2.c
+++ b/sysdeps/x86/fpu/test-fenv-sse-2.c
@@ -16,7 +16,7 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <cpuid.h>
+#include <misc/cpuid.h>
 #include <fenv.h>
 #include <float.h>
 #include <stdbool.h>
@@ -28,7 +28,7 @@  have_sse2 (void)
 {
   unsigned int eax, ebx, ecx, edx;
 
-  if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
+  if (!get_cpuid (1, &eax, &ebx, &ecx, &edx))
     return false;
 
   return (edx & bit_SSE2) != 0;
diff --git a/sysdeps/x86/fpu/test-fenv-sse.c b/sysdeps/x86/fpu/test-fenv-sse.c
index 4f4ff6a..c8f1497 100644
--- a/sysdeps/x86/fpu/test-fenv-sse.c
+++ b/sysdeps/x86/fpu/test-fenv-sse.c
@@ -16,7 +16,7 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <cpuid.h>
+#include <misc/cpuid.h>
 #include <fenv.h>
 #include <float.h>
 #include <stdbool.h>
@@ -27,7 +27,7 @@  have_sse2 (void)
 {
   unsigned int eax, ebx, ecx, edx;
 
-  if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
+  if (!get_cpuid (1, &eax, &ebx, &ecx, &edx))
     return false;
 
   return (edx & bit_SSE2) != 0;
diff --git a/sysdeps/x86_64/cacheinfo.c b/sysdeps/x86_64/cacheinfo.c
index 96463df..76cd03d 100644
--- a/sysdeps/x86_64/cacheinfo.c
+++ b/sysdeps/x86_64/cacheinfo.c
@@ -20,7 +20,7 @@ 
 #include <stdbool.h>
 #include <stdlib.h>
 #include <unistd.h>
-#include <cpuid.h>
+#include <misc/cpuid.h>
 #include <init-arch.h>
 
 #define is_intel GLRO(dl_x86_cpu_features).kind == arch_kind_intel
@@ -162,7 +162,7 @@  intel_check_word (int name, unsigned int value, bool *has_level_2,
 	  unsigned int round = 0;
 	  while (1)
 	    {
-	      __cpuid_count (4, round, eax, ebx, ecx, edx);
+	      cpuid_count (4, round, &eax, &ebx, &ecx, &edx);
 
 	      enum { null = 0, data = 1, inst = 2, uni = 3 } type = eax & 0x1f;
 	      if (type == null)
@@ -275,7 +275,7 @@  handle_intel (int name, unsigned int maxidx)
       unsigned int ebx;
       unsigned int ecx;
       unsigned int edx;
-      __cpuid (2, eax, ebx, ecx, edx);
+      cpuid (2, &eax, &ebx, &ecx, &edx);
 
       /* The low byte of EAX in the first round contain the number of
 	 rounds we have to make.  At least one, the one we are already
@@ -319,7 +319,7 @@  handle_amd (int name)
   unsigned int ebx;
   unsigned int ecx;
   unsigned int edx;
-  __cpuid (0x80000000, eax, ebx, ecx, edx);
+  cpuid (0x80000000, &eax, &ebx, &ecx, &edx);
 
   /* No level 4 cache (yet).  */
   if (name > _SC_LEVEL3_CACHE_LINESIZE)
@@ -329,7 +329,7 @@  handle_amd (int name)
   if (eax < fn)
     return 0;
 
-  __cpuid (fn, eax, ebx, ecx, edx);
+  cpuid (fn, &eax, &ebx, &ecx, &edx);
 
   if (name < _SC_LEVEL1_DCACHE_SIZE)
     {
@@ -479,7 +479,7 @@  init_cacheinfo (void)
   unsigned int ebx;
   unsigned int ecx;
   unsigned int edx;
-  int max_cpuid_ex;
+  unsigned int max_cpuid_ex;
   long int data = -1;
   long int shared = -1;
   unsigned int level;
@@ -512,7 +512,7 @@  init_cacheinfo (void)
 	  /* Query until desired cache level is enumerated.  */
 	  do
 	    {
-	      __cpuid_count (4, i++, eax, ebx, ecx, edx);
+	      cpuid_count (4, i++, &eax, &ebx, &ecx, &edx);
 
 	      /* There seems to be a bug in at least some Pentium Ds
 		 which sometimes fail to iterate all cache parameters.
@@ -536,7 +536,7 @@  init_cacheinfo (void)
 	      i = 0;
 	      while (1)
 		{
-		  __cpuid_count (11, i++, eax, ebx, ecx, edx);
+		  cpuid_count (11, i++, &eax, &ebx, &ecx, &edx);
 
 		  int shipped = ebx & 0xff;
 		  int type = ecx & 0xff0;
@@ -598,7 +598,7 @@  init_cacheinfo (void)
       shared = handle_amd (_SC_LEVEL3_CACHE_SIZE);
 
       /* Get maximum extended function. */
-      __cpuid (0x80000000, max_cpuid_ex, ebx, ecx, edx);
+      cpuid (0x80000000, &max_cpuid_ex, &ebx, &ecx, &edx);
 
       if (shared <= 0)
 	/* No shared L3 cache.  All we have is the L2 cache.  */
@@ -609,7 +609,7 @@  init_cacheinfo (void)
 	  if (max_cpuid_ex >= 0x80000008)
 	    {
 	      /* Get width of APIC ID.  */
-	      __cpuid (0x80000008, max_cpuid_ex, ebx, ecx, edx);
+	      cpuid (0x80000008, &max_cpuid_ex, &ebx, &ecx, &edx);
 	      threads = 1 << ((ecx >> 12) & 0x0f);
 	    }
 
@@ -617,7 +617,7 @@  init_cacheinfo (void)
 	    {
 	      /* If APIC ID width is not available, use logical
 		 processor count.  */
-	      __cpuid (0x00000001, max_cpuid_ex, ebx, ecx, edx);
+	      cpuid (0x00000001, &max_cpuid_ex, &ebx, &ecx, &edx);
 
 	      if ((edx & (1 << 28)) != 0)
 		threads = (ebx >> 16) & 0xff;
@@ -635,7 +635,7 @@  init_cacheinfo (void)
 #ifndef DISABLE_PREFETCHW
       if (max_cpuid_ex >= 0x80000001)
 	{
-	  __cpuid (0x80000001, eax, ebx, ecx, edx);
+	  cpuid (0x80000001, &eax, &ebx, &ecx, &edx);
 	  /*  PREFETCHW     || 3DNow!  */
 	  if ((ecx & 0x100) || (edx & 0x80000000))
 	    __x86_prefetchw = -1;
diff --git a/sysdeps/x86_64/tst-audit10.c b/sysdeps/x86_64/tst-audit10.c
index a487b40..7442f46 100644
--- a/sysdeps/x86_64/tst-audit10.c
+++ b/sysdeps/x86_64/tst-audit10.c
@@ -16,7 +16,7 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <cpuid.h>
+#include <misc/cpuid.h>
 #include <cpu-features.h>
 
 int tst_audit10_aux (void);
@@ -26,11 +26,11 @@  avx512_enabled (void)
 {
   unsigned int eax, ebx, ecx, edx;
 
-  if (__get_cpuid (1, &eax, &ebx, &ecx, &edx) == 0
+  if (get_cpuid (1, &eax, &ebx, &ecx, &edx) == 0
       || (ecx & (bit_AVX | bit_OSXSAVE)) != (bit_AVX | bit_OSXSAVE))
     return 0;
 
-  __cpuid_count (7, 0, eax, ebx, ecx, edx);
+  cpuid_count (7, 0, &eax, &ebx, &ecx, &edx);
   if (!(ebx & bit_AVX512F))
     return 0;
 
diff --git a/sysdeps/x86_64/tst-audit4.c b/sysdeps/x86_64/tst-audit4.c
index d8e2ab1..5aeaebf 100644
--- a/sysdeps/x86_64/tst-audit4.c
+++ b/sysdeps/x86_64/tst-audit4.c
@@ -16,7 +16,7 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <cpuid.h>
+#include <misc/cpuid.h>
 
 int tst_audit4_aux (void);
 
@@ -25,7 +25,7 @@  avx_enabled (void)
 {
   unsigned int eax, ebx, ecx, edx;
 
-  if (__get_cpuid (1, &eax, &ebx, &ecx, &edx) == 0
+  if (get_cpuid (1, &eax, &ebx, &ecx, &edx) == 0
       || (ecx & (bit_AVX | bit_OSXSAVE)) != (bit_AVX | bit_OSXSAVE))
     return 0;
 
diff --git a/sysdeps/x86_64/tst-audit6.c b/sysdeps/x86_64/tst-audit6.c
index f2f6a48..e7cc9d6 100644
--- a/sysdeps/x86_64/tst-audit6.c
+++ b/sysdeps/x86_64/tst-audit6.c
@@ -2,7 +2,7 @@ 
 
 #include <stdlib.h>
 #include <string.h>
-#include <cpuid.h>
+#include <misc/cpuid.h>
 #include <emmintrin.h>
 
 extern __m128i audit_test (__m128i, __m128i, __m128i, __m128i,
@@ -14,7 +14,7 @@  avx_enabled (void)
 {
   unsigned int eax, ebx, ecx, edx;
 
-  if (__get_cpuid (1, &eax, &ebx, &ecx, &edx) == 0
+  if (get_cpuid (1, &eax, &ebx, &ecx, &edx) == 0
       || (ecx & (bit_AVX | bit_OSXSAVE)) != (bit_AVX | bit_OSXSAVE))
     return 0;
 
diff --git a/sysdeps/x86_64/tst-auditmod10b.c b/sysdeps/x86_64/tst-auditmod10b.c
index ad6fcaf..3b050d0 100644
--- a/sysdeps/x86_64/tst-auditmod10b.c
+++ b/sysdeps/x86_64/tst-auditmod10b.c
@@ -125,18 +125,18 @@  la_symbind64 (Elf64_Sym *sym, unsigned int ndx, uintptr_t *refcook,
 
 #ifdef __AVX512F__
 #include <immintrin.h>
-#include <cpuid.h>
+#include <misc/cpuid.h>
 
 static int
 check_avx512 (void)
 {
   unsigned int eax, ebx, ecx, edx;
 
-  if (__get_cpuid (1, &eax, &ebx, &ecx, &edx) == 0
+  if (get_cpuid (1, &eax, &ebx, &ecx, &edx) == 0
       || (ecx & (bit_AVX | bit_OSXSAVE)) != (bit_AVX | bit_OSXSAVE))
     return 0;
 
-  __cpuid_count (7, 0, eax, ebx, ecx, edx);
+  cpuid_count (7, 0, &eax, &ebx, &ecx, &edx);
   if (!(ebx & bit_AVX512F))
     return 0;
 
diff --git a/sysdeps/x86_64/tst-auditmod4b.c b/sysdeps/x86_64/tst-auditmod4b.c
index 2b0d827..c980887 100644
--- a/sysdeps/x86_64/tst-auditmod4b.c
+++ b/sysdeps/x86_64/tst-auditmod4b.c
@@ -108,7 +108,7 @@  la_symbind64 (Elf64_Sym *sym, unsigned int ndx, uintptr_t *refcook,
 
 #ifdef __AVX__
 #include <immintrin.h>
-#include <cpuid.h>
+#include <misc/cpuid.h>
 
 static int avx = -1;
 
@@ -120,7 +120,7 @@  check_avx (void)
     {
       unsigned int eax, ebx, ecx, edx;
 
-      if (__get_cpuid (1, &eax, &ebx, &ecx, &edx)
+      if (get_cpuid (1, &eax, &ebx, &ecx, &edx)
 	  && (ecx & bit_AVX))
 	avx = 1;
       else
diff --git a/sysdeps/x86_64/tst-auditmod6b.c b/sysdeps/x86_64/tst-auditmod6b.c
index 886fc33..d77d949 100644
--- a/sysdeps/x86_64/tst-auditmod6b.c
+++ b/sysdeps/x86_64/tst-auditmod6b.c
@@ -108,7 +108,7 @@  la_symbind64 (Elf64_Sym *sym, unsigned int ndx, uintptr_t *refcook,
 
 #ifdef __AVX__
 #include <immintrin.h>
-#include <cpuid.h>
+#include <misc/cpuid.h>
 
 static int avx = -1;
 
@@ -120,7 +120,7 @@  check_avx (void)
     {
       unsigned int eax, ebx, ecx, edx;
 
-      if (__get_cpuid (1, &eax, &ebx, &ecx, &edx)
+      if (get_cpuid (1, &eax, &ebx, &ecx, &edx)
 	  && (ecx & bit_AVX))
 	avx = 1;
       else
diff --git a/sysdeps/x86_64/tst-auditmod6c.c b/sysdeps/x86_64/tst-auditmod6c.c
index b2ee24d..0a5f143 100644
--- a/sysdeps/x86_64/tst-auditmod6c.c
+++ b/sysdeps/x86_64/tst-auditmod6c.c
@@ -108,7 +108,7 @@  la_symbind64 (Elf64_Sym *sym, unsigned int ndx, uintptr_t *refcook,
 
 #ifdef __AVX__
 #include <immintrin.h>
-#include <cpuid.h>
+#include <misc/cpuid.h>
 
 static int avx = -1;
 
@@ -120,7 +120,7 @@  check_avx (void)
     {
       unsigned int eax, ebx, ecx, edx;
 
-      if (__get_cpuid (1, &eax, &ebx, &ecx, &edx)
+      if (get_cpuid (1, &eax, &ebx, &ecx, &edx)
 	  && (ecx & bit_AVX))
 	avx = 1;
       else
diff --git a/sysdeps/x86_64/tst-auditmod7b.c b/sysdeps/x86_64/tst-auditmod7b.c
index f27076d..72257cd 100644
--- a/sysdeps/x86_64/tst-auditmod7b.c
+++ b/sysdeps/x86_64/tst-auditmod7b.c
@@ -108,7 +108,7 @@  la_symbind64 (Elf64_Sym *sym, unsigned int ndx, uintptr_t *refcook,
 
 #ifdef __AVX__
 #include <immintrin.h>
-#include <cpuid.h>
+#include <misc/cpuid.h>
 
 static int avx = -1;
 
@@ -120,7 +120,7 @@  check_avx (void)
     {
       unsigned int eax, ebx, ecx, edx;
 
-      if (__get_cpuid (1, &eax, &ebx, &ecx, &edx)
+      if (get_cpuid (1, &eax, &ebx, &ecx, &edx)
 	  && (ecx & bit_AVX))
 	avx = 1;
       else