1
0
Fork 0
mirror of https://github.com/hermitcore/libhermit.git synced 2025-03-09 00:00:03 +01:00

add cpuid level check

only level >= 7 is able to determine AVX2
This commit is contained in:
Stefan Lankes 2015-07-09 10:51:55 +02:00
parent fcd1404ccd
commit 8190bb6889
2 changed files with 19 additions and 11 deletions

View file

@ -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
*

View file

@ -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) {