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