#include <stdint.h>
#include <stdio.h>

void cpuid (uint32_t *EAX, uint32_t *EBX, uint32_t *ECX, uint32_t *EDX)
{
#ifdef __PIC__
    __asm__ __volatile__ ("pushl %%ebx      \n\t"
                          "cpuid            \n\t"
                          "movl %%ebx, %1   \n\t"
                          "popl %%ebx       \n\t"
                          : "=a" (*EAX), "=r" (*EBX),
                            "=c" (*ECX), "=d" (*EDX)
                          : "a" (*EAX), "c" (*ECX)
                          : "cc");
#else
    __asm__ __volatile__ ("cpuid"
                          : "=a" (*EAX), "=b" (*EBX),
                            "=c" (*ECX), "=d" (*EDX)
                          : "a" (*EAX), "c" (*ECX)
                          : "cc");
#endif
}

int main (void)
{
	uint32_t eax_in[] = {
		0,
		1,
		2,
		0x80000000,
		0x80000001,
		0xFFFFFFFF
	};
#define eax_in_count (sizeof (eax_in) / sizeof (eax_in[0]))
	uint32_t i;
	uint32_t eax, ebx, ecx, edx;

	for (i=0; i<eax_in_count; i++) {
		eax = eax_in[i];
		cpuid(&eax, &ebx, &ecx, &edx);
		printf ("[%08x] %08x %08x %08x %08x\n",
				eax_in[i], eax, ebx, ecx, edx);
	}

	return 0;
}


