PatchworkOS  19e446b
A non-POSIX operating system.
Loading...
Searching...
No Matches
cpuid.h
Go to the documentation of this file.
1#ifndef _SYS_CPUID_H
2#define _SYS_CPUID_H 1
3
4#include <stdbool.h>
5#include <stdint.h>
6#include <sys/defs.h>
7
8/**
9 * @brief CPU feature detection
10 * @ingroup libstd
11 * @defgroup libstd_sys_cpuid CPUID
12 *
13 * The `sys/cpuid.h` header provides functions for detecting CPU features using the CPUID instruction.
14 *
15 * @see [CPUID Instruction](https://www.felixcloutier.com/x86/cpuid)
16 *
17 * @{
18 */
19
20/**
21 * @brief Input EAX values.
22 * @enum cpuid_input_eax_t
23 */
30
31/**
32 * @brief Input ECX values.
33 * @enum cpuid_input_ecx_t
34 */
35typedef enum
36{
39
40/**
41 * @brief ECX feature flags.
42 * @enum cpuid_ecx_features_t
43 *
44 * These flags are returned in the ECX register after calling the CPUID instruction with EAX=CPUID_EAX_FEATURE_INFO.
45 */
79
80/**
81 * @brief EBX feature flags.
82 * @enum cpuid_ebx_features_t
83 *
84 * These flags are returned in the EBX register after calling the CPUID instruction with EAX=CPUID_FEATURE_EXTENDED_ID.
85 */
86typedef enum
87{
88 CPUID_EDX_FPU = 1 << 0,
89 CPUID_EDX_VME = 1 << 1,
90 CPUID_EDX_DE = 1 << 2,
91 CPUID_EDX_PSE = 1 << 3,
92 CPUID_EDX_TSC = 1 << 4,
93 CPUID_EDX_MSR = 1 << 5,
94 CPUID_EDX_PAE = 1 << 6,
95 CPUID_EDX_MCE = 1 << 7,
96 CPUID_EDX_CX8 = 1 << 8,
98 CPUID_EDX_SEP = 1 << 11,
99 CPUID_EDX_MTRR = 1 << 12,
100 CPUID_EDX_PGE = 1 << 13,
101 CPUID_EDX_MCA = 1 << 14,
102 CPUID_EDX_CMOV = 1 << 15,
103 CPUID_EDX_PAT = 1 << 16,
105 CPUID_EDX_PSN = 1 << 18,
108 CPUID_EDX_DS = 1 << 21,
109 CPUID_EDX_ACPI = 1 << 22,
110 CPUID_EDX_MMX = 1 << 23,
111 CPUID_EDX_FXSR = 1 << 24,
112 CPUID_EDX_SSE = 1 << 25,
113 CPUID_EDX_SSE2 = 1 << 26,
114 CPUID_EDX_SS = 1 << 27,
115 CPUID_EDX_HTT = 1 << 28,
116 CPUID_EDX_TM = 1 << 29,
118 CPUID_EDX_PBE = 1 << 31,
120
121/**
122 * @brief EBX feature flags.
123 * @enum cpuid_ebx_features_t
124 *
125 * These flags are returned in the EBX register after calling the CPUID instruction with
126 * EAX=CPUID_EAX_EXTENDED_FEATURE_INFO and ECX=0.
127 */
163
164/**
165 * @brief Output structure for CPUID instruction.
166 * @struct cpuid_output_t
167 */
175
176/**
177 * @brief CPUID instruction.
178 *
179 * @param eax Input EAX value.
180 * @param ecx Input ECX value.
181 * @param out Output structure.
182 */
183static inline void cpuid(cpuid_input_eax_t eax, cpuid_input_ecx_t ecx, cpuid_output_t* out)
184{
185 ASM("cpuid" : "=a"(out->eax), "=b"(out->ebx), "=c"(out->ecx), "=d"(out->edx) : "a"(eax), "c"(ecx));
186}
187
188/**
189 * @brief CPU feature information structure.
190 * @struct cpuid_feature_info_t
191 */
199
200/**
201 * @brief Wrapper to get CPU feature information.
202 *
203 * @param info Output pointer.
204 */
206{
207 cpuid_output_t out;
209 info->version = out.eax;
210 info->brandClflushApicid = out.ebx;
213}
214
215/**
216 * @brief CPU extended feature information structure.
217 * @struct cpuid_extended_feature_info_t
218 */
223
224/**
225 * @brief Wrapper to get CPU extended feature information.
226 *
227 * @param info Output pointer.
228 */
235
236/**
237 * @brief Supported CPU instruction sets.
238 * @enum cpuid_instruction_sets_t
239 */
253
254/**
255 * @brief Helper to detect supported instruction sets.
256 *
257 * @return A bitmask of supported instruction sets.
258 */
260{
262 cpuid_feature_info_t featureInfo;
263 cpuid_feature_info(&featureInfo);
264 if (featureInfo.featuresEdx & CPUID_EDX_SSE)
265 {
267 }
268 if (featureInfo.featuresEdx & CPUID_EDX_SSE2)
269 {
271 }
272 if (featureInfo.featuresEcx & CPUID_ECX_SSE3)
273 {
275 }
276 if (featureInfo.featuresEcx & CPUID_ECX_SSSE3)
277 {
279 }
280 if (featureInfo.featuresEcx & CPUID_ECX_SSE4_1)
281 {
283 }
284 if (featureInfo.featuresEcx & CPUID_ECX_SSE4_2)
285 {
287 }
288 if (featureInfo.featuresEcx & CPUID_ECX_AVX)
289 {
291 }
292 cpuid_extended_feature_info_t extFeatureInfo;
293 cpuid_extended_feature_info(&extFeatureInfo);
294 if (extFeatureInfo.featuresEbx & CPUID_EBX_AVX2)
295 {
297 }
298 if (extFeatureInfo.featuresEbx & CPUID_EBX_AVX512F)
299 {
301 }
302 return sets;
303}
304
305/** @} */
306
307#endif // _SYS_CPUID_H
static cpuid_instruction_sets_t cpuid_detect_instruction_sets(void)
Helper to detect supported instruction sets.
Definition cpuid.h:259
static void cpuid(cpuid_input_eax_t eax, cpuid_input_ecx_t ecx, cpuid_output_t *out)
CPUID instruction.
Definition cpuid.h:183
cpuid_ecx_features_t
ECX feature flags.
Definition cpuid.h:47
static void cpuid_feature_info(cpuid_feature_info_t *info)
Wrapper to get CPU feature information.
Definition cpuid.h:205
cpuid_instruction_sets_t
Supported CPU instruction sets.
Definition cpuid.h:241
static void cpuid_extended_feature_info(cpuid_extended_feature_info_t *info)
Wrapper to get CPU extended feature information.
Definition cpuid.h:229
cpuid_input_ecx_t
Input ECX values.
Definition cpuid.h:36
cpuid_ebx_features_t
EBX feature flags.
Definition cpuid.h:129
cpuid_input_eax_t
Input EAX values.
Definition cpuid.h:25
cpuid_edx_features_t
Definition cpuid.h:87
@ CPUID_ECX_F16C
Definition cpuid.h:76
@ CPUID_ECX_AVX
Definition cpuid.h:75
@ CPUID_ECX_SMX
Definition cpuid.h:54
@ CPUID_ECX_SSE3
Definition cpuid.h:48
@ CPUID_ECX_DS_CPL
Definition cpuid.h:52
@ CPUID_ECX_CNXT_ID
Definition cpuid.h:58
@ CPUID_ECX_SSE4_1
Definition cpuid.h:66
@ CPUID_ECX_CMPXCHG16B
Definition cpuid.h:61
@ CPUID_ECX_MONITOR
Definition cpuid.h:51
@ CPUID_ECX_SSE4_2
Definition cpuid.h:67
@ CPUID_ECX_FMA
Definition cpuid.h:60
@ CPUID_ECX_TM2
Definition cpuid.h:56
@ CPUID_ECX_MOVBE
Definition cpuid.h:69
@ CPUID_ECX_XSAVE
Definition cpuid.h:73
@ CPUID_ECX_XTPR_UPDATE_CONTROL
Definition cpuid.h:62
@ CPUID_ECX_DCA
Definition cpuid.h:65
@ CPUID_ECX_PDCM
Definition cpuid.h:63
@ CPUID_ECX_POPCNT
Definition cpuid.h:70
@ CPUID_ECX_AESNI
Definition cpuid.h:72
@ CPUID_ECX_SSSE3
Definition cpuid.h:57
@ CPUID_ECX_PCID
Definition cpuid.h:64
@ CPUID_ECX_RDRAND
Definition cpuid.h:77
@ CPUID_ECX_X2APIC
Definition cpuid.h:68
@ CPUID_ECX_EIST
Definition cpuid.h:55
@ CPUID_ECX_SDBG
Definition cpuid.h:59
@ CPUID_ECX_DTES64
Definition cpuid.h:50
@ CPUID_ECX_PCLMULQDQ
Definition cpuid.h:49
@ CPUID_ECX_VMX
Definition cpuid.h:53
@ CPUID_ECX_TSC_DEADLINE
Definition cpuid.h:71
@ CPUID_ECX_OSXSAVE
Definition cpuid.h:74
@ CPUID_INSTRUCTION_SET_NONE
Definition cpuid.h:242
@ CPUID_INSTRUCTION_SET_SSSE3
Definition cpuid.h:246
@ CPUID_INSTRUCTION_SET_SSE2
Definition cpuid.h:244
@ CPUID_INSTRUCTION_SET_SSE4_2
Definition cpuid.h:248
@ CPUID_INSTRUCTION_SET_SSE3
Definition cpuid.h:245
@ CPUID_INSTRUCTION_SET_AVX512
Definition cpuid.h:251
@ CPUID_INSTRUCTION_SET_AVX
Definition cpuid.h:249
@ CPUID_INSTRUCTION_SET_SSE4_1
Definition cpuid.h:247
@ CPUID_INSTRUCTION_SET_SSE
Definition cpuid.h:243
@ CPUID_INSTRUCTION_SET_AVX2
Definition cpuid.h:250
@ CPUID_ECX_NONE
Definition cpuid.h:37
@ CPUID_EBX_AVX512F
Definition cpuid.h:146
@ CPUID_EBX_FSGSBASE
Definition cpuid.h:130
@ CPUID_EBX_CLFLUSHOPT
Definition cpuid.h:153
@ CPUID_EBX_AVX512VL
Definition cpuid.h:161
@ CPUID_EBX_AVX512DQ
Definition cpuid.h:147
@ CPUID_EBX_AVX512ER
Definition cpuid.h:157
@ CPUID_EBX_AVX512_IFMA
Definition cpuid.h:151
@ CPUID_EBX_FPU_CS_DS_DEPR
Definition cpuid.h:143
@ CPUID_EBX_RDSEED
Definition cpuid.h:148
@ CPUID_EBX_AVX512PF
Definition cpuid.h:156
@ CPUID_EBX_SGX
Definition cpuid.h:132
@ CPUID_EBX_ERMS
Definition cpuid.h:139
@ CPUID_EBX_HLE
Definition cpuid.h:134
@ CPUID_EBX_SMEP
Definition cpuid.h:137
@ CPUID_EBX_TSC_ADJUST
Definition cpuid.h:131
@ CPUID_EBX_AVX2
Definition cpuid.h:135
@ CPUID_EBX_BMI2
Definition cpuid.h:138
@ CPUID_EBX_AVX512CD
Definition cpuid.h:158
@ CPUID_EBX_RDT_A
Definition cpuid.h:145
@ CPUID_EBX_SMAP
Definition cpuid.h:150
@ CPUID_EBX_BMI1
Definition cpuid.h:133
@ CPUID_EBX_RESERVED1
Definition cpuid.h:152
@ CPUID_EBX_INVPCID
Definition cpuid.h:140
@ CPUID_EBX_RDT_M
Definition cpuid.h:142
@ CPUID_EBX_AVX512BW
Definition cpuid.h:160
@ CPUID_EBX_CLWB
Definition cpuid.h:154
@ CPUID_EBX_FDP_EXCPTN_ONLY
Definition cpuid.h:136
@ CPUID_EBX_SHA
Definition cpuid.h:159
@ CPUID_EBX_ADX
Definition cpuid.h:149
@ CPUID_EBX_INTEL_PT
Definition cpuid.h:155
@ CPUID_EBX_RTM
Definition cpuid.h:141
@ CPUID_EBX_MPX
Definition cpuid.h:144
@ CPUID_EAX_FEATURE_INFO
Definition cpuid.h:27
@ CPUID_EAX_NONE
Definition cpuid.h:26
@ CPUID_EAX_EXTENDED_FEATURE_INFO
Definition cpuid.h:28
@ CPUID_EDX_SSE2
Definition cpuid.h:113
@ CPUID_EDX_SS
Definition cpuid.h:114
@ CPUID_EDX_RESERVED2
Definition cpuid.h:117
@ CPUID_EDX_MMX
Definition cpuid.h:110
@ CPUID_EDX_FXSR
Definition cpuid.h:111
@ CPUID_EDX_PSN
Definition cpuid.h:105
@ CPUID_EDX_PAE
Definition cpuid.h:94
@ CPUID_EDX_MTRR
Definition cpuid.h:99
@ CPUID_EDX_PSE36
Definition cpuid.h:104
@ CPUID_EDX_SSE
Definition cpuid.h:112
@ CPUID_EDX_PBE
Definition cpuid.h:118
@ CPUID_EDX_TSC
Definition cpuid.h:92
@ CPUID_EDX_VME
Definition cpuid.h:89
@ CPUID_EDX_APIC
Definition cpuid.h:97
@ CPUID_EDX_DS
Definition cpuid.h:108
@ CPUID_EDX_FPU
Definition cpuid.h:88
@ CPUID_EDX_MSR
Definition cpuid.h:93
@ CPUID_EDX_CX8
Definition cpuid.h:96
@ CPUID_EDX_DE
Definition cpuid.h:90
@ CPUID_EDX_PAT
Definition cpuid.h:103
@ CPUID_EDX_TM
Definition cpuid.h:116
@ CPUID_EDX_MCE
Definition cpuid.h:95
@ CPUID_EDX_PSE
Definition cpuid.h:91
@ CPUID_EDX_CLFSH
Definition cpuid.h:106
@ CPUID_EDX_MCA
Definition cpuid.h:101
@ CPUID_EDX_PGE
Definition cpuid.h:100
@ CPUID_EDX_CMOV
Definition cpuid.h:102
@ CPUID_EDX_SEP
Definition cpuid.h:98
@ CPUID_EDX_RESERVED1
Definition cpuid.h:107
@ CPUID_EDX_HTT
Definition cpuid.h:115
@ CPUID_EDX_ACPI
Definition cpuid.h:109
#define ASM(...)
Inline assembly macro.
Definition defs.h:160
__UINT32_TYPE__ uint32_t
Definition stdint.h:15
CPU extended feature information structure.
Definition cpuid.h:220
cpuid_ebx_features_t featuresEbx
Definition cpuid.h:221
CPU feature information structure.
Definition cpuid.h:193
cpuid_ecx_features_t featuresEcx
Definition cpuid.h:196
cpuid_edx_features_t featuresEdx
Definition cpuid.h:197
uint32_t brandClflushApicid
Definition cpuid.h:195
uint32_t version
Definition cpuid.h:194
Output structure for CPUID instruction.
Definition cpuid.h:169
uint32_t ebx
Definition cpuid.h:171
uint32_t eax
Definition cpuid.h:170
uint32_t edx
Definition cpuid.h:173
uint32_t ecx
Definition cpuid.h:172