#include static __inline void do_cpuid(unsigned int ax, unsigned int *p) { __asm __volatile("cpuid" : "=a" (p[0]), "=b" (p[1]), "=c" (p[2]), "=d" (p[3]) : "0" (ax)); } int main(void) { unsigned int regs[4]; int em64t_available = 0; do_cpuid(0x80000000, regs); /* printf("0x%08x 0x%08x 0x%08x 0x%08x\n", regs[0], regs[1], regs[2], regs[3]); */ if (regs[0] >= 0x80000000) { do_cpuid(0x80000001, regs); /* printf("0x%08x 0x%08x 0x%08x 0x%08x\n", regs[0], regs[1], regs[2], regs[3]); */ /* EDX.29: Intel EM64T available */ em64t_available = regs[3] & 0x20000000; } printf("EM64T is... %s\n", em64t_available ? "available :)" : "not available :("); return (em64t_available ? 0 : 1); }