OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_009 / chnos / cpuid.c
diff --git a/CHNOSProject/chnos/tolset_chn_000/chnos_009/chnos/cpuid.c b/CHNOSProject/chnos/tolset_chn_000/chnos_009/chnos/cpuid.c
new file mode 100644 (file)
index 0000000..7a20d75
--- /dev/null
@@ -0,0 +1,234 @@
+\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