--- /dev/null
+\r
+#include "core.h"\r
+\r
+void CPU_Identify(DATA_CPUID *id)\r
+{\r
+ uint eflags0, eflags1;\r
+ uint cpuidbuf[5]; //EAX-EBX-EDX-ECX-0x00000000\r
+ uchar s[64];\r
+\r
+ cpuidbuf[4] = 0x00000000;\r
+\r
+ eflags0 = IO_Load_EFlags();\r
+ IO_Store_EFlags(eflags0 | 0x00200000);\r
+ eflags1 = IO_Load_EFlags();\r
+ IO_Store_EFlags(eflags0);\r
+\r
+ if((eflags1 | 0xffdfffff) == 0xffffffff){\r
+ id->enable = true;\r
+ CPUID(cpuidbuf, 0);\r
+ id->max = cpuidbuf[0];\r
+ sprintf(id->vendor, "%s", &cpuidbuf[1]);\r
+\r
+ if(id->max >= 1){\r
+ CPUID(cpuidbuf, 1);\r
+ if((cpuidbuf[2] & ~1 << 0) != 0){\r
+ id->FPU = true;\r
+ } else{\r
+ id->FPU = false;\r
+ }\r
+ if((cpuidbuf[2] & ~(1 << 1)) != 0){\r
+ id->VME = true;\r
+ } else{\r
+ id->VME = false;\r
+ }\r
+ if((cpuidbuf[2] & ~(1 << 2)) != 0){\r
+ id->DE = true;\r
+ } else{\r
+ id->DE = false;\r
+ }\r
+ if((cpuidbuf[2] & ~(1 << 3)) != 0){\r
+ id->PSE = true;\r
+ } else{\r
+ id->PSE = false;\r
+ }\r
+ if((cpuidbuf[2] & ~(1 << 4)) != 0){\r
+ id->TSC = true;\r
+ } else{\r
+ id->TSC = false;\r
+ }\r
+ if((cpuidbuf[2] & ~(1 << 5)) != 0){\r
+ id->MSR = true;\r
+ } else{\r
+ id->MSR = false;\r
+ }\r
+ if((cpuidbuf[2] & ~(1 << 6)) != 0){\r
+ id->PAE = true;\r
+ } else{\r
+ id->PAE = false;\r
+ }\r
+ if((cpuidbuf[2] & ~(1 << 7)) != 0){\r
+ id->MCE = true;\r
+ } else{\r
+ id->MCE = false;\r
+ }\r
+ if((cpuidbuf[2] & ~(1 << 8)) != 0){\r
+ id->CX8 = true;\r
+ } else{\r
+ id->CX8 = false;\r
+ }\r
+ if((cpuidbuf[2] & ~(1 << 9)) != 0){\r
+ id->APIC = true;\r
+ } else{\r
+ id->APIC = false;\r
+ }\r
+ if((cpuidbuf[2] & ~(1 << 11)) != 0){\r
+ id->SEP = true;\r
+ } else{\r
+ id->SEP = false;\r
+ }\r
+ if((cpuidbuf[2] & ~(1 << 12)) != 0){\r
+ id->MTRR = true;\r
+ } else{\r
+ id->MTRR = false;\r
+ }\r
+ if((cpuidbuf[2] & ~(1 << 13)) != 0){\r
+ id->PGE = true;\r
+ } else{\r
+ id->PGE = false;\r
+ }\r
+ if((cpuidbuf[2] & ~(1 << 14)) != 0){\r
+ id->MCA = true;\r
+ } else{\r
+ id->MCA = false;\r
+ }\r
+ if((cpuidbuf[2] & ~(1 << 15)) != 0){\r
+ id->CMOV = true;\r
+ } else{\r
+ id->CMOV = false;\r
+ }\r
+ if((cpuidbuf[2] & ~(1 << 16)) != 0){\r
+ id->PAT = true;\r
+ } else{\r
+ id->PAT = false;\r
+ }\r
+ if((cpuidbuf[2] & ~(1 << 17)) != 0){\r
+ id->PSE36 = true;\r
+ } else{\r
+ id->PSE36 = false;\r
+ }\r
+ if((cpuidbuf[2] & ~(1 << 18)) != 0){\r
+ id->PSN = true;\r
+ } else{\r
+ id->PSN = false;\r
+ }\r
+ if((cpuidbuf[2] & ~(1 << 19)) != 0){\r
+ id->CLFSH = true;\r
+ } else{\r
+ id->CLFSH = false;\r
+ }\r
+ if((cpuidbuf[2] & ~(1 << 21)) != 0){\r
+ id->DS = true;\r
+ } else{\r
+ id->DS = false;\r
+ }\r
+ if((cpuidbuf[2] & ~(1 << 22)) != 0){\r
+ id->ACPI = true;\r
+ } else{\r
+ id->ACPI = false;\r
+ }\r
+ if((cpuidbuf[2] & ~(1 << 23)) != 0){\r
+ id->MMX = true;\r
+ } else{\r
+ id->MMX = false;\r
+ }\r
+ if((cpuidbuf[2] & ~(1 << 24)) != 0){\r
+ id->FXSR = true;\r
+ } else{\r
+ id->FXSR = false;\r
+ }\r
+ if((cpuidbuf[2] & ~(1 << 25)) != 0){\r
+ id->SSE = true;\r
+ } else{\r
+ id->SSE = false;\r
+ }\r
+ if((cpuidbuf[2] & ~(1 << 26)) != 0){\r
+ id->SSE2 = true;\r
+ } else{\r
+ id->SSE2 = false;\r
+ }\r
+ if((cpuidbuf[2] & ~(1 << 27)) != 0){\r
+ id->SS = true;\r
+ } else{\r
+ id->SS = false;\r
+ }\r
+ if((cpuidbuf[2] & ~(1 << 28)) != 0){\r
+ id->HTT = true;\r
+ } else{\r
+ id->HTT = false;\r
+ }\r
+ if((cpuidbuf[2] & ~(1 << 29)) != 0){\r
+ id->TM = true;\r
+ } else{\r
+ id->TM = false;\r
+ }\r
+ if((cpuidbuf[2] & ~(1 << 31)) != 0){\r
+ id->PBE = true;\r
+ } else{\r
+ id->PBE = false;\r
+ }\r
+\r
+ if((cpuidbuf[3] & ~(1 << 0)) != 0){\r
+ id->SSE3 = true;\r
+ } else{\r
+ id->SSE3 = false;\r
+ }\r
+ if((cpuidbuf[3] & ~(1 << 3)) != 0){\r
+ id->MONITOR = true;\r
+ } else{\r
+ id->MONITOR = false;\r
+ }\r
+ if((cpuidbuf[3] & ~(1 << 4)) != 0){\r
+ id->DSCPL = true;\r
+ } else{\r
+ id->DSCPL = false;\r
+ }\r
+ if((cpuidbuf[3] & ~(1 << 7)) != 0){\r
+ id->EST = true;\r
+ } else{\r
+ id->EST = false;\r
+ }\r
+ if((cpuidbuf[3] & ~(1 << 8)) != 0){\r
+ id->TM2 = true;\r
+ } else{\r
+ id->TM2 = false;\r
+ }\r
+ if((cpuidbuf[3] & ~(1 << 10)) != 0){\r
+ id->CID = true;\r
+ } else{\r
+ id->CID = false;\r
+ }\r
+ if((cpuidbuf[3] & ~(1 << 13)) != 0){\r
+ id->CX16 = true;\r
+ } else{\r
+ id->CX16 = false;\r
+ }\r
+ if((cpuidbuf[3] & ~(1 << 14)) != 0){\r
+ id->xTPR = true;\r
+ } else{\r
+ id->xTPR = false;\r
+ }\r
+ }\r
+ CPUID(cpuidbuf, 0x80000000);\r
+ if(cpuidbuf[0] >= 0x80000000){\r
+ id->ext_enable = true;\r
+ id->ext_max = cpuidbuf[0];\r
+ if(cpuidbuf[0] >= 0x80000004){\r
+ CPUID2(&s[0], 0x80000002);\r
+ CPUID2(&s[16], 0x80000003);\r
+ CPUID2(&s[32], 0x80000004);\r
+ sprintf(id->brand_string, "%s", s);\r
+ } else{\r
+ sprintf(id->brand_string, "Null");\r
+ }\r
+ } else{\r
+ id->ext_enable = false;\r
+ id->ext_max = 0;\r
+ }\r
+ } else{\r
+ id->enable = false;\r
+ id->max = 0;\r
+ sprintf(id->vendor, "Null");\r
+ }\r
+ return;\r
+}\r