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:
parent
fcd1404ccd
commit
8190bb6889
2 changed files with 19 additions and 11 deletions
hermit/arch/x86
|
@ -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
|
||||
*
|
||||
|
|
|
@ -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",
|
||||
|
|
Loading…
Add table
Reference in a new issue