OSDN Git Service

AI003:config.txt, words.txtを追加。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_009 / chnos / cpuid.c
1 \r
2 #include "core.h"\r
3 \r
4 void CPU_Identify(DATA_CPUID *id)\r
5 {\r
6         uint eflags0, eflags1;\r
7         uint cpuidbuf[5];       //EAX-EBX-EDX-ECX-0x00000000\r
8         uchar s[64];\r
9 \r
10         cpuidbuf[4] = 0x00000000;\r
11 \r
12         eflags0 = IO_Load_EFlags();\r
13         IO_Store_EFlags(eflags0 | 0x00200000);\r
14         eflags1 = IO_Load_EFlags();\r
15         IO_Store_EFlags(eflags0);\r
16 \r
17         if((eflags1 | 0xffdfffff) == 0xffffffff){\r
18                 id->enable = true;\r
19                 CPUID(cpuidbuf, 0);\r
20                 id->max = cpuidbuf[0];\r
21                 sprintf(id->vendor, "%s", &cpuidbuf[1]);\r
22 \r
23                 if(id->max >= 1){\r
24                         CPUID(cpuidbuf, 1);\r
25                         if((cpuidbuf[2] & ~1 << 0) != 0){\r
26                                 id->FPU = true;\r
27                         } else{\r
28                                 id->FPU = false;\r
29                         }\r
30                         if((cpuidbuf[2] & ~(1 << 1)) != 0){\r
31                                 id->VME = true;\r
32                         } else{\r
33                                 id->VME = false;\r
34                         }\r
35                         if((cpuidbuf[2] & ~(1 << 2)) != 0){\r
36                                 id->DE = true;\r
37                         } else{\r
38                                 id->DE = false;\r
39                         }\r
40                         if((cpuidbuf[2] & ~(1 << 3)) != 0){\r
41                                 id->PSE = true;\r
42                         } else{\r
43                                 id->PSE = false;\r
44                         }\r
45                         if((cpuidbuf[2] & ~(1 << 4)) != 0){\r
46                                 id->TSC = true;\r
47                         } else{\r
48                                 id->TSC = false;\r
49                         }\r
50                         if((cpuidbuf[2] & ~(1 << 5)) != 0){\r
51                                 id->MSR = true;\r
52                         } else{\r
53                                 id->MSR = false;\r
54                         }\r
55                         if((cpuidbuf[2] & ~(1 << 6)) != 0){\r
56                                 id->PAE = true;\r
57                         } else{\r
58                                 id->PAE = false;\r
59                         }\r
60                         if((cpuidbuf[2] & ~(1 << 7)) != 0){\r
61                                 id->MCE = true;\r
62                         } else{\r
63                                 id->MCE = false;\r
64                         }\r
65                         if((cpuidbuf[2] & ~(1 << 8)) != 0){\r
66                                 id->CX8 = true;\r
67                         } else{\r
68                                 id->CX8 = false;\r
69                         }\r
70                         if((cpuidbuf[2] & ~(1 << 9)) != 0){\r
71                                 id->APIC = true;\r
72                         } else{\r
73                                 id->APIC = false;\r
74                         }\r
75                         if((cpuidbuf[2] & ~(1 << 11)) != 0){\r
76                                 id->SEP = true;\r
77                         } else{\r
78                                 id->SEP = false;\r
79                         }\r
80                         if((cpuidbuf[2] & ~(1 << 12)) != 0){\r
81                                 id->MTRR = true;\r
82                         } else{\r
83                                 id->MTRR = false;\r
84                         }\r
85                         if((cpuidbuf[2] & ~(1 << 13)) != 0){\r
86                                 id->PGE = true;\r
87                         } else{\r
88                                 id->PGE = false;\r
89                         }\r
90                         if((cpuidbuf[2] & ~(1 << 14)) != 0){\r
91                                 id->MCA = true;\r
92                         } else{\r
93                                 id->MCA = false;\r
94                         }\r
95                         if((cpuidbuf[2] & ~(1 << 15)) != 0){\r
96                                 id->CMOV = true;\r
97                         } else{\r
98                                 id->CMOV = false;\r
99                         }\r
100                         if((cpuidbuf[2] & ~(1 << 16)) != 0){\r
101                                 id->PAT = true;\r
102                         } else{\r
103                                 id->PAT = false;\r
104                         }\r
105                         if((cpuidbuf[2] & ~(1 << 17)) != 0){\r
106                                 id->PSE36 = true;\r
107                         } else{\r
108                                 id->PSE36 = false;\r
109                                 }\r
110                         if((cpuidbuf[2] & ~(1 << 18)) != 0){\r
111                                 id->PSN = true;\r
112                         } else{\r
113                                 id->PSN = false;\r
114                         }\r
115                         if((cpuidbuf[2] & ~(1 << 19)) != 0){\r
116                                 id->CLFSH = true;\r
117                         } else{\r
118                                 id->CLFSH = false;\r
119                         }\r
120                         if((cpuidbuf[2] & ~(1 << 21)) != 0){\r
121                                 id->DS = true;\r
122                         } else{\r
123                                 id->DS = false;\r
124                         }\r
125                         if((cpuidbuf[2] & ~(1 << 22)) != 0){\r
126                                 id->ACPI = true;\r
127                         } else{\r
128                                 id->ACPI = false;\r
129                         }\r
130                         if((cpuidbuf[2] & ~(1 << 23)) != 0){\r
131                                 id->MMX = true;\r
132                         } else{\r
133                                 id->MMX = false;\r
134                         }\r
135                         if((cpuidbuf[2] & ~(1 << 24)) != 0){\r
136                                 id->FXSR = true;\r
137                         } else{\r
138                                 id->FXSR = false;\r
139                         }\r
140                         if((cpuidbuf[2] & ~(1 << 25)) != 0){\r
141                                 id->SSE = true;\r
142                         } else{\r
143                                 id->SSE = false;\r
144                         }\r
145                         if((cpuidbuf[2] & ~(1 << 26)) != 0){\r
146                                 id->SSE2 = true;\r
147                         } else{\r
148                                 id->SSE2 = false;\r
149                         }\r
150                         if((cpuidbuf[2] & ~(1 << 27)) != 0){\r
151                                 id->SS = true;\r
152                         } else{\r
153                                 id->SS = false;\r
154                         }\r
155                         if((cpuidbuf[2] & ~(1 << 28)) != 0){\r
156                                 id->HTT = true;\r
157                         } else{\r
158                                 id->HTT = false;\r
159                         }\r
160                         if((cpuidbuf[2] & ~(1 << 29)) != 0){\r
161                                 id->TM = true;\r
162                         } else{\r
163                                 id->TM = false;\r
164                         }\r
165                         if((cpuidbuf[2] & ~(1 << 31)) != 0){\r
166                                 id->PBE = true;\r
167                         } else{\r
168                                 id->PBE = false;\r
169                         }\r
170 \r
171                         if((cpuidbuf[3] & ~(1 << 0)) != 0){\r
172                                 id->SSE3 = true;\r
173                         } else{\r
174                                 id->SSE3 = false;\r
175                         }\r
176                         if((cpuidbuf[3] & ~(1 << 3)) != 0){\r
177                                 id->MONITOR = true;\r
178                         } else{\r
179                                 id->MONITOR = false;\r
180                         }\r
181                         if((cpuidbuf[3] & ~(1 << 4)) != 0){\r
182                                 id->DSCPL = true;\r
183                         } else{\r
184                                 id->DSCPL = false;\r
185                         }\r
186                         if((cpuidbuf[3] & ~(1 << 7)) != 0){\r
187                                 id->EST = true;\r
188                         } else{\r
189                                 id->EST = false;\r
190                         }\r
191                         if((cpuidbuf[3] & ~(1 << 8)) != 0){\r
192                                 id->TM2 = true;\r
193                         } else{\r
194                                 id->TM2 = false;\r
195                         }\r
196                         if((cpuidbuf[3] & ~(1 << 10)) != 0){\r
197                                 id->CID = true;\r
198                         } else{\r
199                                 id->CID = false;\r
200                         }\r
201                         if((cpuidbuf[3] & ~(1 << 13)) != 0){\r
202                                 id->CX16 = true;\r
203                         } else{\r
204                                 id->CX16 = false;\r
205                         }\r
206                         if((cpuidbuf[3] & ~(1 << 14)) != 0){\r
207                                 id->xTPR = true;\r
208                         } else{\r
209                                 id->xTPR = false;\r
210                         }\r
211                 }\r
212                 CPUID(cpuidbuf, 0x80000000);\r
213                 if(cpuidbuf[0] >= 0x80000000){\r
214                         id->ext_enable = true;\r
215                         id->ext_max = cpuidbuf[0];\r
216                         if(cpuidbuf[0] >= 0x80000004){\r
217                                 CPUID2(&s[0], 0x80000002);\r
218                                 CPUID2(&s[16], 0x80000003);\r
219                                 CPUID2(&s[32], 0x80000004);\r
220                                 sprintf(id->brand_string, "%s", s);\r
221                         } else{\r
222                                 sprintf(id->brand_string, "Null");\r
223                         }\r
224                 } else{\r
225                         id->ext_enable = false;\r
226                         id->ext_max = 0;\r
227                 }\r
228         } else{\r
229                 id->enable = false;\r
230                 id->max = 0;\r
231                 sprintf(id->vendor, "Null");\r
232         }\r
233         return;\r
234 }\r