X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fcpuid%2Fcpuid.c;h=35e0b7ae8d779b8f371f4707d621db270146e304;hb=9c0951e6f63564cf6c655680fd518c37e666bd78;hp=1a09c5e666cb9457041bb0ae524fdd579677c07d;hpb=7061cc6bfc5a8270061b70cc55cf010e6c8e68b1;p=ccan diff --git a/ccan/cpuid/cpuid.c b/ccan/cpuid/cpuid.c index 1a09c5e6..35e0b7ae 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; @@ -311,4 +313,3 @@ void cpuid(cpuid_t info, uint32_t *buf) } #endif -