|
|
@ -74,6 +74,22 @@ static __always_inline void halt(void)
|
|
|
|
__asm__ volatile("hlt");
|
|
|
|
__asm__ volatile("hlt");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct x86_cpuid_ret {
|
|
|
|
|
|
|
|
u32 eax;
|
|
|
|
|
|
|
|
u32 ebx;
|
|
|
|
|
|
|
|
u32 ecx;
|
|
|
|
|
|
|
|
u32 edx;
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static inline void x86_cpuid(struct x86_cpuid_ret *ret, u32 eax, u32 ecx)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
__asm__ volatile(
|
|
|
|
|
|
|
|
"cpuid"
|
|
|
|
|
|
|
|
: "=a"(ret->eax), "=b"(ret->ebx), "=c"(ret->ecx), "=d"(ret->edx)
|
|
|
|
|
|
|
|
: "0"(eax), "c"(ecx)
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static __always_inline void x86_pause(void)
|
|
|
|
static __always_inline void x86_pause(void)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
__asm__ volatile("pause");
|
|
|
|
__asm__ volatile("pause");
|
|
|
|