X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fcpuid%2Fcpuid.c;h=026875dcae86b3188115b5fc3513e6a78dfbf6ff;hb=0cfb63013bd23d9820af92cd10035bac461f9845;hp=1a09c5e666cb9457041bb0ae524fdd579677c07d;hpb=7061cc6bfc5a8270061b70cc55cf010e6c8e68b1;p=ccan diff --git a/ccan/cpuid/cpuid.c b/ccan/cpuid/cpuid.c index 1a09c5e6..026875dc 100644 --- a/ccan/cpuid/cpuid.c +++ b/ccan/cpuid/cpuid.c @@ -96,9 +96,13 @@ bool cpuid_is_supported(void) * 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 * operation, but there's no other way to do this unless doing this - * function entirely in assembly. */ - - /* This check is to make sure that the compiler is actually compiling + * function entirely in assembly. + * + * The following assembly code has been shamelessly stolen from: + * http://wiki.osdev.org/CPUID + * and converted to work with AT&T syntax. + * + * This check is to make sure that the compiler is actually compiling * for 64-bit. * * The compiler can be 32-bit and the system 64-bit so the @@ -111,13 +115,13 @@ bool cpuid_is_supported(void) #define ASM_POPF "popfq\n\t" #define ASM_PUSHEAX "pushq %%rax\n\t" #define ASM_POPEAX "popq %%rax\n\t" -#define ASM_PUSHECX "popq %%rcx\n\t" +#define ASM_PUSHECX "pushq %%rcx\n\t" #elif UINTPTR_MAX == 0xffffffff #define ASM_PUSHF "pushfl\n\t" #define ASM_POPF "popfl\n\t" #define ASM_PUSHEAX "pushl %%eax\n\t" #define ASM_POPEAX "popl %%eax\n\t" -#define ASM_PUSHECX "popl %%ecx\n\t" +#define ASM_PUSHECX "pushl %%ecx\n\t" #endif int ret = 0; @@ -157,7 +161,7 @@ bool cpuid_test_feature(cpuid_t feature) bool cpuid_has_feature(int feature, bool extended) { - uint32_t eax, ebx, ecx, edx; + uint32_t eax, ebx, ecx, edx, i; if (!extended) ___cpuid(CPU_PROCINFO_AND_FEATUREBITS, &eax, &ebx, &ecx, &edx); @@ -205,8 +209,6 @@ cputype_t cpuid_get_cpu_type(void) uint32_t i; ___cpuid(CPU_VENDORID, &i, &u.bufu32[0], &u.bufu32[2], &u.bufu32[1]); - u.buf[12] = '\0'; - for (i = 0; i < sizeof(cpuids) / sizeof(cpuids[0]); ++i) { if (strncmp(cpuids[i], u.buf, 12) == 0) { cputype = (cputype_t)i; @@ -218,9 +220,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) @@ -296,13 +303,16 @@ void cpuid(cpuid_t info, uint32_t *buf) buf[3] = edx; break; case CPU_EXTENDED_L2_CACHE_FEATURES: - *buf = ecx; + buf[0] = ecx & 0xFF; /* Line size. */ + buf[1] = (ecx >> 12) & 0xFF; /* Associativity. */ + buf[2] = ecx >> 16; /* Cache size. */ break; case CPU_ADV_POWER_MGT_INFO: *buf = edx; break; case CPU_VIRT_PHYS_ADDR_SIZES: - *buf = eax; + buf[0] = eax & 0xFF; /* physical. */ + buf[1] = (eax >> 8) & 0xFF; /* virtual. */ break; default: *buf = 0xbaadf00d; @@ -311,4 +321,3 @@ void cpuid(cpuid_t info, uint32_t *buf) } #endif -