1
0
Fork 0
mirror of https://github.com/hermitcore/libhermit.git synced 2025-03-16 00:00:06 +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
hermit/arch/x86
include/asm
kernel

View file

@ -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,9 +171,12 @@ int cpu_detection(void) {
cpuid(0x80000001, &a, &b, &c, &cpu_info.feature3);
cpuid(0x80000008, &cpu_info.addr_width, &b, &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) {
kprintf("Paging features: %s%s%s%s%s%s%s%s\n",