1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 16:57:35 +00:00

Kernel: Support all Intel-defined extended CPUID feature flags for EAX=7

We're now able to detect all the extended CPUID feature flags from
EBX/ECX/EDX for EAX=7 :^)
This commit is contained in:
Linus Groh 2022-03-27 14:49:18 +01:00 committed by Andreas Kling
parent 6ca03b915e
commit 96e6420d8d
3 changed files with 405 additions and 12 deletions

View file

@ -134,14 +134,167 @@ StringView cpu_feature_to_string_view(CPUFeature::Type const& feature)
return "ia64"sv;
if (feature == CPUFeature::PBE)
return "pbe"sv;
if (feature == CPUFeature::FSGSBASE)
return "fsgsbase"sv;
if (feature == CPUFeature::TSC_ADJUST)
return "tsc_adjust"sv;
if (feature == CPUFeature::SGX)
return "sgx"sv;
if (feature == CPUFeature::BMI1)
return "bmi1"sv;
if (feature == CPUFeature::HLE)
return "hle"sv;
if (feature == CPUFeature::AVX2)
return "avx2"sv;
if (feature == CPUFeature::FDP_EXCPTN_ONLY)
return "fdp_excptn_only"sv;
if (feature == CPUFeature::SMEP)
return "smep"sv;
if (feature == CPUFeature::BMI2)
return "bmi2"sv;
if (feature == CPUFeature::ERMS)
return "erms"sv;
if (feature == CPUFeature::INVPCID)
return "invpcid"sv;
if (feature == CPUFeature::RTM)
return "rtm"sv;
if (feature == CPUFeature::PQM)
return "pqm"sv;
if (feature == CPUFeature::ZERO_FCS_FDS)
return "zero_fcs_fds"sv;
if (feature == CPUFeature::MPX)
return "mpx"sv;
if (feature == CPUFeature::PQE)
return "pqe"sv;
if (feature == CPUFeature::AVX512_F)
return "avx512_f"sv;
if (feature == CPUFeature::AVX512_DQ)
return "avx512_dq"sv;
if (feature == CPUFeature::RDSEED)
return "rdseed"sv;
if (feature == CPUFeature::ADX)
return "adx"sv;
if (feature == CPUFeature::SMAP)
return "smap"sv;
if (feature == CPUFeature::AVX512_IFMA)
return "avx512_ifma"sv;
if (feature == CPUFeature::PCOMMIT)
return "pcommit"sv;
if (feature == CPUFeature::CLFLUSHOPT)
return "clflushopt"sv;
if (feature == CPUFeature::CLWB)
return "clwb"sv;
if (feature == CPUFeature::INTEL_PT)
return "intel_pt"sv;
if (feature == CPUFeature::AVX512_PF)
return "avx512_pf"sv;
if (feature == CPUFeature::AVX512_ER)
return "avx512_er"sv;
if (feature == CPUFeature::AVX512_CD)
return "avx512_cd"sv;
if (feature == CPUFeature::SHA)
return "sha"sv;
if (feature == CPUFeature::AVX512_BW)
return "avx512_bw"sv;
if (feature == CPUFeature::AVX512_VL)
return "avx512_vl"sv;
if (feature == CPUFeature::PREFETCHWT1)
return "prefetchwt1"sv;
if (feature == CPUFeature::AVX512_VBMI)
return "avx512_vbmi"sv;
if (feature == CPUFeature::UMIP)
return "umip"sv;
if (feature == CPUFeature::PKU)
return "pku"sv;
if (feature == CPUFeature::OSPKU)
return "ospku"sv;
if (feature == CPUFeature::WAITPKG)
return "waitpkg"sv;
if (feature == CPUFeature::AVX512_VBMI2)
return "avx512_vbmi2"sv;
if (feature == CPUFeature::CET_SS)
return "cet_ss"sv;
if (feature == CPUFeature::GFNI)
return "gfni"sv;
if (feature == CPUFeature::VAES)
return "vaes"sv;
if (feature == CPUFeature::VPCLMULQDQ)
return "vpclmulqdq"sv;
if (feature == CPUFeature::AVX512_VNNI)
return "avx512_vnni"sv;
if (feature == CPUFeature::AVX512_BITALG)
return "avx512_bitalg"sv;
if (feature == CPUFeature::TME_EN)
return "tme_en"sv;
if (feature == CPUFeature::AVX512_VPOPCNTDQ)
return "avx512_vpopcntdq"sv;
if (feature == CPUFeature::INTEL_5_LEVEL_PAGING)
return "intel_5_level_paging"sv;
if (feature == CPUFeature::RDPID)
return "rdpid"sv;
if (feature == CPUFeature::KL)
return "kl"sv;
if (feature == CPUFeature::CLDEMOTE)
return "cldemote"sv;
if (feature == CPUFeature::MOVDIRI)
return "movdiri"sv;
if (feature == CPUFeature::MOVDIR64B)
return "movdir64b"sv;
if (feature == CPUFeature::ENQCMD)
return "enqcmd"sv;
if (feature == CPUFeature::SGX_LC)
return "sgx_lc"sv;
if (feature == CPUFeature::PKS)
return "pks"sv;
if (feature == CPUFeature::AVX512_4VNNIW)
return "avx512_4vnniw"sv;
if (feature == CPUFeature::AVX512_4FMAPS)
return "avx512_4fmaps"sv;
if (feature == CPUFeature::FSRM)
return "fsrm"sv;
if (feature == CPUFeature::AVX512_VP2INTERSECT)
return "avx512_vp2intersect"sv;
if (feature == CPUFeature::SRBDS_CTRL)
return "srbds_ctrl"sv;
if (feature == CPUFeature::MD_CLEAR)
return "md_clear"sv;
if (feature == CPUFeature::RTM_ALWAYS_ABORT)
return "rtm_always_abort"sv;
if (feature == CPUFeature::TSX_FORCE_ABORT)
return "tsx_force_abort"sv;
if (feature == CPUFeature::SERIALIZE)
return "serialize"sv;
if (feature == CPUFeature::HYBRID)
return "hybrid"sv;
if (feature == CPUFeature::TSXLDTRK)
return "tsxldtrk"sv;
if (feature == CPUFeature::PCONFIG)
return "pconfig"sv;
if (feature == CPUFeature::LBR)
return "lbr"sv;
if (feature == CPUFeature::CET_IBT)
return "cet_ibt"sv;
if (feature == CPUFeature::AMX_BF16)
return "amx_bf16"sv;
if (feature == CPUFeature::AVX512_FP16)
return "avx512_fp16"sv;
if (feature == CPUFeature::AMX_TILE)
return "amx_tile"sv;
if (feature == CPUFeature::AMX_INT8)
return "amx_int8"sv;
if (feature == CPUFeature::SPEC_CTRL)
return "spec_ctrl"sv;
if (feature == CPUFeature::STIBP)
return "stibp"sv;
// NOTE: This is called flush_l1d on Linux, but L1D_FLUSH in the Intel manual.
if (feature == CPUFeature::L1D_FLUSH)
return "l1d_flush"sv;
if (feature == CPUFeature::IA32_ARCH_CAPABILITIES)
return "ia32_arch_capabilities"sv;
if (feature == CPUFeature::IA32_CORE_CAPABILITIES)
return "ia32_code_capabilities"sv;
if (feature == CPUFeature::SSBD)
return "ssbd"sv;
if (feature == CPUFeature::SYSCALL)
return "syscall"sv;
if (feature == CPUFeature::NX)

View file

@ -212,14 +212,169 @@ UNMAP_AFTER_INIT void Processor::cpu_detect()
m_features |= CPUFeature::PBE;
CPUID extended_features(0x7);
if (extended_features.ebx() & (1 << 0))
m_features |= CPUFeature::FSGSBASE;
if (extended_features.ebx() & (1 << 1))
m_features |= CPUFeature::TSC_ADJUST;
if (extended_features.ebx() & (1 << 2))
m_features |= CPUFeature::SGX;
if (extended_features.ebx() & (1 << 3))
m_features |= CPUFeature::BMI1;
if (extended_features.ebx() & (1 << 4))
m_features |= CPUFeature::HLE;
if (extended_features.ebx() & (1 << 5))
m_features |= CPUFeature::AVX2;
if (extended_features.ebx() & (1 << 6))
m_features |= CPUFeature::FDP_EXCPTN_ONLY;
if (extended_features.ebx() & (1 << 7))
m_features |= CPUFeature::SMEP;
if (extended_features.ebx() & (1 << 8))
m_features |= CPUFeature::BMI2;
if (extended_features.ebx() & (1 << 9))
m_features |= CPUFeature::ERMS;
if (extended_features.ebx() & (1 << 10))
m_features |= CPUFeature::INVPCID;
if (extended_features.ebx() & (1 << 11))
m_features |= CPUFeature::RTM;
if (extended_features.ebx() & (1 << 12))
m_features |= CPUFeature::PQM;
if (extended_features.ebx() & (1 << 13))
m_features |= CPUFeature::ZERO_FCS_FDS;
if (extended_features.ebx() & (1 << 14))
m_features |= CPUFeature::MPX;
if (extended_features.ebx() & (1 << 15))
m_features |= CPUFeature::PQE;
if (extended_features.ebx() & (1 << 16))
m_features |= CPUFeature::AVX512_F;
if (extended_features.ebx() & (1 << 17))
m_features |= CPUFeature::AVX512_DQ;
if (extended_features.ebx() & (1 << 18))
m_features |= CPUFeature::RDSEED;
if (extended_features.ebx() & (1 << 19))
m_features |= CPUFeature::ADX;
if (extended_features.ebx() & (1 << 20))
m_features |= CPUFeature::SMAP;
if (extended_features.ebx() & (1 << 21))
m_features |= CPUFeature::AVX512_IFMA;
if (extended_features.ebx() & (1 << 22))
m_features |= CPUFeature::PCOMMIT;
if (extended_features.ebx() & (1 << 23))
m_features |= CPUFeature::CLFLUSHOPT;
if (extended_features.ebx() & (1 << 24))
m_features |= CPUFeature::CLWB;
if (extended_features.ebx() & (1 << 25))
m_features |= CPUFeature::INTEL_PT;
if (extended_features.ebx() & (1 << 26))
m_features |= CPUFeature::AVX512_PF;
if (extended_features.ebx() & (1 << 27))
m_features |= CPUFeature::AVX512_ER;
if (extended_features.ebx() & (1 << 28))
m_features |= CPUFeature::AVX512_CD;
if (extended_features.ebx() & (1 << 29))
m_features |= CPUFeature::SHA;
if (extended_features.ebx() & (1 << 30))
m_features |= CPUFeature::AVX512_BW;
if (extended_features.ebx() & (1 << 31))
m_features |= CPUFeature::AVX512_VL;
if (extended_features.ecx() & (1 << 0))
m_features |= CPUFeature::PREFETCHWT1;
if (extended_features.ecx() & (1 << 1))
m_features |= CPUFeature::AVX512_VBMI;
if (extended_features.ecx() & (1 << 2))
m_features |= CPUFeature::UMIP;
if (extended_features.ecx() & (1 << 3))
m_features |= CPUFeature::PKU;
if (extended_features.ecx() & (1 << 4))
m_features |= CPUFeature::OSPKU;
if (extended_features.ecx() & (1 << 5))
m_features |= CPUFeature::WAITPKG;
if (extended_features.ecx() & (1 << 6))
m_features |= CPUFeature::AVX512_VBMI2;
if (extended_features.ecx() & (1 << 7))
m_features |= CPUFeature::CET_SS;
if (extended_features.ecx() & (1 << 8))
m_features |= CPUFeature::GFNI;
if (extended_features.ecx() & (1 << 9))
m_features |= CPUFeature::VAES;
if (extended_features.ecx() & (1 << 10))
m_features |= CPUFeature::VPCLMULQDQ;
if (extended_features.ecx() & (1 << 11))
m_features |= CPUFeature::AVX512_VNNI;
if (extended_features.ecx() & (1 << 12))
m_features |= CPUFeature::AVX512_BITALG;
if (extended_features.ecx() & (1 << 13))
m_features |= CPUFeature::TME_EN;
if (extended_features.ecx() & (1 << 14))
m_features |= CPUFeature::AVX512_VPOPCNTDQ;
if (extended_features.ecx() & (1 << 16))
m_features |= CPUFeature::INTEL_5_LEVEL_PAGING;
if (extended_features.ecx() & (1 << 22))
m_features |= CPUFeature::RDPID;
if (extended_features.ecx() & (1 << 23))
m_features |= CPUFeature::KL;
if (extended_features.ecx() & (1 << 25))
m_features |= CPUFeature::CLDEMOTE;
if (extended_features.ecx() & (1 << 27))
m_features |= CPUFeature::MOVDIRI;
if (extended_features.ecx() & (1 << 28))
m_features |= CPUFeature::MOVDIR64B;
if (extended_features.ecx() & (1 << 29))
m_features |= CPUFeature::ENQCMD;
if (extended_features.ecx() & (1 << 30))
m_features |= CPUFeature::SGX_LC;
if (extended_features.ecx() & (1 << 31))
m_features |= CPUFeature::PKS;
if (extended_features.edx() & (1 << 2))
m_features |= CPUFeature::AVX512_4VNNIW;
if (extended_features.edx() & (1 << 3))
m_features |= CPUFeature::AVX512_4FMAPS;
if (extended_features.edx() & (1 << 4))
m_features |= CPUFeature::FSRM;
if (extended_features.edx() & (1 << 8))
m_features |= CPUFeature::AVX512_VP2INTERSECT;
if (extended_features.edx() & (1 << 9))
m_features |= CPUFeature::SRBDS_CTRL;
if (extended_features.edx() & (1 << 10))
m_features |= CPUFeature::MD_CLEAR;
if (extended_features.edx() & (1 << 11))
m_features |= CPUFeature::RTM_ALWAYS_ABORT;
if (extended_features.edx() & (1 << 13))
m_features |= CPUFeature::TSX_FORCE_ABORT;
if (extended_features.edx() & (1 << 14))
m_features |= CPUFeature::SERIALIZE;
if (extended_features.edx() & (1 << 15))
m_features |= CPUFeature::HYBRID;
if (extended_features.edx() & (1 << 16))
m_features |= CPUFeature::TSXLDTRK;
if (extended_features.edx() & (1 << 18))
m_features |= CPUFeature::PCONFIG;
if (extended_features.edx() & (1 << 19))
m_features |= CPUFeature::LBR;
if (extended_features.edx() & (1 << 20))
m_features |= CPUFeature::CET_IBT;
if (extended_features.edx() & (1 << 22))
m_features |= CPUFeature::AMX_BF16;
if (extended_features.edx() & (1 << 23))
m_features |= CPUFeature::AVX512_FP16;
if (extended_features.edx() & (1 << 24))
m_features |= CPUFeature::AMX_TILE;
if (extended_features.edx() & (1 << 25))
m_features |= CPUFeature::AMX_INT8;
if (extended_features.edx() & (1 << 26))
m_features |= CPUFeature::SPEC_CTRL;
if (extended_features.edx() & (1 << 27))
m_features |= CPUFeature::STIBP;
if (extended_features.edx() & (1 << 28))
m_features |= CPUFeature::L1D_FLUSH;
if (extended_features.edx() & (1 << 29))
m_features |= CPUFeature::IA32_ARCH_CAPABILITIES;
if (extended_features.edx() & (1 << 30))
m_features |= CPUFeature::IA32_CORE_CAPABILITIES;
if (extended_features.edx() & (1 << 31))
m_features |= CPUFeature::SSBD;
u32 max_extended_leaf = CPUID(0x80000000).eax();