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