@@ -338,6 +338,21 @@ uint32_t kvm_get_cpuid_max_basic(void);
uint32_t kvm_get_cpuid_max_extended(void);
void kvm_get_cpu_address_width(unsigned int *pa_bits, unsigned int *va_bits);
+struct cpuid {
+ u32 a, b, c, d;
+};
+
+static inline struct cpuid raw_cpuid(u32 function, u32 index)
+{
+ struct cpuid r;
+
+ asm volatile("cpuid"
+ : "=a"(r.a), "=b"(r.b), "=c"(r.c), "=d"(r.d)
+ : "0"(function), "2"(index));
+
+ return r;
+}
+
/*
* Basic CPU control in CR0
*/
@@ -38,12 +38,9 @@ void nested_svm_check_supported(void);
static inline bool cpu_has_svm(void)
{
- u32 eax = 0x80000001, ecx;
+ struct cpuid r = raw_cpuid(0x80000001, 0);
- asm("cpuid" :
- "=a" (eax), "=c" (ecx) : "0" (eax) : "ebx", "edx");
-
- return ecx & CPUID_SVM;
+ return r.c & CPUID_SVM;
}
#endif /* SELFTEST_KVM_SVM_UTILS_H */