diff --git a/hermit/arch/x86/include/asm/processor.h b/hermit/arch/x86/include/asm/processor.h index a9d8800af..01094a472 100644 --- a/hermit/arch/x86/include/asm/processor.h +++ b/hermit/arch/x86/include/asm/processor.h @@ -86,7 +86,28 @@ extern "C" { // feature list 0x00000007:0 #define CPU_FEATURE_FSGSBASE (1 << 0) +#define CPU_FEATURE_TSC_ADJUST (1 << 1) +#define CPU_FEATURE_BMI1 (1 << 3) +#define CPU_FEATURE_HLE (1 << 4) #define CPU_FEATURE_AVX2 (1 << 5) +#define CPU_FEATURE_SMEP (1 << 7) +#define CPU_FEATURE_BMI2 (1 << 8) +#define CPU_FEATURE_ERMS (1 << 9) +#define CPU_FEATURE_INVPCID (1 << 10) +#define CPU_FEATURE_RTM (1 << 11) +#define CPU_FEATURE_CQM (1 << 12) +#define CPU_FEATURE_MPX (1 << 14) +#define CPU_FEATURE_AVX512F (1 << 16) +#define CPU_FEATURE_RDSEED (1 << 18) +#define CPU_FEATURE_ADX (1 << 19) +#define CPU_FEATURE_SMAP (1 << 20) +#define CPU_FEATURE_PCOMMIT (1 << 22) +#define CPU_FEATURE_CLFLUSHOPT (1 << 23) +#define CPU_FEATURE_CLWB (1 << 24) +#define CPU_FEATURE_AVX512PF (1 << 26) +#define CPU_FEATURE_AVX512ER (1 << 27) +#define CPU_FEATURE_AVX512CD (1 << 28) +#define CPU_FEATURE_SHA_NI (1 << 29) // feature list 0x00000006 #define CPU_FEATURE_IDA (1 << 0) @@ -380,6 +401,42 @@ inline static uint32_t has_avx2(void) { return (cpu_info.feature4 & CPU_FEATURE_AVX2); } +inline static uint32_t has_bmi1(void) { + return (cpu_info.feature4 & CPU_FEATURE_BMI1); +} + +inline static uint32_t has_bmi2(void) { + return (cpu_info.feature4 & CPU_FEATURE_BMI2); +} + +inline static uint32_t has_hle(void) { + return (cpu_info.feature4 & CPU_FEATURE_HLE); +} + +inline static uint32_t has_cqm(void) { + return (cpu_info.feature4 & CPU_FEATURE_CQM); +} + +inline static uint32_t has_rtm(void) { + return (cpu_info.feature4 & CPU_FEATURE_RTM); +} + +inline static uint32_t has_avx512f(void) { + return (cpu_info.feature4 & CPU_FEATURE_AVX512F); +} + +inline static uint32_t has_avx512pf(void) { + return (cpu_info.feature4 & CPU_FEATURE_AVX512PF); +} + +inline static uint32_t has_avx512er(void) { + return (cpu_info.feature4 & CPU_FEATURE_AVX512ER); +} + +inline static uint32_t has_avx512cd(void) { + return (cpu_info.feature4 & CPU_FEATURE_AVX512CD); +} + inline static uint32_t has_rdtscp(void) { return (cpu_info.feature3 & CPU_FEATURE_RDTSCP); } diff --git a/hermit/arch/x86/kernel/processor.c b/hermit/arch/x86/kernel/processor.c index 9f493ca3f..36b87b8e1 100644 --- a/hermit/arch/x86/kernel/processor.c +++ b/hermit/arch/x86/kernel/processor.c @@ -470,7 +470,7 @@ int cpu_detection(void) { a = b = c = d = 0; cpuid(1, &a, &b, &cpu_info.feature2, &cpu_info.feature1); - kprintf("CPU features: %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n", + kprintf("CPU features: %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n", has_sse() ? "SSE " : "", has_sse2() ? "SSE2 " : "", has_sse3() ? "SSE3 " : "", @@ -489,7 +489,16 @@ int cpu_detection(void) { has_rdtscp() ? "RDTSCP " : "", has_fsgsbase() ? "FSGSBASE " : "", has_mwait() ? "MWAIT " : "", - has_dca() ? "DCA " : ""); + has_bmi1() ? "BMI1 " : "", + has_bmi2() ? "BMI2 " : "", + has_dca() ? "DCA " : "", + has_rtm() ? "RTM " : "", + has_hle() ? "HLE " : "", + has_cqm() ? "CQM " : "", + has_avx512f() ? "AVX512F " : "", + has_avx512cd() ? "AVX512CD " : "", + has_avx512pf() ? "AVX512PF " : "", + has_avx512er() ? "AVX512ER " : ""); } if (first_time && has_osxsave()) {