From 34256b9065994e28c58fb20093792976710a690b Mon Sep 17 00:00:00 2001
From: Yongcong Du <ycdu.vmcore@gmail.com>
Date: Tue, 3 Apr 2012 22:02:24 +0800
Subject: [PATCH 1/2] x86: add cpuid feature 6 flags
---
headers/private/kernel/arch/x86/arch_cpu.h | 20 ++++++++++++++++++--
src/system/kernel/arch/x86/arch_cpu.cpp | 19 +++++++++++++++++++
2 files changed, 37 insertions(+), 2 deletions(-)
diff --git a/headers/private/kernel/arch/x86/arch_cpu.h b/headers/private/kernel/arch/x86/arch_cpu.h
index e761292..5794c7d 100644
a
|
b
|
|
34 | 34 | #define IA32_MSR_MTRR_PHYSICAL_MASK_0 0x201 |
35 | 35 | |
36 | 36 | // x86 features from cpuid eax 1, edx register |
37 | | // reference http://www.intel.com/assets/pdf/appnote/241618.pdf (Table 5-5) |
| 37 | // reference http://www.intel.com/Assets/en_US/PDF/appnote/241618.pdf (Table 5-5) |
38 | 38 | #define IA32_FEATURE_FPU 0x00000001 // x87 fpu |
39 | 39 | #define IA32_FEATURE_VME 0x00000002 // virtual 8086 |
40 | 40 | #define IA32_FEATURE_DE 0x00000004 // debugging extensions |
… |
… |
|
66 | 66 | #define IA32_FEATURE_PBE 0x80000000 // pending break enable |
67 | 67 | |
68 | 68 | // x86 features from cpuid eax 1, ecx register |
69 | | // reference http://www.intel.com/assets/pdf/appnote/241618.pdf (Table 5-4) |
| 69 | // reference http://www.intel.com/Assets/en_US/PDF/appnote/241618.pdf (Table 5-4) |
70 | 70 | #define IA32_FEATURE_EXT_SSE3 0x00000001 // SSE3 |
71 | 71 | #define IA32_FEATURE_EXT_PCLMULQDQ 0x00000002 // PCLMULQDQ Instruction |
72 | 72 | #define IA32_FEATURE_EXT_DTES64 0x00000004 // 64-Bit Debug Store |
… |
… |
|
109 | 109 | #define IA32_FEATURE_AMD_EXT_3DNOWEXT (1 << 30) // 3DNow! extensions |
110 | 110 | #define IA32_FEATURE_AMD_EXT_3DNOW (1 << 31) // 3DNow! |
111 | 111 | |
| 112 | // x86 defined features from cpuid eax 6, eax register |
| 113 | // reference http://www.intel.com/Assets/en_US/PDF/appnote/241618.pdf (Table 5-11) |
| 114 | #define IA32_FEATURE_DTS (1 << 0) //Digital Thermal Sensor |
| 115 | #define IA32_FEATURE_ITB (1 << 1) //Intel Turbo Boost Technology |
| 116 | #define IA32_FEATURE_ARAT (1 << 2) //Always running APIC Timer |
| 117 | #define IA32_FEATURE_PLN (1 << 4) //Power Limit Notification |
| 118 | #define IA32_FEATURE_ECMD (1 << 5) //Extended Clock Modulation Duty |
| 119 | #define IA32_FEATURE_PTM (1 << 6) //Package Thermal Management |
| 120 | |
| 121 | // x86 defined features from cpuid eax 6, ecx register |
| 122 | // reference http://www.intel.com/Assets/en_US/PDF/appnote/241618.pdf (Table 5-11) |
| 123 | #define IA32_FEATURE_APERFMPERF (1 << 0) //IA32_APERF, IA32_MPERF |
| 124 | #define IA32_FEATURE_EPB (1 << 3) //IA32_ENERGY_PERF_BIAS |
| 125 | |
112 | 126 | // cr4 flags |
113 | 127 | #define IA32_CR4_PAE (1UL << 5) |
114 | 128 | #define IA32_CR4_GLOBAL_PAGES (1UL << 7) |
… |
… |
enum x86_feature_type {
|
272 | 286 | FEATURE_COMMON = 0, // cpuid eax=1, ecx register |
273 | 287 | FEATURE_EXT, // cpuid eax=1, edx register |
274 | 288 | FEATURE_EXT_AMD, // cpuid eax=0x80000001, edx register (AMD) |
| 289 | FEATURE_6_EAX, // cpuid eax=6, eax registers |
| 290 | FEATURE_6_ECX, // cpuid eax=6, ecx registers |
275 | 291 | |
276 | 292 | FEATURE_NUM |
277 | 293 | }; |
diff --git a/src/system/kernel/arch/x86/arch_cpu.cpp b/src/system/kernel/arch/x86/arch_cpu.cpp
index c199afc..05b8c01 100644
a
|
b
|
dump_feature_string(int currentCPU, cpu_ent *cpu)
|
510 | 510 | strlcat(features, "3dnowext ", sizeof(features)); |
511 | 511 | if (cpu->arch.feature[FEATURE_EXT_AMD] & IA32_FEATURE_AMD_EXT_3DNOW) |
512 | 512 | strlcat(features, "3dnow ", sizeof(features)); |
| 513 | if (cpu->arch.feature[FEATURE_6_EAX] & IA32_FEATURE_DTS) |
| 514 | strlcat(features, "dts ", sizeof(features)); |
| 515 | if (cpu->arch.feature[FEATURE_6_EAX] & IA32_FEATURE_ITB) |
| 516 | strlcat(features, "itb ", sizeof(features)); |
| 517 | if (cpu->arch.feature[FEATURE_6_EAX] & IA32_FEATURE_ARAT) |
| 518 | strlcat(features, "arat ", sizeof(features)); |
| 519 | if (cpu->arch.feature[FEATURE_6_EAX] & IA32_FEATURE_PLN) |
| 520 | strlcat(features, "pln ", sizeof(features)); |
| 521 | if (cpu->arch.feature[FEATURE_6_EAX] & IA32_FEATURE_ECMD) |
| 522 | strlcat(features, "ecmd ", sizeof(features)); |
| 523 | if (cpu->arch.feature[FEATURE_6_EAX] & IA32_FEATURE_PTM) |
| 524 | strlcat(features, "ptm ", sizeof(features)); |
| 525 | if (cpu->arch.feature[FEATURE_6_ECX] & IA32_FEATURE_APERFMPERF) |
| 526 | strlcat(features, "aperfmperf ", sizeof(features)); |
| 527 | if (cpu->arch.feature[FEATURE_6_ECX] & IA32_FEATURE_EPB) |
| 528 | strlcat(features, "epb ", sizeof(features)); |
513 | 529 | |
514 | 530 | dprintf("CPU %d: features: %s\n", currentCPU, features); |
515 | 531 | } |
… |
… |
detect_cpu(int currentCPU)
|
619 | 635 | get_current_cpuid(&cpuid, 0x80000001); |
620 | 636 | cpu->arch.feature[FEATURE_EXT_AMD] = cpuid.regs.edx; // edx |
621 | 637 | } |
| 638 | get_current_cpuid(&cpuid, 6); |
| 639 | cpu->arch.feature[FEATURE_6_EAX] = cpuid.regs.eax; |
| 640 | cpu->arch.feature[FEATURE_6_ECX] = cpuid.regs.ecx; |
622 | 641 | |
623 | 642 | #if DUMP_FEATURE_STRING |
624 | 643 | dump_feature_string(currentCPU, cpu); |