176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* i386 cpu.h */ 276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline uint64_t rdtsc(void) 476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint64_t v; 676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman asm volatile("rdtsc" : "=A" (v)); 776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return v; 876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline uint32_t rdtscl(void) 1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t v; 1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman asm volatile("rdtsc" : "=a" (v) : : "edx"); 1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return v; 1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline void cpuid_count(uint32_t op, uint32_t cnt, 1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t * eax, uint32_t * ebx, 1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t * ecx, uint32_t * edx) 2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman asm volatile("movl %%ebx,%1 ; " 2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "cpuid ; " 2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "xchgl %1,%%ebx" 2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman : "=a" (*eax), "=SD" (*ebx), "=c" (*ecx), "=d" (*edx) 2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman : "a"(op), "c"(cnt)); 2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline void cpuid(uint32_t op, uint32_t * eax, uint32_t * ebx, 2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t * ecx, uint32_t * edx) 3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cpuid_count(op, 0, eax, ebx, ecx, edx); 3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline __constfunc uint32_t cpuid_eax(uint32_t level) 3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t v; 3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman asm volatile("pushl %%ebx ; " 3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "cpuid ; " 4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "popl %%ebx" 4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman : "=a" (v) 4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman : "a"(level) 4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman : "ecx", "edx"); 4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return v; 4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline __constfunc uint32_t cpuid_ebx(uint32_t level) 4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t v; 5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman asm volatile("movl %%ebx,%0 ; " 5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "cpuid ; " 5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "xchgl %0,%%ebx" 5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman : "=SD" (v), "+a" (level) 5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman : : "ecx", "edx"); 5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return v; 5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline __constfunc uint32_t cpuid_ecx(uint32_t level) 6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t v; 6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman asm volatile("pushl %%ebx ; " 6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "cpuid ; " 6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "popl %%ebx" 6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman : "=c" (v), "+a" (level) 6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman : : "edx"); 6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return v; 6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline __constfunc uint32_t cpuid_edx(uint32_t level) 7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t v; 7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman asm volatile("pushl %%ebx ; " 7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "cpuid ; " 7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "popl %%ebx" 7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman : "=d" (v), "+a" (level) 7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman : : "ecx"); 8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return v; 8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline uint64_t rdmsr(uint32_t msr) 8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint64_t v; 8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman asm volatile("rdmsr" : "=A" (v) : "c"(msr)); 8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return v; 8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline void wrmsr(uint64_t v, uint32_t msr) 9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman asm volatile("wrmsr" : : "A" (v), "c" (msr)); 9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline void cpu_relax(void) 9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman asm volatile("rep ; nop" : : : "memory"); 9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline void hlt(void) 10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman asm volatile("hlt" : : : "memory"); 10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline void cli(void) 10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman asm volatile("cli" : : : "memory"); 10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline void sti(void) 11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman asm volatile("sti" : : : "memory"); 11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 115