diff options
Diffstat (limited to 'com32/include/sys/cpu.h')
-rw-r--r-- | com32/include/sys/cpu.h | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/com32/include/sys/cpu.h b/com32/include/sys/cpu.h index dfba02e7..d96ec665 100644 --- a/com32/include/sys/cpu.h +++ b/com32/include/sys/cpu.h @@ -23,21 +23,26 @@ static inline void cpuid_count(uint32_t op, uint32_t cnt, uint32_t * eax, uint32_t * ebx, uint32_t * ecx, uint32_t * edx) { -asm("cpuid":"=a"(*eax), "=b"(*ebx), "=c"(*ecx), "=d"(*edx) +asm("pushl %%ebx ; cpuid ; movl %%ebx,%0 ; popl %%ebx":"=a"(*eax), "=SD"(*ebx), "=c"(*ecx), + "=d"(*edx) : "a"(op), "c"(cnt)); } static inline void cpuid(uint32_t op, uint32_t * eax, uint32_t * ebx, uint32_t * ecx, uint32_t * edx) { - cpuid_count(op, 0, eax, ebx, ecx, edx); +asm("pushl %%ebx ; cpuid ; movl %%ebx,%0 ; popl %%ebx":"=a"(*eax), "=SD"(*ebx), "=c"(*ecx), + "=d"(*edx) +: "a"(op)); } static inline __constfunc uint32_t cpuid_eax(uint32_t level) { uint32_t v; -asm("cpuid": "=a"(v): "a"(level):"ebx", "ecx", "edx"); +asm("pushl %%ebx ; cpuid ; popl %%ebx":"=a"(v) +: "a"(level) +: "ecx", "edx"); return v; } @@ -45,7 +50,9 @@ static inline __constfunc uint32_t cpuid_ebx(uint32_t level) { uint32_t v; -asm("cpuid": "=b"(v), "+a"(level): :"ecx", "edx"); +asm("pushl %%ebx ; cpuid ; movl %%ebx,%0 ; popl %%ebx":"=a"(v) +: "a"(level) +: "ecx", "edx"); return v; } @@ -53,7 +60,8 @@ static inline __constfunc uint32_t cpuid_ecx(uint32_t level) { uint32_t v; -asm("cpuid": "=c"(v), "+a"(level): :"ebx", "edx"); +asm("pushl %%ebx ; cpuid ; popl %%ebx":"=c"(v), "+a"(level) +: : "edx"); return v; } @@ -61,7 +69,8 @@ static inline __constfunc uint32_t cpuid_edx(uint32_t level) { uint32_t v; -asm("cpuid": "=d"(v), "+a"(level): :"ebx", "ecx"); +asm("pushl %%ebx ; cpuid ; popl %%ebx":"=d"(v), "+a"(level) +: : "ecx"); return v; } |