Ticket #8444: 0001-x86-add-cpuid-feature-6-flags.patch

File 0001-x86-add-cpuid-feature-6-flags.patch, 4.6 KB (added by yongcong, 12 years ago)
  • headers/private/kernel/arch/x86/arch_cpu.h

    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  
    3434#define IA32_MSR_MTRR_PHYSICAL_MASK_0   0x201
    3535
    3636// 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)
    3838#define IA32_FEATURE_FPU    0x00000001 // x87 fpu
    3939#define IA32_FEATURE_VME    0x00000002 // virtual 8086
    4040#define IA32_FEATURE_DE     0x00000004 // debugging extensions
     
    6666#define IA32_FEATURE_PBE    0x80000000 // pending break enable
    6767
    6868// 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)
    7070#define IA32_FEATURE_EXT_SSE3       0x00000001  // SSE3
    7171#define IA32_FEATURE_EXT_PCLMULQDQ  0x00000002  // PCLMULQDQ Instruction
    7272#define IA32_FEATURE_EXT_DTES64     0x00000004  // 64-Bit Debug Store
     
    109109#define IA32_FEATURE_AMD_EXT_3DNOWEXT   (1 << 30)   // 3DNow! extensions
    110110#define IA32_FEATURE_AMD_EXT_3DNOW      (1 << 31)   // 3DNow!
    111111
     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
    112126// cr4 flags
    113127#define IA32_CR4_PAE                    (1UL << 5)
    114128#define IA32_CR4_GLOBAL_PAGES           (1UL << 7)
    enum x86_feature_type {  
    272286    FEATURE_COMMON = 0,     // cpuid eax=1, ecx register
    273287    FEATURE_EXT,            // cpuid eax=1, edx register
    274288    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
    275291
    276292    FEATURE_NUM
    277293};
  • src/system/kernel/arch/x86/arch_cpu.cpp

    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)  
    510510        strlcat(features, "3dnowext ", sizeof(features));
    511511    if (cpu->arch.feature[FEATURE_EXT_AMD] & IA32_FEATURE_AMD_EXT_3DNOW)
    512512        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));
    513529
    514530    dprintf("CPU %d: features: %s\n", currentCPU, features);
    515531}
    detect_cpu(int currentCPU)  
    619635        get_current_cpuid(&cpuid, 0x80000001);
    620636        cpu->arch.feature[FEATURE_EXT_AMD] = cpuid.regs.edx; // edx
    621637    }
     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;
    622641
    623642#if DUMP_FEATURE_STRING
    624643    dump_feature_string(currentCPU, cpu);