mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 16:57:35 +00:00
Kernel: Support all Intel-defined CPUID feature flags for EAX=1
We're now able to detect all the regular CPUID feature flags from ECX/EDX for EAX=1 :^) None of the new ones are being used for anything yet, but they will show up in /proc/cpuinfo and subsequently lscpu and SystemMonitor. Note that I replaced the periods from the SSE 4.1 and 4.2 instructions with underscores, which matches the internal enum names, Linux's /proc/cpuinfo and the general pattern of replacing special characters with underscores to limit feature names to [a-z0-9_]. The enum member stringification has been moved to a new function for better re-usability and to avoid cluttering up Processor.cpp.
This commit is contained in:
parent
bc7ec02a82
commit
6ca03b915e
5 changed files with 337 additions and 91 deletions
160
Kernel/Arch/x86/common/CPUID.cpp
Normal file
160
Kernel/Arch/x86/common/CPUID.cpp
Normal file
|
@ -0,0 +1,160 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Linus Groh <linusg@serenityos.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#include <Kernel/Arch/x86/CPUID.h>
|
||||
|
||||
namespace Kernel {
|
||||
|
||||
StringView cpu_feature_to_string_view(CPUFeature::Type const& feature)
|
||||
{
|
||||
if (feature == CPUFeature::SSE3)
|
||||
return "sse3"sv;
|
||||
if (feature == CPUFeature::PCLMULQDQ)
|
||||
return "pclmulqdq"sv;
|
||||
if (feature == CPUFeature::DTES64)
|
||||
return "dtes64"sv;
|
||||
if (feature == CPUFeature::MONITOR)
|
||||
return "monitor"sv;
|
||||
if (feature == CPUFeature::DS_CPL)
|
||||
return "ds_cpl"sv;
|
||||
if (feature == CPUFeature::VMX)
|
||||
return "vmx"sv;
|
||||
if (feature == CPUFeature::SMX)
|
||||
return "smx"sv;
|
||||
if (feature == CPUFeature::EST)
|
||||
return "est"sv;
|
||||
if (feature == CPUFeature::TM2)
|
||||
return "tm2"sv;
|
||||
if (feature == CPUFeature::SSSE3)
|
||||
return "ssse3"sv;
|
||||
// NOTE: This is called cid on Linux, but CNXT_ID in the Intel manual.
|
||||
if (feature == CPUFeature::CNXT_ID)
|
||||
return "cnxt_id"sv;
|
||||
if (feature == CPUFeature::SDBG)
|
||||
return "sdbg"sv;
|
||||
if (feature == CPUFeature::FMA)
|
||||
return "fma"sv;
|
||||
if (feature == CPUFeature::CX16)
|
||||
return "cx16"sv;
|
||||
if (feature == CPUFeature::XTPR)
|
||||
return "xtpr"sv;
|
||||
if (feature == CPUFeature::PDCM)
|
||||
return "pdcm"sv;
|
||||
if (feature == CPUFeature::PCID)
|
||||
return "pcid"sv;
|
||||
if (feature == CPUFeature::DCA)
|
||||
return "dca"sv;
|
||||
if (feature == CPUFeature::SSE4_1)
|
||||
return "sse4_1"sv;
|
||||
if (feature == CPUFeature::SSE4_2)
|
||||
return "sse4_2"sv;
|
||||
if (feature == CPUFeature::X2APIC)
|
||||
return "x2apic"sv;
|
||||
if (feature == CPUFeature::MOVBE)
|
||||
return "movbe"sv;
|
||||
if (feature == CPUFeature::POPCNT)
|
||||
return "popcnt"sv;
|
||||
// NOTE: This is called tsc_deadline_timer on Linux, but TSC_DEADLINE in the Intel manual.
|
||||
if (feature == CPUFeature::TSC_DEADLINE)
|
||||
return "tsc_deadline"sv;
|
||||
if (feature == CPUFeature::AES)
|
||||
return "aes"sv;
|
||||
if (feature == CPUFeature::XSAVE)
|
||||
return "xsave"sv;
|
||||
if (feature == CPUFeature::OSXSAVE)
|
||||
return "osxsave"sv;
|
||||
if (feature == CPUFeature::AVX)
|
||||
return "avx"sv;
|
||||
if (feature == CPUFeature::F16C)
|
||||
return "f16c"sv;
|
||||
if (feature == CPUFeature::RDRAND)
|
||||
return "rdrand"sv;
|
||||
if (feature == CPUFeature::HYPERVISOR)
|
||||
return "hypervisor"sv;
|
||||
if (feature == CPUFeature::FPU)
|
||||
return "fpu"sv;
|
||||
if (feature == CPUFeature::VME)
|
||||
return "vme"sv;
|
||||
if (feature == CPUFeature::DE)
|
||||
return "de"sv;
|
||||
if (feature == CPUFeature::PSE)
|
||||
return "pse"sv;
|
||||
if (feature == CPUFeature::TSC)
|
||||
return "tsc"sv;
|
||||
if (feature == CPUFeature::MSR)
|
||||
return "msr"sv;
|
||||
if (feature == CPUFeature::PAE)
|
||||
return "pae"sv;
|
||||
if (feature == CPUFeature::MCE)
|
||||
return "mce"sv;
|
||||
if (feature == CPUFeature::CX8)
|
||||
return "cx8"sv;
|
||||
if (feature == CPUFeature::APIC)
|
||||
return "apic"sv;
|
||||
if (feature == CPUFeature::SEP)
|
||||
return "sep"sv;
|
||||
if (feature == CPUFeature::MTRR)
|
||||
return "mtrr"sv;
|
||||
if (feature == CPUFeature::PGE)
|
||||
return "pge"sv;
|
||||
if (feature == CPUFeature::MCA)
|
||||
return "mca"sv;
|
||||
if (feature == CPUFeature::CMOV)
|
||||
return "cmov"sv;
|
||||
if (feature == CPUFeature::PAT)
|
||||
return "pat"sv;
|
||||
if (feature == CPUFeature::PSE36)
|
||||
return "pse36"sv;
|
||||
if (feature == CPUFeature::PSN)
|
||||
return "psn"sv;
|
||||
if (feature == CPUFeature::CLFLUSH)
|
||||
return "clflush"sv;
|
||||
if (feature == CPUFeature::DS)
|
||||
return "ds"sv;
|
||||
if (feature == CPUFeature::ACPI)
|
||||
return "acpi"sv;
|
||||
if (feature == CPUFeature::MMX)
|
||||
return "mmx"sv;
|
||||
if (feature == CPUFeature::FXSR)
|
||||
return "fxsr"sv;
|
||||
if (feature == CPUFeature::SSE)
|
||||
return "sse"sv;
|
||||
if (feature == CPUFeature::SSE2)
|
||||
return "sse2"sv;
|
||||
if (feature == CPUFeature::SS)
|
||||
return "ss"sv;
|
||||
if (feature == CPUFeature::HTT)
|
||||
return "htt"sv;
|
||||
if (feature == CPUFeature::TM)
|
||||
return "tm"sv;
|
||||
if (feature == CPUFeature::IA64)
|
||||
return "ia64"sv;
|
||||
if (feature == CPUFeature::PBE)
|
||||
return "pbe"sv;
|
||||
if (feature == CPUFeature::SMEP)
|
||||
return "smep"sv;
|
||||
if (feature == CPUFeature::RDSEED)
|
||||
return "rdseed"sv;
|
||||
if (feature == CPUFeature::SMAP)
|
||||
return "smap"sv;
|
||||
if (feature == CPUFeature::UMIP)
|
||||
return "umip"sv;
|
||||
if (feature == CPUFeature::SYSCALL)
|
||||
return "syscall"sv;
|
||||
if (feature == CPUFeature::NX)
|
||||
return "nx"sv;
|
||||
if (feature == CPUFeature::RDTSCP)
|
||||
return "rdtscp"sv;
|
||||
if (feature == CPUFeature::LM)
|
||||
return "lm"sv;
|
||||
if (feature == CPUFeature::CONSTANT_TSC)
|
||||
return "constant_tsc"sv;
|
||||
if (feature == CPUFeature::NONSTOP_TSC)
|
||||
return "nonstop_tsc"sv;
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue