CPUID.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. /*
  2. * Copyright (c) 2022, Linus Groh <linusg@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <Kernel/Arch/x86/CPUID.h>
  7. namespace Kernel {
  8. StringView cpu_feature_to_string_view(CPUFeature::Type const& feature)
  9. {
  10. if (feature == CPUFeature::SSE3)
  11. return "sse3"sv;
  12. if (feature == CPUFeature::PCLMULQDQ)
  13. return "pclmulqdq"sv;
  14. if (feature == CPUFeature::DTES64)
  15. return "dtes64"sv;
  16. if (feature == CPUFeature::MONITOR)
  17. return "monitor"sv;
  18. if (feature == CPUFeature::DS_CPL)
  19. return "ds_cpl"sv;
  20. if (feature == CPUFeature::VMX)
  21. return "vmx"sv;
  22. if (feature == CPUFeature::SMX)
  23. return "smx"sv;
  24. if (feature == CPUFeature::EST)
  25. return "est"sv;
  26. if (feature == CPUFeature::TM2)
  27. return "tm2"sv;
  28. if (feature == CPUFeature::SSSE3)
  29. return "ssse3"sv;
  30. // NOTE: This is called cid on Linux, but CNXT_ID in the Intel manual.
  31. if (feature == CPUFeature::CNXT_ID)
  32. return "cnxt_id"sv;
  33. if (feature == CPUFeature::SDBG)
  34. return "sdbg"sv;
  35. if (feature == CPUFeature::FMA)
  36. return "fma"sv;
  37. if (feature == CPUFeature::CX16)
  38. return "cx16"sv;
  39. if (feature == CPUFeature::XTPR)
  40. return "xtpr"sv;
  41. if (feature == CPUFeature::PDCM)
  42. return "pdcm"sv;
  43. if (feature == CPUFeature::PCID)
  44. return "pcid"sv;
  45. if (feature == CPUFeature::DCA)
  46. return "dca"sv;
  47. if (feature == CPUFeature::SSE4_1)
  48. return "sse4_1"sv;
  49. if (feature == CPUFeature::SSE4_2)
  50. return "sse4_2"sv;
  51. if (feature == CPUFeature::X2APIC)
  52. return "x2apic"sv;
  53. if (feature == CPUFeature::MOVBE)
  54. return "movbe"sv;
  55. if (feature == CPUFeature::POPCNT)
  56. return "popcnt"sv;
  57. // NOTE: This is called tsc_deadline_timer on Linux, but TSC_DEADLINE in the Intel manual.
  58. if (feature == CPUFeature::TSC_DEADLINE)
  59. return "tsc_deadline"sv;
  60. if (feature == CPUFeature::AES)
  61. return "aes"sv;
  62. if (feature == CPUFeature::XSAVE)
  63. return "xsave"sv;
  64. if (feature == CPUFeature::OSXSAVE)
  65. return "osxsave"sv;
  66. if (feature == CPUFeature::AVX)
  67. return "avx"sv;
  68. if (feature == CPUFeature::F16C)
  69. return "f16c"sv;
  70. if (feature == CPUFeature::RDRAND)
  71. return "rdrand"sv;
  72. if (feature == CPUFeature::HYPERVISOR)
  73. return "hypervisor"sv;
  74. if (feature == CPUFeature::FPU)
  75. return "fpu"sv;
  76. if (feature == CPUFeature::VME)
  77. return "vme"sv;
  78. if (feature == CPUFeature::DE)
  79. return "de"sv;
  80. if (feature == CPUFeature::PSE)
  81. return "pse"sv;
  82. if (feature == CPUFeature::TSC)
  83. return "tsc"sv;
  84. if (feature == CPUFeature::MSR)
  85. return "msr"sv;
  86. if (feature == CPUFeature::PAE)
  87. return "pae"sv;
  88. if (feature == CPUFeature::MCE)
  89. return "mce"sv;
  90. if (feature == CPUFeature::CX8)
  91. return "cx8"sv;
  92. if (feature == CPUFeature::APIC)
  93. return "apic"sv;
  94. if (feature == CPUFeature::SEP)
  95. return "sep"sv;
  96. if (feature == CPUFeature::MTRR)
  97. return "mtrr"sv;
  98. if (feature == CPUFeature::PGE)
  99. return "pge"sv;
  100. if (feature == CPUFeature::MCA)
  101. return "mca"sv;
  102. if (feature == CPUFeature::CMOV)
  103. return "cmov"sv;
  104. if (feature == CPUFeature::PAT)
  105. return "pat"sv;
  106. if (feature == CPUFeature::PSE36)
  107. return "pse36"sv;
  108. if (feature == CPUFeature::PSN)
  109. return "psn"sv;
  110. if (feature == CPUFeature::CLFLUSH)
  111. return "clflush"sv;
  112. if (feature == CPUFeature::DS)
  113. return "ds"sv;
  114. if (feature == CPUFeature::ACPI)
  115. return "acpi"sv;
  116. if (feature == CPUFeature::MMX)
  117. return "mmx"sv;
  118. if (feature == CPUFeature::FXSR)
  119. return "fxsr"sv;
  120. if (feature == CPUFeature::SSE)
  121. return "sse"sv;
  122. if (feature == CPUFeature::SSE2)
  123. return "sse2"sv;
  124. if (feature == CPUFeature::SS)
  125. return "ss"sv;
  126. if (feature == CPUFeature::HTT)
  127. return "htt"sv;
  128. if (feature == CPUFeature::TM)
  129. return "tm"sv;
  130. if (feature == CPUFeature::IA64)
  131. return "ia64"sv;
  132. if (feature == CPUFeature::PBE)
  133. return "pbe"sv;
  134. if (feature == CPUFeature::FSGSBASE)
  135. return "fsgsbase"sv;
  136. if (feature == CPUFeature::TSC_ADJUST)
  137. return "tsc_adjust"sv;
  138. if (feature == CPUFeature::SGX)
  139. return "sgx"sv;
  140. if (feature == CPUFeature::BMI1)
  141. return "bmi1"sv;
  142. if (feature == CPUFeature::HLE)
  143. return "hle"sv;
  144. if (feature == CPUFeature::AVX2)
  145. return "avx2"sv;
  146. if (feature == CPUFeature::FDP_EXCPTN_ONLY)
  147. return "fdp_excptn_only"sv;
  148. if (feature == CPUFeature::SMEP)
  149. return "smep"sv;
  150. if (feature == CPUFeature::BMI2)
  151. return "bmi2"sv;
  152. if (feature == CPUFeature::ERMS)
  153. return "erms"sv;
  154. if (feature == CPUFeature::INVPCID)
  155. return "invpcid"sv;
  156. if (feature == CPUFeature::RTM)
  157. return "rtm"sv;
  158. if (feature == CPUFeature::PQM)
  159. return "pqm"sv;
  160. if (feature == CPUFeature::ZERO_FCS_FDS)
  161. return "zero_fcs_fds"sv;
  162. if (feature == CPUFeature::MPX)
  163. return "mpx"sv;
  164. if (feature == CPUFeature::PQE)
  165. return "pqe"sv;
  166. if (feature == CPUFeature::AVX512_F)
  167. return "avx512_f"sv;
  168. if (feature == CPUFeature::AVX512_DQ)
  169. return "avx512_dq"sv;
  170. if (feature == CPUFeature::RDSEED)
  171. return "rdseed"sv;
  172. if (feature == CPUFeature::ADX)
  173. return "adx"sv;
  174. if (feature == CPUFeature::SMAP)
  175. return "smap"sv;
  176. if (feature == CPUFeature::AVX512_IFMA)
  177. return "avx512_ifma"sv;
  178. if (feature == CPUFeature::PCOMMIT)
  179. return "pcommit"sv;
  180. if (feature == CPUFeature::CLFLUSHOPT)
  181. return "clflushopt"sv;
  182. if (feature == CPUFeature::CLWB)
  183. return "clwb"sv;
  184. if (feature == CPUFeature::INTEL_PT)
  185. return "intel_pt"sv;
  186. if (feature == CPUFeature::AVX512_PF)
  187. return "avx512_pf"sv;
  188. if (feature == CPUFeature::AVX512_ER)
  189. return "avx512_er"sv;
  190. if (feature == CPUFeature::AVX512_CD)
  191. return "avx512_cd"sv;
  192. if (feature == CPUFeature::SHA)
  193. return "sha"sv;
  194. if (feature == CPUFeature::AVX512_BW)
  195. return "avx512_bw"sv;
  196. if (feature == CPUFeature::AVX512_VL)
  197. return "avx512_vl"sv;
  198. if (feature == CPUFeature::PREFETCHWT1)
  199. return "prefetchwt1"sv;
  200. if (feature == CPUFeature::AVX512_VBMI)
  201. return "avx512_vbmi"sv;
  202. if (feature == CPUFeature::UMIP)
  203. return "umip"sv;
  204. if (feature == CPUFeature::PKU)
  205. return "pku"sv;
  206. if (feature == CPUFeature::OSPKU)
  207. return "ospku"sv;
  208. if (feature == CPUFeature::WAITPKG)
  209. return "waitpkg"sv;
  210. if (feature == CPUFeature::AVX512_VBMI2)
  211. return "avx512_vbmi2"sv;
  212. if (feature == CPUFeature::CET_SS)
  213. return "cet_ss"sv;
  214. if (feature == CPUFeature::GFNI)
  215. return "gfni"sv;
  216. if (feature == CPUFeature::VAES)
  217. return "vaes"sv;
  218. if (feature == CPUFeature::VPCLMULQDQ)
  219. return "vpclmulqdq"sv;
  220. if (feature == CPUFeature::AVX512_VNNI)
  221. return "avx512_vnni"sv;
  222. if (feature == CPUFeature::AVX512_BITALG)
  223. return "avx512_bitalg"sv;
  224. if (feature == CPUFeature::TME_EN)
  225. return "tme_en"sv;
  226. if (feature == CPUFeature::AVX512_VPOPCNTDQ)
  227. return "avx512_vpopcntdq"sv;
  228. if (feature == CPUFeature::INTEL_5_LEVEL_PAGING)
  229. return "intel_5_level_paging"sv;
  230. if (feature == CPUFeature::RDPID)
  231. return "rdpid"sv;
  232. if (feature == CPUFeature::KL)
  233. return "kl"sv;
  234. if (feature == CPUFeature::CLDEMOTE)
  235. return "cldemote"sv;
  236. if (feature == CPUFeature::MOVDIRI)
  237. return "movdiri"sv;
  238. if (feature == CPUFeature::MOVDIR64B)
  239. return "movdir64b"sv;
  240. if (feature == CPUFeature::ENQCMD)
  241. return "enqcmd"sv;
  242. if (feature == CPUFeature::SGX_LC)
  243. return "sgx_lc"sv;
  244. if (feature == CPUFeature::PKS)
  245. return "pks"sv;
  246. if (feature == CPUFeature::AVX512_4VNNIW)
  247. return "avx512_4vnniw"sv;
  248. if (feature == CPUFeature::AVX512_4FMAPS)
  249. return "avx512_4fmaps"sv;
  250. if (feature == CPUFeature::FSRM)
  251. return "fsrm"sv;
  252. if (feature == CPUFeature::AVX512_VP2INTERSECT)
  253. return "avx512_vp2intersect"sv;
  254. if (feature == CPUFeature::SRBDS_CTRL)
  255. return "srbds_ctrl"sv;
  256. if (feature == CPUFeature::MD_CLEAR)
  257. return "md_clear"sv;
  258. if (feature == CPUFeature::RTM_ALWAYS_ABORT)
  259. return "rtm_always_abort"sv;
  260. if (feature == CPUFeature::TSX_FORCE_ABORT)
  261. return "tsx_force_abort"sv;
  262. if (feature == CPUFeature::SERIALIZE)
  263. return "serialize"sv;
  264. if (feature == CPUFeature::HYBRID)
  265. return "hybrid"sv;
  266. if (feature == CPUFeature::TSXLDTRK)
  267. return "tsxldtrk"sv;
  268. if (feature == CPUFeature::PCONFIG)
  269. return "pconfig"sv;
  270. if (feature == CPUFeature::LBR)
  271. return "lbr"sv;
  272. if (feature == CPUFeature::CET_IBT)
  273. return "cet_ibt"sv;
  274. if (feature == CPUFeature::AMX_BF16)
  275. return "amx_bf16"sv;
  276. if (feature == CPUFeature::AVX512_FP16)
  277. return "avx512_fp16"sv;
  278. if (feature == CPUFeature::AMX_TILE)
  279. return "amx_tile"sv;
  280. if (feature == CPUFeature::AMX_INT8)
  281. return "amx_int8"sv;
  282. if (feature == CPUFeature::SPEC_CTRL)
  283. return "spec_ctrl"sv;
  284. if (feature == CPUFeature::STIBP)
  285. return "stibp"sv;
  286. // NOTE: This is called flush_l1d on Linux, but L1D_FLUSH in the Intel manual.
  287. if (feature == CPUFeature::L1D_FLUSH)
  288. return "l1d_flush"sv;
  289. if (feature == CPUFeature::IA32_ARCH_CAPABILITIES)
  290. return "ia32_arch_capabilities"sv;
  291. if (feature == CPUFeature::IA32_CORE_CAPABILITIES)
  292. return "ia32_code_capabilities"sv;
  293. if (feature == CPUFeature::SSBD)
  294. return "ssbd"sv;
  295. if (feature == CPUFeature::SYSCALL)
  296. return "syscall"sv;
  297. if (feature == CPUFeature::NX)
  298. return "nx"sv;
  299. if (feature == CPUFeature::RDTSCP)
  300. return "rdtscp"sv;
  301. if (feature == CPUFeature::LM)
  302. return "lm"sv;
  303. if (feature == CPUFeature::CONSTANT_TSC)
  304. return "constant_tsc"sv;
  305. if (feature == CPUFeature::NONSTOP_TSC)
  306. return "nonstop_tsc"sv;
  307. VERIFY_NOT_REACHED();
  308. }
  309. }