From 8190bb688947a5ea03882a5c20cf3db968ca48b4 Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Thu, 9 Jul 2015 10:51:55 +0200 Subject: [PATCH] add cpuid level check only level >= 7 is able to determine AVX2 --- hermit/arch/x86/include/asm/processor.h | 16 ++++++++-------- hermit/arch/x86/kernel/processor.c | 14 +++++++++++--- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/hermit/arch/x86/include/asm/processor.h b/hermit/arch/x86/include/asm/processor.h index 05a13aa93..c4120e87a 100644 --- a/hermit/arch/x86/include/asm/processor.h +++ b/hermit/arch/x86/include/asm/processor.h @@ -61,19 +61,19 @@ extern "C" { #define CPU_FEATURE_SSE2 (1 << 26) // feature list 0x00000001 (ecx) -#define CPU_FEATURE_SSE3 (1 << 9) -#define CPU_FEATURE_FMA (1 << 12) +#define CPU_FEATURE_SSE3 (1 << 9) +#define CPU_FEATURE_FMA (1 << 12) #define CPU_FEATURE_SSE4_1 (1 << 19) #define CPU_FEATURE_SSE4_2 (1 << 20) #define CPU_FEATURE_X2APIC (1 << 21) -#define CPU_FEATURE_MOVBE (1 << 22) -#define CPU_FEATURE_XSAVE (1 << 26) +#define CPU_FEATURE_MOVBE (1 << 22) +#define CPU_FEATURE_XSAVE (1 << 26) #define CPU_FEATURE_OSXSAVE (1 << 27) -#define CPU_FEATURE_AVX (1 << 28) -#define CPU_FEATURE_HYPERVISOR (1 << 31) +#define CPU_FEATURE_AVX (1 << 28) +#define CPU_FEATURE_HYPERVISOR (1 << 31) // CPUID.80000001H:EDX feature list -#define CPU_FEATURE_SYSCALL (1 << 11) +#define CPU_FEATURE_SYSCALL (1 << 11) #define CPU_FEATURE_NX (1 << 20) #define CPU_FEATURE_1GBHP (1 << 26) #define CPU_FEATURE_LM (1 << 29) @@ -260,7 +260,7 @@ inline static uint32_t has_nx(void) } inline static uint32_t has_avx2(void) { - return (cpu_info.feature4 & CPU_FEATURE_AVX2); + return cpu_info.feature4 & CPU_FEATURE_AVX2; } /** @brief Read out time stamp counter * diff --git a/hermit/arch/x86/kernel/processor.c b/hermit/arch/x86/kernel/processor.c index 3601fe269..666acaab8 100644 --- a/hermit/arch/x86/kernel/processor.c +++ b/hermit/arch/x86/kernel/processor.c @@ -148,13 +148,18 @@ uint32_t detect_cpu_frequency(void) int cpu_detection(void) { uint64_t xcr0; - uint32_t a=0, b=0, c=0, d=0; + uint32_t a=0, b=0, c=0, d=0, level = 0; uint32_t family, model, stepping; size_t cr4; uint8_t first_time = 0; if (!cpu_info.feature1) { first_time = 1; + + cpuid(0, &level, &b, &c, &d); + kprintf("cpuid level %d\n", level); + + a = b = c = d = 0; cpuid(1, &a, &b, &cpu_info.feature2, &cpu_info.feature1); family = (a & 0x00000F00) >> 8; @@ -166,8 +171,11 @@ int cpu_detection(void) { cpuid(0x80000001, &a, &b, &c, &cpu_info.feature3); cpuid(0x80000008, &cpu_info.addr_width, &b, &c, &d); - a = b = c = d = 0; - cpuid(7, &a, &cpu_info.feature4, &c, &d); + /* Additional Intel-defined flags: level 0x00000007 */ + if (level >= 0x00000007) { + a = b = c = d = 0; + cpuid(7, &a, &cpu_info.feature4, &c, &d); + } } if (first_time) {