/***************************************************************************** * Function: main () * * * * Purpose: 1) Display Cyrix CPU revision * * 2) Display Cyrix FPU detection * * * * Parameters: Nothing * * Returns: Nothing * * Calls: * * is_cpuid_supported () - 1 if CPUID instruction supported * * cpu_type () - Returns int containing CPU identification * * isfpu() - 1 if fpu is present, 0 if not * * iscyrixfpu() - 1 if Cyrix fpu, 0 if not * * get_cpuid_info () - execute CPUID instruction * * is486() - 1 if 486 CPU support available * * display_which_cyrix - print CPU type based on dir1 and dir0 * *****************************************************************************/ #include #include #include "cpu_type.h" #include "cx_funcs.h" #define TRUE 1 #define FALSE 0 void main (int argc, char *argv[]) { unsigned short x; long cpuid_levels, reg_eax, reg_ebx, reg_edx, reg_ecx; long vender[4]; unsigned char dir0, dir1; int cpuid_supported; unsigned int family, model, stepping; dir0 = UNKNOWN_VENDER; cpuid_supported = FALSE; if ( is_cpuid_supported () ) { cpuid_supported = TRUE; reg_eax = reg_ebx= reg_ecx = reg_edx =0; get_cpuid_info (0, ®_eax, ®_ebx, ®_ecx, ®_edx); cpuid_levels = reg_eax; vender[0] = reg_ebx; vender[1] = reg_edx; vender[2] = reg_ecx; vender[3] = 0; printf ("\n vender = %s",vender); printf ("\n cpuid levels supported %ld",cpuid_levels); if (cpuid_levels > 0) { reg_eax = reg_ebx= reg_ecx = reg_edx =0; get_cpuid_info (1, ®_eax, ®_ebx, ®_ecx, ®_edx); family = (reg_eax & 0xf00) >> 8; model = (reg_eax & 0xf0) >> 4; stepping = reg_eax & 0xf; if ((strcmp ("CyrixInstead", (char *)vender) == 0)) { if (family == 5) printf ("\n Cyrix 6x86 CPU"); if (family == 6) printf ("\n Cyrix m2 CPU"); } printf ("\n family = %d, model = %d, stepping = %d", family, model, stepping); printf ("\n FPU %s", reg_edx & 1 ? "yes": "no"); printf ("\n VME %s", reg_edx & 2 ? "yes": "no"); printf ("\n DE %s", reg_edx & 4 ? "yes": "no"); printf ("\n PSE %s", reg_edx & 8 ? "yes": "no"); printf ("\n TSE %s", reg_edx & 0x10 ? "yes": "no"); printf ("\n MSR %s", reg_edx & 0x20 ? "yes": "no"); printf ("\n PAE %s", reg_edx & 0x40 ? "yes": "no"); printf ("\n MCE %s", reg_edx & 0x80 ? "yes": "no"); printf ("\n CXS %s", reg_edx & 0x100 ? "yes": "no"); printf ("\n APIC %s", reg_edx & 0x200 ? "yes": "no"); printf ("\n MTRR %s", reg_edx & 0x1000 ? "yes": "no"); printf ("\n PGE %s", reg_edx & 0x2000 ? "yes": "no"); printf ("\n MCA %s", reg_edx & 0x4000 ? "yes": "no"); printf ("\n CMOV %s", reg_edx & 0x8000 ? "yes": "no"); printf ("\n MMX %s", reg_edx & 0x800000 ? "yes": "no"); } } /* Check for need to use old Cyrix Detection Technique */ /* or is 'c' on command line forcing old detection */ if ( (!cpuid_supported || *argv [1]=='c') && is486() && iscyrix() ) { /* We are going to use the old Cyrix Detection Method */ printf ("\n Cyrix CPU detected"); cpu_type(&dir0, &dir1); if (dir0 != UNKNOWN_VENDER) printf ("\n Device ID Regs, dir0 = %x, dir1 = %x", dir0, dir1); display_which_cyrix (dir0, dir1); if (dir0 != UNKNOWN_VENDER && dir0 != Cx486S_a) printf ("\n Step=%x, Rev=%x", (dir1 & 0xf0) >> 4, dir1 & 0x0f); } if (isfpu()) { if (iscyrixfpu ()) printf ("\n Cyrix Coprocessor"); else printf ("\n Other Coprocessor"); } else printf ("\n No Coprocessor"); } /****************************************************************************/