Commit 558fa8361bc3e35fce73448c0b45e9d85ab59130
1 parent
e6a6d5ab
My core2duo patch introduced a vague statement of "missing features" in
the CPUID specification. This patch addresses this by specifying exactly what is missing. While going along the missing CPUID entries I also stumbled across invalid and missing CPUID #defines while comparing them to the Intel Documentation. This patch also addresses these. I found them too minor to split them up in a separate patch. Furthermore I looked through CPUID functions > 5 and realized that it should be safe to bump the level to 10. I tried booting Linux with that and it worked fine. Signed-off-by: Alexander Graf <agraf@suse.de> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5350 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
41 additions
and
9 deletions
target-i386/cpu.h
... | ... | @@ -298,6 +298,7 @@ |
298 | 298 | #define CPUID_PBE (1 << 31) |
299 | 299 | |
300 | 300 | #define CPUID_EXT_SSE3 (1 << 0) |
301 | +#define CPUID_EXT_DTES64 (1 << 2) | |
301 | 302 | #define CPUID_EXT_MONITOR (1 << 3) |
302 | 303 | #define CPUID_EXT_DSCPL (1 << 4) |
303 | 304 | #define CPUID_EXT_VMX (1 << 5) |
... | ... | @@ -308,8 +309,15 @@ |
308 | 309 | #define CPUID_EXT_CID (1 << 10) |
309 | 310 | #define CPUID_EXT_CX16 (1 << 13) |
310 | 311 | #define CPUID_EXT_XTPR (1 << 14) |
311 | -#define CPUID_EXT_DCA (1 << 17) | |
312 | -#define CPUID_EXT_POPCNT (1 << 22) | |
312 | +#define CPUID_EXT_PDCM (1 << 15) | |
313 | +#define CPUID_EXT_DCA (1 << 18) | |
314 | +#define CPUID_EXT_SSE41 (1 << 19) | |
315 | +#define CPUID_EXT_SSE42 (1 << 20) | |
316 | +#define CPUID_EXT_X2APIC (1 << 21) | |
317 | +#define CPUID_EXT_MOVBE (1 << 22) | |
318 | +#define CPUID_EXT_POPCNT (1 << 23) | |
319 | +#define CPUID_EXT_XSAVE (1 << 26) | |
320 | +#define CPUID_EXT_OSXSAVE (1 << 27) | |
313 | 321 | |
314 | 322 | #define CPUID_EXT2_SYSCALL (1 << 11) |
315 | 323 | #define CPUID_EXT2_MP (1 << 19) | ... | ... |
target-i386/helper.c
... | ... | @@ -167,19 +167,22 @@ static x86_def_t x86_defs[] = { |
167 | 167 | }, |
168 | 168 | { |
169 | 169 | .name = "core2duo", |
170 | - /* original is on level 10 */ | |
171 | - .level = 5, | |
170 | + .level = 10, | |
172 | 171 | .family = 6, |
173 | 172 | .model = 15, |
174 | 173 | .stepping = 11, |
175 | - /* the original CPU does have many more features that are | |
176 | - * not implemented yet */ | |
174 | + /* The original CPU also implements these features: | |
175 | + CPUID_VME, CPUID_DTS, CPUID_ACPI, CPUID_SS, CPUID_HT, | |
176 | + CPUID_TM, CPUID_PBE */ | |
177 | 177 | .features = PPRO_FEATURES | |
178 | 178 | CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | |
179 | 179 | CPUID_PSE36, |
180 | + /* The original CPU also implements these ext features: | |
181 | + CPUID_EXT_DTES64, CPUID_EXT_DSCPL, CPUID_EXT_VMX, CPUID_EXT_EST, | |
182 | + CPUID_EXT_TM2, CPUID_EXT_CX16, CPUID_EXT_XTPR, CPUID_EXT_PDCM */ | |
180 | 183 | .ext_features = CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_SSSE3, |
181 | - .ext2_features = (PPRO_FEATURES & 0x0183F3FF) | | |
182 | - CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX, | |
184 | + .ext2_features = CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX, | |
185 | + /* Missing: .ext3_features = CPUID_EXT3_LAHF_LM */ | |
183 | 186 | .xlevel = 0x8000000A, |
184 | 187 | .model_id = "Intel(R) Core(TM)2 Duo CPU T7700 @ 2.40GHz", |
185 | 188 | }, |
... | ... | @@ -240,7 +243,7 @@ static x86_def_t x86_defs[] = { |
240 | 243 | .family = 6, |
241 | 244 | .model = 2, |
242 | 245 | .stepping = 3, |
243 | - .features = PPRO_FEATURES | PPRO_FEATURES | CPUID_PSE36 | CPUID_VME | CPUID_MTRR | CPUID_MCA, | |
246 | + .features = PPRO_FEATURES | CPUID_PSE36 | CPUID_VME | CPUID_MTRR | CPUID_MCA, | |
244 | 247 | .ext2_features = (PPRO_FEATURES & 0x0183F3FF) | CPUID_EXT2_MMXEXT | CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT, |
245 | 248 | .xlevel = 0x80000008, |
246 | 249 | /* XXX: put another string ? */ | ... | ... |
target-i386/op_helper.c
... | ... | @@ -1956,6 +1956,27 @@ void helper_cpuid(void) |
1956 | 1956 | ECX = CPUID_MWAIT_EMX | CPUID_MWAIT_IBE; |
1957 | 1957 | EDX = 0; |
1958 | 1958 | break; |
1959 | + case 6: | |
1960 | + /* Thermal and Power Leaf */ | |
1961 | + EAX = 0; | |
1962 | + EBX = 0; | |
1963 | + ECX = 0; | |
1964 | + EDX = 0; | |
1965 | + break; | |
1966 | + case 9: | |
1967 | + /* Direct Cache Access Information Leaf */ | |
1968 | + EAX = 0; /* Bits 0-31 in DCA_CAP MSR */ | |
1969 | + EBX = 0; | |
1970 | + ECX = 0; | |
1971 | + EDX = 0; | |
1972 | + break; | |
1973 | + case 0xA: | |
1974 | + /* Architectural Performance Monitoring Leaf */ | |
1975 | + EAX = 0; | |
1976 | + EBX = 0; | |
1977 | + ECX = 0; | |
1978 | + EDX = 0; | |
1979 | + break; | |
1959 | 1980 | case 0x80000000: |
1960 | 1981 | EAX = env->cpuid_xlevel; |
1961 | 1982 | EBX = env->cpuid_vendor1; | ... | ... |