X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Fcpuid%2Fcpuid.c;h=57883e2bd0982b17fccdeaf34fd5da945c1134ea;hp=5c3aa34815b21a7c8140a52820d529f6bc99a5c6;hb=ef47a9814be99eb66c906c01a36dd19e3a5f69ee;hpb=d03f0db15bde9934e801ce9e935b2cfe82301ab3 diff --git a/ccan/cpuid/cpuid.c b/ccan/cpuid/cpuid.c index 5c3aa348..57883e2b 100644 --- a/ccan/cpuid/cpuid.c +++ b/ccan/cpuid/cpuid.c @@ -92,6 +92,8 @@ static struct { bool cpuid_is_supported(void) { + int ret = 0; +#if defined(__GNUC__) || defined(__clang__) /* The following assembly code uses EAX as the return value, * but we store the value of EAX into ret since GCC uses EAX * as the return register for every C function. That's a double @@ -124,7 +126,6 @@ bool cpuid_is_supported(void) #define ASM_PUSHECX "pushl %%ecx\n\t" #endif - int ret = 0; asm volatile( ASM_PUSHF ASM_POPEAX @@ -147,7 +148,26 @@ bool cpuid_is_supported(void) #undef ASM_PUSHEAX #undef ASM_POPEAX #undef ASM_PUSHECX - +#elif defined _MSC_VER + __asm { + pushfd + pop eax + mov ecx, eax + xor eax, 0x200000 + push eax + popfd + + pushfd + pop eax + xor eax, ecx + shr eax, 0x21 + and eax, 0x1 + push ecx + popfd + + mov eax, ret + }; +#endif return !!ret; } @@ -220,9 +240,14 @@ cputype_t cpuid_get_cpu_type(void) return cputype; } -const char *cpuid_get_cpu_type_string(const cputype_t cputype) +bool cpuid_sprintf_cputype(const cputype_t cputype, char *buf) { - return cpuids[(int)cputype]; + if (cputype == CT_NONE) + return false; + + memcpy(buf, cpuids[(int)cputype], 12); + buf[12] = '\0'; + return true; } uint32_t cpuid_highest_ext_func_supported(void) @@ -230,11 +255,19 @@ uint32_t cpuid_highest_ext_func_supported(void) static uint32_t highest; if (!highest) { +#if defined(__GNUC__) || defined(__clang__) asm volatile( "cpuid\n\t" : "=a" (highest) : "a" (CPU_HIGHEST_EXTENDED_FUNCTION_SUPPORTED) ); +#elif defined _MSC_VER + __asm { + mov eax, CPU_HIGHEST_EXTENDED_FUNCTION_SUPPORTED + cpuid + mov highest, eax + }; +#endif } return highest;