jweinst1
4/16/2020 - 6:34 AM

print_cpuid.c

#include <stdio.h>

#include <stdint.h>
#include <stdlib.h>
#if defined(_MSC_VER)
#    include <intrin.h>
#elif defined(HAVE_GCC_GET_CPUID) && defined(USE_GCC_GET_CPUID)
#    include <cpuid.h>
#endif

static void print_bits(int bits, int newline)
{
    size_t tip = CHAR_BIT * sizeof(int);
    while (tip--) {
        putc( ((bits >> tip) & 1) ? '1' : '0' , stdout);
    }
    if(newline)
        putc('\n', stdout);
}


static void cpuid(uint32_t *eax, uint32_t *ebx, uint32_t *ecx,
                         uint32_t *edx) {
#if defined(_MSC_VER)
  int cpu_info[4];
  __cpuid(cpu_info, *eax);
  *eax = cpu_info[0];
  *ebx = cpu_info[1];
  *ecx = cpu_info[2];
  *edx = cpu_info[3];
#elif defined(HAVE_GCC_GET_CPUID) && defined(USE_GCC_GET_CPUID)
  uint32_t level = *eax;
  __get_cpuid(level, eax, ebx, ecx, edx);
#else
  uint32_t a = *eax, b, c = *ecx, d;
  asm volatile("cpuid\n\t" : "+a"(a), "=b"(b), "+c"(c), "=d"(d));
  *eax = a;
  *ebx = b;
  *ecx = c;
  *edx = d;
#endif
}

int main(int argc, char const* argv[])
{
    uint32_t eax;
    uint32_t ebx;
    uint32_t ecx;
    uint32_t edx;
    cpuid(&eax, &ebx, &ecx, &edx);
    print_bits(eax, 1);
    print_bits(ebx, 1);
    print_bits(ecx, 1);
    print_bits(edx, 1);
    return 0;
}