===================================================================
@@ -235,6 +235,16 @@
return __eax;
}
+/* Return non-zero if we support cpuid at this leaf */
+static __inline int
+__have_cpuid_leaf (unsigned int __leaf)
+{
+ unsigned int __ext = __leaf & 0x80000000;
+ unsigned int __maxlevel = __get_cpuid_max (__ext, 0);
+
+ return __maxlevel != 0 && __maxlevel >= __ext;
+}
+
/* Return cpuid data for requested cpuid leaf, 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
@@ -245,9 +255,7 @@
unsigned int *__eax, unsigned int *__ebx,
unsigned int *__ecx, unsigned int *__edx)
{
- unsigned int __ext = __leaf & 0x80000000;
-
- if (__get_cpuid_max (__ext, 0) < __leaf)
+ if (!__have_cpuid_leaf (__leaf))
return 0;
__cpuid (__leaf, *__eax, *__ebx, *__ecx, *__edx);
@@ -261,9 +269,7 @@
unsigned int *__eax, unsigned int *__ebx,
unsigned int *__ecx, unsigned int *__edx)
{
- unsigned int __ext = __leaf & 0x80000000;
-
- if (__get_cpuid_max (__ext, 0) < __leaf)
+ if (!__have_cpuid_leaf (__leaf))
return 0;
__cpuid_count (__leaf, __subleaf, *__eax, *__ebx, *__ecx, *__edx);