{
struct cpuid_result result;
asm volatile(
- "cpuid"
+ "mov %%ebx, %%edi;"
+ "cpuid;"
+ "mov %%ebx, %%esi;"
+ "mov %%edi, %%ebx;"
: "=a" (result.eax),
- "=b" (result.ebx),
+ "=S" (result.ebx),
"=c" (result.ecx),
"=d" (result.edx)
- : "0" (op));
+ : "0" (op)
+ : "edi");
+ return result;
+}
+
+/*
+ * Generic Extended CPUID function
+ */
+static inline struct cpuid_result cpuid_ext(int op, unsigned ecx)
+{
+ struct cpuid_result result;
+ asm volatile(
+ "mov %%ebx, %%edi;"
+ "cpuid;"
+ "mov %%ebx, %%esi;"
+ "mov %%edi, %%ebx;"
+ : "=a" (result.eax),
+ "=S" (result.ebx),
+ "=c" (result.ecx),
+ "=d" (result.edx)
+ : "0" (op), "2" (ecx)
+ : "edi");
return result;
}
{
unsigned int eax;
- __asm__("cpuid"
+ __asm__("mov %%ebx, %%edi;"
+ "cpuid;"
+ "mov %%edi, %%ebx;"
: "=a" (eax)
: "0" (op)
- : "ebx", "ecx", "edx");
+ : "ecx", "edx", "edi");
return eax;
}
{
unsigned int eax, ebx;
- __asm__("cpuid"
- : "=a" (eax), "=b" (ebx)
+ __asm__("mov %%ebx, %%edi;"
+ "cpuid;"
+ "mov %%edi, %%ebx;"
+ "mov %%edi, %%esi;"
+ : "=a" (eax), "=S" (ebx)
: "0" (op)
- : "ecx", "edx" );
+ : "ecx", "edx", "edi");
return ebx;
}
{
unsigned int eax, ecx;
- __asm__("cpuid"
+ __asm__("mov %%ebx, %%edi;"
+ "cpuid;"
+ "mov %%edi, %%ebx;"
: "=a" (eax), "=c" (ecx)
: "0" (op)
- : "ebx", "edx" );
+ : "edx", "edi");
return ecx;
}
{
unsigned int eax, edx;
- __asm__("cpuid"
+ __asm__("mov %%ebx, %%edi;"
+ "cpuid;"
+ "mov %%edi, %%ebx;"
: "=a" (eax), "=d" (edx)
: "0" (op)
- : "ebx", "ecx");
+ : "ecx", "edi");
return edx;
}