|
@@ -70,16 +70,19 @@ int has_eflag(unsigned long mask)
|
|
|
# define EBX_REG "=b"
|
|
|
#endif
|
|
|
|
|
|
-static inline void cpuid(u32 id, u32 *a, u32 *b, u32 *c, u32 *d)
|
|
|
+static inline void cpuid_count(u32 id, u32 count,
|
|
|
+ u32 *a, u32 *b, u32 *c, u32 *d)
|
|
|
{
|
|
|
asm volatile(".ifnc %%ebx,%3 ; movl %%ebx,%3 ; .endif \n\t"
|
|
|
"cpuid \n\t"
|
|
|
".ifnc %%ebx,%3 ; xchgl %%ebx,%3 ; .endif \n\t"
|
|
|
: "=a" (*a), "=c" (*c), "=d" (*d), EBX_REG (*b)
|
|
|
- : "a" (id)
|
|
|
+ : "a" (id), "c" (count)
|
|
|
);
|
|
|
}
|
|
|
|
|
|
+#define cpuid(id, a, b, c, d) cpuid_count(id, 0, a, b, c, d)
|
|
|
+
|
|
|
void get_cpuflags(void)
|
|
|
{
|
|
|
u32 max_intel_level, max_amd_level;
|
|
@@ -108,6 +111,11 @@ void get_cpuflags(void)
|
|
|
cpu.model += ((tfms >> 16) & 0xf) << 4;
|
|
|
}
|
|
|
|
|
|
+ if (max_intel_level >= 0x00000007) {
|
|
|
+ cpuid_count(0x00000007, 0, &ignored, &ignored,
|
|
|
+ &cpu.flags[16], &ignored);
|
|
|
+ }
|
|
|
+
|
|
|
cpuid(0x80000000, &max_amd_level, &ignored, &ignored,
|
|
|
&ignored);
|
|
|
|