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

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

    From 673a5d9ffd9869a5f7271cc351b6fc473b90acde 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 个文件被修改,插入 37 行(+),删除 2 行(-)
    
    diff --git a/headers/private/kernel/arch/x86/arch_cpu.h b/headers/private/kernel/arch/x86/arch_cpu.h
    index ff5523b..4365fe1 100644
    a b  
    3737#define K8_MSR_IPM                      0xc0010055
    3838
    3939// x86 features from cpuid eax 1, edx register
    40 // reference http://www.intel.com/assets/pdf/appnote/241618.pdf (Table 5-5)
     40// reference http://www.intel.com/Assets/en_US/PDF/appnote/241618.pdf (Table 5-5)
    4141#define IA32_FEATURE_FPU    (1 << 0) // x87 fpu
    4242#define IA32_FEATURE_VME    (1 << 1) // virtual 8086
    4343#define IA32_FEATURE_DE     (1 << 2) // debugging extensions
     
    7272#define IA32_FEATURE_PBE    (1 << 31) // pending break enable
    7373
    7474// x86 features from cpuid eax 1, ecx register
    75 // reference http://www.intel.com/assets/pdf/appnote/241618.pdf (Table 5-4)
     75// reference http://www.intel.com/Assets/en_US/PDF/appnote/241618.pdf (Table 5-4)
    7676#define IA32_FEATURE_EXT_SSE3       (1 << 0) // SSE3
    7777#define IA32_FEATURE_EXT_PCLMULQDQ  (1 << 1) // PCLMULQDQ Instruction
    7878#define IA32_FEATURE_EXT_DTES64     (1 << 2) // 64-Bit Debug Store
     
    117117#define IA32_FEATURE_AMD_EXT_3DNOWEXT   (1 << 30) // 3DNow! extensions
    118118#define IA32_FEATURE_AMD_EXT_3DNOW      (1 << 31) // 3DNow!
    119119
     120// x86 defined features from cpuid eax 6, eax register
     121// reference http://www.intel.com/Assets/en_US/PDF/appnote/241618.pdf (Table 5-11)
     122#define IA32_FEATURE_DTS    (1 << 0) //Digital Thermal Sensor
     123#define IA32_FEATURE_ITB    (1 << 1) //Intel Turbo Boost Technology
     124#define IA32_FEATURE_ARAT   (1 << 2) //Always running APIC Timer
     125#define IA32_FEATURE_PLN    (1 << 4) //Power Limit Notification
     126#define IA32_FEATURE_ECMD   (1 << 5) //Extended Clock Modulation Duty
     127#define IA32_FEATURE_PTM    (1 << 6) //Package Thermal Management
     128
     129// x86 defined features from cpuid eax 6, ecx register
     130// reference http://www.intel.com/Assets/en_US/PDF/appnote/241618.pdf (Table 5-11)
     131#define IA32_FEATURE_APERFMPERF (1 << 0) //IA32_APERF, IA32_MPERF
     132#define IA32_FEATURE_EPB    (1 << 3) //IA32_ENERGY_PERF_BIAS
     133
    120134// cr4 flags
    121135#define IA32_CR4_PAE                    (1UL << 5)
    122136#define IA32_CR4_GLOBAL_PAGES           (1UL << 7)
    enum x86_feature_type {  
    280294    FEATURE_COMMON = 0,     // cpuid eax=1, ecx register
    281295    FEATURE_EXT,            // cpuid eax=1, edx register
    282296    FEATURE_EXT_AMD,        // cpuid eax=0x80000001, edx register (AMD)
     297    FEATURE_6_EAX,          // cpuid eax=6, eax registers
     298    FEATURE_6_ECX,          // cpuid eax=6, ecx registers
    283299
    284300    FEATURE_NUM
    285301};
  • 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 81daaf8..5ebb194 100644
    a b dump_feature_string(int currentCPU, cpu_ent *cpu)  
    516516        strlcat(features, "3dnowext ", sizeof(features));
    517517    if (cpu->arch.feature[FEATURE_EXT_AMD] & IA32_FEATURE_AMD_EXT_3DNOW)
    518518        strlcat(features, "3dnow ", sizeof(features));
     519    if (cpu->arch.feature[FEATURE_6_EAX] & IA32_FEATURE_DTS)
     520        strlcat(features, "dts ", sizeof(features));
     521    if (cpu->arch.feature[FEATURE_6_EAX] & IA32_FEATURE_ITB)
     522        strlcat(features, "itb ", sizeof(features));
     523    if (cpu->arch.feature[FEATURE_6_EAX] & IA32_FEATURE_ARAT)
     524        strlcat(features, "arat ", sizeof(features));
     525    if (cpu->arch.feature[FEATURE_6_EAX] & IA32_FEATURE_PLN)
     526        strlcat(features, "pln ", sizeof(features));
     527    if (cpu->arch.feature[FEATURE_6_EAX] & IA32_FEATURE_ECMD)
     528        strlcat(features, "ecmd ", sizeof(features));
     529    if (cpu->arch.feature[FEATURE_6_EAX] & IA32_FEATURE_PTM)
     530        strlcat(features, "ptm ", sizeof(features));
     531    if (cpu->arch.feature[FEATURE_6_ECX] & IA32_FEATURE_APERFMPERF)
     532        strlcat(features, "aperfmperf ", sizeof(features));
     533    if (cpu->arch.feature[FEATURE_6_ECX] & IA32_FEATURE_EPB)
     534        strlcat(features, "epb ", sizeof(features));
    519535
    520536    dprintf("CPU %d: features: %s\n", currentCPU, features);
    521537}
    detect_cpu(int currentCPU)  
    625641        get_current_cpuid(&cpuid, 0x80000001);
    626642        cpu->arch.feature[FEATURE_EXT_AMD] = cpuid.regs.edx; // edx
    627643    }
     644    get_current_cpuid(&cpuid, 6);
     645    cpu->arch.feature[FEATURE_6_EAX] = cpuid.regs.eax;
     646    cpu->arch.feature[FEATURE_6_ECX] = cpuid.regs.ecx;
    628647
    629648#if DUMP_FEATURE_STRING
    630649    dump_feature_string(currentCPU, cpu);