Ronak Kanabar | 1ae366f | 2023-06-07 01:21:56 +0530 | [diff] [blame^] | 1 | /** @file |
| 2 | Intel CPUID leaf definitions. |
| 3 | |
| 4 | Provides defines for CPUID leaf indexes. Data structures are provided for |
| 5 | registers returned by a CPUID leaf that contain one or more bit fields. |
| 6 | If a register returned is a single 32-bit value, then a data structure is |
| 7 | not provided for that register. |
| 8 | |
| 9 | Copyright (c) 2015 - 2021, Intel Corporation. All rights reserved.<BR> |
| 10 | SPDX-License-Identifier: BSD-2-Clause-Patent |
| 11 | |
| 12 | @par Specification Reference: |
| 13 | Intel(R) 64 and IA-32 Architectures Software Developer's Manual, Volume 2A, |
| 14 | November 2018, CPUID instruction. |
| 15 | Architecture Specification: Intel(R) Trust Domain Extensions Module, Chap 10.2 |
| 16 | 344425-003US, August 2021 |
| 17 | |
| 18 | **/ |
| 19 | |
| 20 | #ifndef __INTEL_CPUID_H__ |
| 21 | #define __INTEL_CPUID_H__ |
| 22 | |
| 23 | /** |
| 24 | CPUID Signature Information |
| 25 | |
| 26 | @param EAX CPUID_SIGNATURE (0x00) |
| 27 | |
| 28 | @retval EAX Returns the highest value the CPUID instruction recognizes for |
| 29 | returning basic processor information. The value is returned is |
| 30 | processor specific. |
| 31 | @retval EBX First 4 characters of a vendor identification string. |
| 32 | @retval ECX Last 4 characters of a vendor identification string. |
| 33 | @retval EDX Middle 4 characters of a vendor identification string. |
| 34 | |
| 35 | <b>Example usage</b> |
| 36 | @code |
| 37 | UINT32 Eax; |
| 38 | UINT32 Ebx; |
| 39 | UINT32 Ecx; |
| 40 | UINT32 Edx; |
| 41 | |
| 42 | AsmCpuid (CPUID_SIGNATURE, &Eax, &Ebx, &Ecx, &Edx); |
| 43 | @endcode |
| 44 | **/ |
| 45 | #define CPUID_SIGNATURE 0x00 |
| 46 | |
| 47 | /// |
| 48 | /// @{ CPUID signature values returned by Intel processors |
| 49 | /// |
| 50 | #define CPUID_SIGNATURE_GENUINE_INTEL_EBX SIGNATURE_32 ('G', 'e', 'n', 'u') |
| 51 | #define CPUID_SIGNATURE_GENUINE_INTEL_EDX SIGNATURE_32 ('i', 'n', 'e', 'I') |
| 52 | #define CPUID_SIGNATURE_GENUINE_INTEL_ECX SIGNATURE_32 ('n', 't', 'e', 'l') |
| 53 | /// |
| 54 | /// @} |
| 55 | /// |
| 56 | |
| 57 | /** |
| 58 | CPUID Version Information |
| 59 | |
| 60 | @param EAX CPUID_VERSION_INFO (0x01) |
| 61 | |
| 62 | @retval EAX Returns Model, Family, Stepping Information described by the |
| 63 | type CPUID_VERSION_INFO_EAX. |
| 64 | @retval EBX Returns Brand, Cache Line Size, and Initial APIC ID described by |
| 65 | the type CPUID_VERSION_INFO_EBX. |
| 66 | @retval ECX CPU Feature Information described by the type |
| 67 | CPUID_VERSION_INFO_ECX. |
| 68 | @retval EDX CPU Feature Information described by the type |
| 69 | CPUID_VERSION_INFO_EDX. |
| 70 | |
| 71 | <b>Example usage</b> |
| 72 | @code |
| 73 | CPUID_VERSION_INFO_EAX Eax; |
| 74 | CPUID_VERSION_INFO_EBX Ebx; |
| 75 | CPUID_VERSION_INFO_ECX Ecx; |
| 76 | CPUID_VERSION_INFO_EDX Edx; |
| 77 | |
| 78 | AsmCpuid (CPUID_VERSION_INFO, &Eax.Uint32, &Ebx.Uint32, &Ecx.Uint32, &Edx.Uint32); |
| 79 | @endcode |
| 80 | **/ |
| 81 | #define CPUID_VERSION_INFO 0x01 |
| 82 | |
| 83 | /** |
| 84 | CPUID Version Information returned in EAX for CPUID leaf |
| 85 | #CPUID_VERSION_INFO. |
| 86 | **/ |
| 87 | typedef union { |
| 88 | /// |
| 89 | /// Individual bit fields |
| 90 | /// |
| 91 | struct { |
| 92 | UINT32 SteppingId : 4; ///< [Bits 3:0] Stepping ID |
| 93 | UINT32 Model : 4; ///< [Bits 7:4] Model |
| 94 | UINT32 FamilyId : 4; ///< [Bits 11:8] Family |
| 95 | UINT32 ProcessorType : 2; ///< [Bits 13:12] Processor Type |
| 96 | UINT32 Reserved1 : 2; ///< [Bits 15:14] Reserved |
| 97 | UINT32 ExtendedModelId : 4; ///< [Bits 19:16] Extended Model ID |
| 98 | UINT32 ExtendedFamilyId : 8; ///< [Bits 27:20] Extended Family ID |
| 99 | UINT32 Reserved2 : 4; ///< Reserved |
| 100 | } Bits; |
| 101 | /// |
| 102 | /// All bit fields as a 32-bit value |
| 103 | /// |
| 104 | UINT32 Uint32; |
| 105 | } CPUID_VERSION_INFO_EAX; |
| 106 | |
| 107 | /// |
| 108 | /// @{ Define value for bit field CPUID_VERSION_INFO_EAX.ProcessorType |
| 109 | /// |
| 110 | #define CPUID_VERSION_INFO_EAX_PROCESSOR_TYPE_ORIGINAL_OEM_PROCESSOR 0x00 |
| 111 | #define CPUID_VERSION_INFO_EAX_PROCESSOR_TYPE_INTEL_OVERDRIVE_PROCESSOR 0x01 |
| 112 | #define CPUID_VERSION_INFO_EAX_PROCESSOR_TYPE_DUAL_PROCESSOR 0x02 |
| 113 | /// |
| 114 | /// @} |
| 115 | /// |
| 116 | |
| 117 | /** |
| 118 | CPUID Version Information returned in EBX for CPUID leaf |
| 119 | #CPUID_VERSION_INFO. |
| 120 | **/ |
| 121 | typedef union { |
| 122 | /// |
| 123 | /// Individual bit fields |
| 124 | /// |
| 125 | struct { |
| 126 | /// |
| 127 | /// [Bits 7:0] Provides an entry into a brand string table that contains |
| 128 | /// brand strings for IA-32 processors. |
| 129 | /// |
| 130 | UINT32 BrandIndex : 8; |
| 131 | /// |
| 132 | /// [Bits 15:8] Indicates the size of the cache line flushed by the CLFLUSH |
| 133 | /// and CLFLUSHOPT instructions in 8-byte increments. This field was |
| 134 | /// introduced in the Pentium 4 processor. |
| 135 | /// |
| 136 | UINT32 CacheLineSize : 8; |
| 137 | /// |
| 138 | /// [Bits 23:16] Maximum number of addressable IDs for logical processors |
| 139 | /// in this physical package. |
| 140 | /// |
| 141 | /// @note |
| 142 | /// The nearest power-of-2 integer that is not smaller than EBX[23:16] is |
| 143 | /// the number of unique initial APICIDs reserved for addressing different |
| 144 | /// logical processors in a physical package. This field is only valid if |
| 145 | /// CPUID.1.EDX.HTT[bit 28]= 1. |
| 146 | /// |
| 147 | UINT32 MaximumAddressableIdsForLogicalProcessors : 8; |
| 148 | /// |
| 149 | /// [Bits 31:24] The 8-bit ID that is assigned to the local APIC on the |
| 150 | /// processor during power up. This field was introduced in the Pentium 4 |
| 151 | /// processor. |
| 152 | /// |
| 153 | UINT32 InitialLocalApicId : 8; |
| 154 | } Bits; |
| 155 | /// |
| 156 | /// All bit fields as a 32-bit value |
| 157 | /// |
| 158 | UINT32 Uint32; |
| 159 | } CPUID_VERSION_INFO_EBX; |
| 160 | |
| 161 | /** |
| 162 | CPUID Version Information returned in ECX for CPUID leaf |
| 163 | #CPUID_VERSION_INFO. |
| 164 | **/ |
| 165 | typedef union { |
| 166 | /// |
| 167 | /// Individual bit fields |
| 168 | /// |
| 169 | struct { |
| 170 | /// |
| 171 | /// [Bit 0] Streaming SIMD Extensions 3 (SSE3). A value of 1 indicates the |
| 172 | /// processor supports this technology |
| 173 | /// |
| 174 | UINT32 SSE3 : 1; |
| 175 | /// |
| 176 | /// [Bit 1] A value of 1 indicates the processor supports the PCLMULQDQ |
| 177 | /// instruction. Carryless Multiplication |
| 178 | /// |
| 179 | UINT32 PCLMULQDQ : 1; |
| 180 | /// |
| 181 | /// [Bit 2] 64-bit DS Area. A value of 1 indicates the processor supports |
| 182 | /// DS area using 64-bit layout. |
| 183 | /// |
| 184 | UINT32 DTES64 : 1; |
| 185 | /// |
| 186 | /// [Bit 3] MONITOR/MWAIT. A value of 1 indicates the processor supports |
| 187 | /// this feature. |
| 188 | /// |
| 189 | UINT32 MONITOR : 1; |
| 190 | /// |
| 191 | /// [Bit 4] CPL Qualified Debug Store. A value of 1 indicates the processor |
| 192 | /// supports the extensions to the Debug Store feature to allow for branch |
| 193 | /// message storage qualified by CPL |
| 194 | /// |
| 195 | UINT32 DS_CPL : 1; |
| 196 | /// |
| 197 | /// [Bit 5] Virtual Machine Extensions. A value of 1 indicates that the |
| 198 | /// processor supports this technology. |
| 199 | /// |
| 200 | UINT32 VMX : 1; |
| 201 | /// |
| 202 | /// [Bit 6] Safer Mode Extensions. A value of 1 indicates that the processor |
| 203 | /// supports this technology |
| 204 | /// |
| 205 | UINT32 SMX : 1; |
| 206 | /// |
| 207 | /// [Bit 7] Enhanced Intel SpeedStep(R) technology. A value of 1 indicates |
| 208 | /// that the processor supports this technology |
| 209 | /// |
| 210 | UINT32 EIST : 1; |
| 211 | /// |
| 212 | /// [Bit 8] Thermal Monitor 2. A value of 1 indicates whether the processor |
| 213 | /// supports this technology |
| 214 | /// |
| 215 | UINT32 TM2 : 1; |
| 216 | /// |
| 217 | /// [Bit 9] A value of 1 indicates the presence of the Supplemental Streaming |
| 218 | /// SIMD Extensions 3 (SSSE3). A value of 0 indicates the instruction |
| 219 | /// extensions are not present in the processor. |
| 220 | /// |
| 221 | UINT32 SSSE3 : 1; |
| 222 | /// |
| 223 | /// [Bit 10] L1 Context ID. A value of 1 indicates the L1 data cache mode |
| 224 | /// can be set to either adaptive mode or shared mode. A value of 0 indicates |
| 225 | /// this feature is not supported. See definition of the IA32_MISC_ENABLE MSR |
| 226 | /// Bit 24 (L1 Data Cache Context Mode) for details |
| 227 | /// |
| 228 | UINT32 CNXT_ID : 1; |
| 229 | /// |
| 230 | /// [Bit 11] A value of 1 indicates the processor supports IA32_DEBUG_INTERFACE |
| 231 | /// MSR for silicon debug |
| 232 | /// |
| 233 | UINT32 SDBG : 1; |
| 234 | /// |
| 235 | /// [Bit 12] A value of 1 indicates the processor supports FMA (Fused Multiple |
| 236 | /// Add) extensions using YMM state. |
| 237 | /// |
| 238 | UINT32 FMA : 1; |
| 239 | /// |
| 240 | /// [Bit 13] CMPXCHG16B Available. A value of 1 indicates that the feature |
| 241 | /// is available. |
| 242 | /// |
| 243 | UINT32 CMPXCHG16B : 1; |
| 244 | /// |
| 245 | /// [Bit 14] xTPR Update Control. A value of 1 indicates that the processor |
| 246 | /// supports changing IA32_MISC_ENABLE[Bit 23]. |
| 247 | /// |
| 248 | UINT32 xTPR_Update_Control : 1; |
| 249 | /// |
| 250 | /// [Bit 15] Perfmon and Debug Capability: A value of 1 indicates the |
| 251 | /// processor supports the performance and debug feature indication MSR |
| 252 | /// IA32_PERF_CAPABILITIES. |
| 253 | /// |
| 254 | UINT32 PDCM : 1; |
| 255 | UINT32 Reserved : 1; |
| 256 | /// |
| 257 | /// [Bit 17] Process-context identifiers. A value of 1 indicates that the |
| 258 | /// processor supports PCIDs and that software may set CR4.PCIDE to 1. |
| 259 | /// |
| 260 | UINT32 PCID : 1; |
| 261 | /// |
| 262 | /// [Bit 18] A value of 1 indicates the processor supports the ability to |
| 263 | /// prefetch data from a memory mapped device. Direct Cache Access. |
| 264 | /// |
| 265 | UINT32 DCA : 1; |
| 266 | /// |
| 267 | /// [Bit 19] A value of 1 indicates that the processor supports SSE4.1. |
| 268 | /// |
| 269 | UINT32 SSE4_1 : 1; |
| 270 | /// |
| 271 | /// [Bit 20] A value of 1 indicates that the processor supports SSE4.2. |
| 272 | /// |
| 273 | UINT32 SSE4_2 : 1; |
| 274 | /// |
| 275 | /// [Bit 21] A value of 1 indicates that the processor supports x2APIC |
| 276 | /// feature. |
| 277 | /// |
| 278 | UINT32 x2APIC : 1; |
| 279 | /// |
| 280 | /// [Bit 22] A value of 1 indicates that the processor supports MOVBE |
| 281 | /// instruction. |
| 282 | /// |
| 283 | UINT32 MOVBE : 1; |
| 284 | /// |
| 285 | /// [Bit 23] A value of 1 indicates that the processor supports the POPCNT |
| 286 | /// instruction. |
| 287 | /// |
| 288 | UINT32 POPCNT : 1; |
| 289 | /// |
| 290 | /// [Bit 24] A value of 1 indicates that the processor's local APIC timer |
| 291 | /// supports one-shot operation using a TSC deadline value. |
| 292 | /// |
| 293 | UINT32 TSC_Deadline : 1; |
| 294 | /// |
| 295 | /// [Bit 25] A value of 1 indicates that the processor supports the AESNI |
| 296 | /// instruction extensions. |
| 297 | /// |
| 298 | UINT32 AESNI : 1; |
| 299 | /// |
| 300 | /// [Bit 26] A value of 1 indicates that the processor supports the |
| 301 | /// XSAVE/XRSTOR processor extended states feature, the XSETBV/XGETBV |
| 302 | /// instructions, and XCR0. |
| 303 | /// |
| 304 | UINT32 XSAVE : 1; |
| 305 | /// |
| 306 | /// [Bit 27] A value of 1 indicates that the OS has set CR4.OSXSAVE[Bit 18] |
| 307 | /// to enable XSETBV/XGETBV instructions to access XCR0 and to support |
| 308 | /// processor extended state management using XSAVE/XRSTOR. |
| 309 | /// |
| 310 | UINT32 OSXSAVE : 1; |
| 311 | /// |
| 312 | /// [Bit 28] A value of 1 indicates the processor supports the AVX instruction |
| 313 | /// extensions. |
| 314 | /// |
| 315 | UINT32 AVX : 1; |
| 316 | /// |
| 317 | /// [Bit 29] A value of 1 indicates that processor supports 16-bit |
| 318 | /// floating-point conversion instructions. |
| 319 | /// |
| 320 | UINT32 F16C : 1; |
| 321 | /// |
| 322 | /// [Bit 30] A value of 1 indicates that processor supports RDRAND instruction. |
| 323 | /// |
| 324 | UINT32 RDRAND : 1; |
| 325 | /// |
| 326 | /// [Bit 31] A value of 1 indicates that processor is in Para-Virtualized. |
| 327 | /// |
| 328 | UINT32 ParaVirtualized : 1; |
| 329 | } Bits; |
| 330 | /// |
| 331 | /// All bit fields as a 32-bit value |
| 332 | /// |
| 333 | UINT32 Uint32; |
| 334 | } CPUID_VERSION_INFO_ECX; |
| 335 | |
| 336 | /** |
| 337 | CPUID Version Information returned in EDX for CPUID leaf |
| 338 | #CPUID_VERSION_INFO. |
| 339 | **/ |
| 340 | typedef union { |
| 341 | /// |
| 342 | /// Individual bit fields |
| 343 | /// |
| 344 | struct { |
| 345 | /// |
| 346 | /// [Bit 0] Floating Point Unit On-Chip. The processor contains an x87 FPU. |
| 347 | /// |
| 348 | UINT32 FPU : 1; |
| 349 | /// |
| 350 | /// [Bit 1] Virtual 8086 Mode Enhancements. Virtual 8086 mode enhancements, |
| 351 | /// including CR4.VME for controlling the feature, CR4.PVI for protected |
| 352 | /// mode virtual interrupts, software interrupt indirection, expansion of |
| 353 | /// the TSS with the software indirection bitmap, and EFLAGS.VIF and |
| 354 | /// EFLAGS.VIP flags. |
| 355 | /// |
| 356 | UINT32 VME : 1; |
| 357 | /// |
| 358 | /// [Bit 2] Debugging Extensions. Support for I/O breakpoints, including |
| 359 | /// CR4.DE for controlling the feature, and optional trapping of accesses to |
| 360 | /// DR4 and DR5. |
| 361 | /// |
| 362 | UINT32 DE : 1; |
| 363 | /// |
| 364 | /// [Bit 3] Page Size Extension. Large pages of size 4 MByte are supported, |
| 365 | /// including CR4.PSE for controlling the feature, the defined dirty bit in |
| 366 | /// PDE (Page Directory Entries), optional reserved bit trapping in CR3, |
| 367 | /// PDEs, and PTEs. |
| 368 | /// |
| 369 | UINT32 PSE : 1; |
| 370 | /// |
| 371 | /// [Bit 4] Time Stamp Counter. The RDTSC instruction is supported, |
| 372 | /// including CR4.TSD for controlling privilege. |
| 373 | /// |
| 374 | UINT32 TSC : 1; |
| 375 | /// |
| 376 | /// [Bit 5] Model Specific Registers RDMSR and WRMSR Instructions. The |
| 377 | /// RDMSR and WRMSR instructions are supported. Some of the MSRs are |
| 378 | /// implementation dependent. |
| 379 | /// |
| 380 | UINT32 MSR : 1; |
| 381 | /// |
| 382 | /// [Bit 6] Physical Address Extension. Physical addresses greater than 32 |
| 383 | /// bits are supported: extended page table entry formats, an extra level in |
| 384 | /// the page translation tables is defined, 2-MByte pages are supported |
| 385 | /// instead of 4 Mbyte pages if PAE bit is 1. |
| 386 | /// |
| 387 | UINT32 PAE : 1; |
| 388 | /// |
| 389 | /// [Bit 7] Machine Check Exception. Exception 18 is defined for Machine |
| 390 | /// Checks, including CR4.MCE for controlling the feature. This feature does |
| 391 | /// not define the model-specific implementations of machine-check error |
| 392 | /// logging, reporting, and processor shutdowns. Machine Check exception |
| 393 | /// handlers may have to depend on processor version to do model specific |
| 394 | /// processing of the exception, or test for the presence of the Machine |
| 395 | /// Check feature. |
| 396 | /// |
| 397 | UINT32 MCE : 1; |
| 398 | /// |
| 399 | /// [Bit 8] CMPXCHG8B Instruction. The compare-and-exchange 8 bytes(64 bits) |
| 400 | /// instruction is supported (implicitly locked and atomic). |
| 401 | /// |
| 402 | UINT32 CX8 : 1; |
| 403 | /// |
| 404 | /// [Bit 9] APIC On-Chip. The processor contains an Advanced Programmable |
| 405 | /// Interrupt Controller (APIC), responding to memory mapped commands in the |
| 406 | /// physical address range FFFE0000H to FFFE0FFFH (by default - some |
| 407 | /// processors permit the APIC to be relocated). |
| 408 | /// |
| 409 | UINT32 APIC : 1; |
| 410 | UINT32 Reserved1 : 1; |
| 411 | /// |
| 412 | /// [Bit 11] SYSENTER and SYSEXIT Instructions. The SYSENTER and SYSEXIT |
| 413 | /// and associated MSRs are supported. |
| 414 | /// |
| 415 | UINT32 SEP : 1; |
| 416 | /// |
| 417 | /// [Bit 12] Memory Type Range Registers. MTRRs are supported. The MTRRcap |
| 418 | /// MSR contains feature bits that describe what memory types are supported, |
| 419 | /// how many variable MTRRs are supported, and whether fixed MTRRs are |
| 420 | /// supported. |
| 421 | /// |
| 422 | UINT32 MTRR : 1; |
| 423 | /// |
| 424 | /// [Bit 13] Page Global Bit. The global bit is supported in paging-structure |
| 425 | /// entries that map a page, indicating TLB entries that are common to |
| 426 | /// different processes and need not be flushed. The CR4.PGE bit controls |
| 427 | /// this feature. |
| 428 | /// |
| 429 | UINT32 PGE : 1; |
| 430 | /// |
| 431 | /// [Bit 14] Machine Check Architecture. A value of 1 indicates the Machine |
| 432 | /// Check Architecture of reporting machine errors is supported. The MCG_CAP |
| 433 | /// MSR contains feature bits describing how many banks of error reporting |
| 434 | /// MSRs are supported. |
| 435 | /// |
| 436 | UINT32 MCA : 1; |
| 437 | /// |
| 438 | /// [Bit 15] Conditional Move Instructions. The conditional move instruction |
| 439 | /// CMOV is supported. In addition, if x87 FPU is present as indicated by the |
| 440 | /// CPUID.FPU feature bit, then the FCOMI and FCMOV instructions are supported. |
| 441 | /// |
| 442 | UINT32 CMOV : 1; |
| 443 | /// |
| 444 | /// [Bit 16] Page Attribute Table. Page Attribute Table is supported. This |
| 445 | /// feature augments the Memory Type Range Registers (MTRRs), allowing an |
| 446 | /// operating system to specify attributes of memory accessed through a |
| 447 | /// linear address on a 4KB granularity. |
| 448 | /// |
| 449 | UINT32 PAT : 1; |
| 450 | /// |
| 451 | /// [Bit 17] 36-Bit Page Size Extension. 4-MByte pages addressing physical |
| 452 | /// memory beyond 4 GBytes are supported with 32-bit paging. This feature |
| 453 | /// indicates that upper bits of the physical address of a 4-MByte page are |
| 454 | /// encoded in bits 20:13 of the page-directory entry. Such physical |
| 455 | /// addresses are limited by MAXPHYADDR and may be up to 40 bits in size. |
| 456 | /// |
| 457 | UINT32 PSE_36 : 1; |
| 458 | /// |
| 459 | /// [Bit 18] Processor Serial Number. The processor supports the 96-bit |
| 460 | /// processor identification number feature and the feature is enabled. |
| 461 | /// |
| 462 | UINT32 PSN : 1; |
| 463 | /// |
| 464 | /// [Bit 19] CLFLUSH Instruction. CLFLUSH Instruction is supported. |
| 465 | /// |
| 466 | UINT32 CLFSH : 1; |
| 467 | UINT32 Reserved2 : 1; |
| 468 | /// |
| 469 | /// [Bit 21] Debug Store. The processor supports the ability to write debug |
| 470 | /// information into a memory resident buffer. This feature is used by the |
| 471 | /// branch trace store (BTS) and precise event-based sampling (PEBS) |
| 472 | /// facilities. |
| 473 | /// |
| 474 | UINT32 DS : 1; |
| 475 | /// |
| 476 | /// [Bit 22] Thermal Monitor and Software Controlled Clock Facilities. The |
| 477 | /// processor implements internal MSRs that allow processor temperature to |
| 478 | /// be monitored and processor performance to be modulated in predefined |
| 479 | /// duty cycles under software control. |
| 480 | /// |
| 481 | UINT32 ACPI : 1; |
| 482 | /// |
| 483 | /// [Bit 23] Intel MMX Technology. The processor supports the Intel MMX |
| 484 | /// technology. |
| 485 | /// |
| 486 | UINT32 MMX : 1; |
| 487 | /// |
| 488 | /// [Bit 24] FXSAVE and FXRSTOR Instructions. The FXSAVE and FXRSTOR |
| 489 | /// instructions are supported for fast save and restore of the floating |
| 490 | /// point context. Presence of this bit also indicates that CR4.OSFXSR is |
| 491 | /// available for an operating system to indicate that it supports the |
| 492 | /// FXSAVE and FXRSTOR instructions. |
| 493 | /// |
| 494 | UINT32 FXSR : 1; |
| 495 | /// |
| 496 | /// [Bit 25] SSE. The processor supports the SSE extensions. |
| 497 | /// |
| 498 | UINT32 SSE : 1; |
| 499 | /// |
| 500 | /// [Bit 26] SSE2. The processor supports the SSE2 extensions. |
| 501 | /// |
| 502 | UINT32 SSE2 : 1; |
| 503 | /// |
| 504 | /// [Bit 27] Self Snoop. The processor supports the management of |
| 505 | /// conflicting memory types by performing a snoop of its own cache |
| 506 | /// structure for transactions issued to the bus. |
| 507 | /// |
| 508 | UINT32 SS : 1; |
| 509 | /// |
| 510 | /// [Bit 28] Max APIC IDs reserved field is Valid. A value of 0 for HTT |
| 511 | /// indicates there is only a single logical processor in the package and |
| 512 | /// software should assume only a single APIC ID is reserved. A value of 1 |
| 513 | /// for HTT indicates the value in CPUID.1.EBX[23:16] (the Maximum number of |
| 514 | /// addressable IDs for logical processors in this package) is valid for the |
| 515 | /// package. |
| 516 | /// |
| 517 | UINT32 HTT : 1; |
| 518 | /// |
| 519 | /// [Bit 29] Thermal Monitor. The processor implements the thermal monitor |
| 520 | /// automatic thermal control circuitry (TCC). |
| 521 | /// |
| 522 | UINT32 TM : 1; |
| 523 | UINT32 Reserved3 : 1; |
| 524 | /// |
| 525 | /// [Bit 31] Pending Break Enable. The processor supports the use of the |
| 526 | /// FERR#/PBE# pin when the processor is in the stop-clock state (STPCLK# is |
| 527 | /// asserted) to signal the processor that an interrupt is pending and that |
| 528 | /// the processor should return to normal operation to handle the interrupt. |
| 529 | /// Bit 10 (PBE enable) in the IA32_MISC_ENABLE MSR enables this capability. |
| 530 | /// |
| 531 | UINT32 PBE : 1; |
| 532 | } Bits; |
| 533 | /// |
| 534 | /// All bit fields as a 32-bit value |
| 535 | /// |
| 536 | UINT32 Uint32; |
| 537 | } CPUID_VERSION_INFO_EDX; |
| 538 | |
| 539 | /** |
| 540 | CPUID Cache and TLB Information |
| 541 | |
| 542 | @param EAX CPUID_CACHE_INFO (0x02) |
| 543 | |
| 544 | @retval EAX Cache and TLB Information described by the type |
| 545 | CPUID_CACHE_INFO_CACHE_TLB. |
| 546 | CPUID_CACHE_INFO_CACHE_TLB.CacheDescriptor[0] always returns |
| 547 | 0x01 and must be ignored. Only valid if |
| 548 | CPUID_CACHE_INFO_CACHE_TLB.Bits.NotValid is clear. |
| 549 | @retval EBX Cache and TLB Information described by the type |
| 550 | CPUID_CACHE_INFO_CACHE_TLB. Only valid if |
| 551 | CPUID_CACHE_INFO_CACHE_TLB.Bits.NotValid is clear. |
| 552 | @retval ECX Cache and TLB Information described by the type |
| 553 | CPUID_CACHE_INFO_CACHE_TLB. Only valid if |
| 554 | CPUID_CACHE_INFO_CACHE_TLB.Bits.NotValid is clear. |
| 555 | @retval EDX Cache and TLB Information described by the type |
| 556 | CPUID_CACHE_INFO_CACHE_TLB. Only valid if |
| 557 | CPUID_CACHE_INFO_CACHE_TLB.Bits.NotValid is clear. |
| 558 | |
| 559 | <b>Example usage</b> |
| 560 | @code |
| 561 | CPUID_CACHE_INFO_CACHE_TLB Eax; |
| 562 | CPUID_CACHE_INFO_CACHE_TLB Ebx; |
| 563 | CPUID_CACHE_INFO_CACHE_TLB Ecx; |
| 564 | CPUID_CACHE_INFO_CACHE_TLB Edx; |
| 565 | |
| 566 | AsmCpuid (CPUID_CACHE_INFO, &Eax.Uint32, &Ebx.Uint32, &Ecx.Uint32, &Edx.Uint32); |
| 567 | @endcode |
| 568 | |
| 569 | <b>Cache Descriptor values</b> |
| 570 | <table> |
| 571 | <tr><th>Value </th><th> Type </th><th> Description </th></tr> |
| 572 | <tr><td> 0x00 </td><td> General </td><td> Null descriptor, this byte contains no information</td></tr> |
| 573 | <tr><td> 0x01 </td><td> TLB </td><td> Instruction TLB: 4 KByte pages, 4-way set associative, 32 entries</td></tr> |
| 574 | <tr><td> 0x02 </td><td> TLB </td><td> Instruction TLB: 4 MByte pages, fully associative, 2 entries</td></tr> |
| 575 | <tr><td> 0x03 </td><td> TLB </td><td> Data TLB: 4 KByte pages, 4-way set associative, 64 entries</td></tr> |
| 576 | <tr><td> 0x04 </td><td> TLB </td><td> Data TLB: 4 MByte pages, 4-way set associative, 8 entries</td></tr> |
| 577 | <tr><td> 0x05 </td><td> TLB </td><td> Data TLB1: 4 MByte pages, 4-way set associative, 32 entries</td></tr> |
| 578 | <tr><td> 0x06 </td><td> Cache </td><td> 1st-level instruction cache: 8 KBytes, 4-way set associative, |
| 579 | 32 byte line size</td></tr> |
| 580 | <tr><td> 0x08 </td><td> Cache </td><td> 1st-level instruction cache: 16 KBytes, 4-way set associative, |
| 581 | 32 byte line size</td></tr> |
| 582 | <tr><td> 0x09 </td><td> Cache </td><td> 1st-level instruction cache: 32KBytes, 4-way set associative, |
| 583 | 64 byte line size</td></tr> |
| 584 | <tr><td> 0x0A </td><td> Cache </td><td> 1st-level data cache: 8 KBytes, 2-way set associative, 32 byte line size</td></tr> |
| 585 | <tr><td> 0x0B </td><td> TLB </td><td> Instruction TLB: 4 MByte pages, 4-way set associative, 4 entries</td></tr> |
| 586 | <tr><td> 0x0C </td><td> Cache </td><td> 1st-level data cache: 16 KBytes, 4-way set associative, 32 byte line size</td></tr> |
| 587 | <tr><td> 0x0D </td><td> Cache </td><td> 1st-level data cache: 16 KBytes, 4-way set associative, 64 byte line size</td></tr> |
| 588 | <tr><td> 0x0E </td><td> Cache </td><td> 1st-level data cache: 24 KBytes, 6-way set associative, 64 byte line size</td></tr> |
| 589 | <tr><td> 0x1D </td><td> Cache </td><td> 2nd-level cache: 128 KBytes, 2-way set associative, 64 byte line size</td></tr> |
| 590 | <tr><td> 0x21 </td><td> Cache </td><td> 2nd-level cache: 256 KBytes, 8-way set associative, 64 byte line size</td></tr> |
| 591 | <tr><td> 0x22 </td><td> Cache </td><td> 3rd-level cache: 512 KBytes, 4-way set associative, 64 byte line size, |
| 592 | 2 lines per sector</td></tr> |
| 593 | <tr><td> 0x23 </td><td> Cache </td><td> 3rd-level cache: 1 MBytes, 8-way set associative, 64 byte line size, |
| 594 | 2 lines per sector</td></tr> |
| 595 | <tr><td> 0x24 </td><td> Cache </td><td> 2nd-level cache: 1 MBytes, 16-way set associative, 64 byte line size</td></tr> |
| 596 | <tr><td> 0x25 </td><td> Cache </td><td> 3rd-level cache: 2 MBytes, 8-way set associative, 64 byte line size, |
| 597 | 2 lines per sector</td></tr> |
| 598 | <tr><td> 0x29 </td><td> Cache </td><td> 3rd-level cache: 4 MBytes, 8-way set associative, 64 byte line size, |
| 599 | 2 lines per sector</td></tr> |
| 600 | <tr><td> 0x2C </td><td> Cache </td><td> 1st-level data cache: 32 KBytes, 8-way set associative, |
| 601 | 64 byte line size</td></tr> |
| 602 | <tr><td> 0x30 </td><td> Cache </td><td> 1st-level instruction cache: 32 KBytes, 8-way set associative, |
| 603 | 64 byte line size</td></tr> |
| 604 | <tr><td> 0x40 </td><td> Cache </td><td> No 2nd-level cache or, if processor contains a valid 2nd-level cache, |
| 605 | no 3rd-level cache</td></tr> |
| 606 | <tr><td> 0x41 </td><td> Cache </td><td> 2nd-level cache: 128 KBytes, 4-way set associative, 32 byte line size</td></tr> |
| 607 | <tr><td> 0x42 </td><td> Cache </td><td> 2nd-level cache: 256 KBytes, 4-way set associative, 32 byte line size</td></tr> |
| 608 | <tr><td> 0x43 </td><td> Cache </td><td> 2nd-level cache: 512 KBytes, 4-way set associative, 32 byte line size</td></tr> |
| 609 | <tr><td> 0x44 </td><td> Cache </td><td> 2nd-level cache: 1 MByte, 4-way set associative, 32 byte line size</td></tr> |
| 610 | <tr><td> 0x45 </td><td> Cache </td><td> 2nd-level cache: 2 MByte, 4-way set associative, 32 byte line size</td></tr> |
| 611 | <tr><td> 0x46 </td><td> Cache </td><td> 3rd-level cache: 4 MByte, 4-way set associative, 64 byte line size</td></tr> |
| 612 | <tr><td> 0x47 </td><td> Cache </td><td> 3rd-level cache: 8 MByte, 8-way set associative, 64 byte line size</td></tr> |
| 613 | <tr><td> 0x48 </td><td> Cache </td><td> 2nd-level cache: 3MByte, 12-way set associative, 64 byte line size</td></tr> |
| 614 | <tr><td> 0x49 </td><td> Cache </td><td> 3rd-level cache: 4MB, 16-way set associative, 64-byte line size |
| 615 | (Intel Xeon processor MP, Family 0FH, Model 06H)<BR> |
| 616 | 2nd-level cache: 4 MByte, 16-way set associative, 64 byte line size</td></tr> |
| 617 | <tr><td> 0x4A </td><td> Cache </td><td> 3rd-level cache: 6MByte, 12-way set associative, 64 byte line size</td></tr> |
| 618 | <tr><td> 0x4B </td><td> Cache </td><td> 3rd-level cache: 8MByte, 16-way set associative, 64 byte line size</td></tr> |
| 619 | <tr><td> 0x4C </td><td> Cache </td><td> 3rd-level cache: 12MByte, 12-way set associative, 64 byte line size</td></tr> |
| 620 | <tr><td> 0x4D </td><td> Cache </td><td> 3rd-level cache: 16MByte, 16-way set associative, 64 byte line size</td></tr> |
| 621 | <tr><td> 0x4E </td><td> Cache </td><td> 2nd-level cache: 6MByte, 24-way set associative, 64 byte line size</td></tr> |
| 622 | <tr><td> 0x4F </td><td> TLB </td><td> Instruction TLB: 4 KByte pages, 32 entries</td></tr> |
| 623 | <tr><td> 0x50 </td><td> TLB </td><td> Instruction TLB: 4 KByte and 2-MByte or 4-MByte pages, 64 entries</td></tr> |
| 624 | <tr><td> 0x51 </td><td> TLB </td><td> Instruction TLB: 4 KByte and 2-MByte or 4-MByte pages, 128 entries</td></tr> |
| 625 | <tr><td> 0x52 </td><td> TLB </td><td> Instruction TLB: 4 KByte and 2-MByte or 4-MByte pages, 256 entries</td></tr> |
| 626 | <tr><td> 0x55 </td><td> TLB </td><td> Instruction TLB: 2-MByte or 4-MByte pages, fully associative, 7 entries</td></tr> |
| 627 | <tr><td> 0x56 </td><td> TLB </td><td> Data TLB0: 4 MByte pages, 4-way set associative, 16 entries</td></tr> |
| 628 | <tr><td> 0x57 </td><td> TLB </td><td> Data TLB0: 4 KByte pages, 4-way associative, 16 entries</td></tr> |
| 629 | <tr><td> 0x59 </td><td> TLB </td><td> Data TLB0: 4 KByte pages, fully associative, 16 entries</td></tr> |
| 630 | <tr><td> 0x5A </td><td> TLB </td><td> Data TLB0: 2 MByte or 4 MByte pages, 4-way set associative, 32 entries</td></tr> |
| 631 | <tr><td> 0x5B </td><td> TLB </td><td> Data TLB: 4 KByte and 4 MByte pages, 64 entries</td></tr> |
| 632 | <tr><td> 0x5C </td><td> TLB </td><td> Data TLB: 4 KByte and 4 MByte pages,128 entries</td></tr> |
| 633 | <tr><td> 0x5D </td><td> TLB </td><td> Data TLB: 4 KByte and 4 MByte pages,256 entries</td></tr> |
| 634 | <tr><td> 0x60 </td><td> Cache </td><td> 1st-level data cache: 16 KByte, 8-way set associative, 64 byte line size</td></tr> |
| 635 | <tr><td> 0x61 </td><td> TLB </td><td> Instruction TLB: 4 KByte pages, fully associative, 48 entries</td></tr> |
| 636 | <tr><td> 0x63 </td><td> TLB </td><td> Data TLB: 2 MByte or 4 MByte pages, 4-way set associative, |
| 637 | 32 entries and a separate array with 1 GByte pages, 4-way set associative, |
| 638 | 4 entries</td></tr> |
| 639 | <tr><td> 0x64 </td><td> TLB </td><td> Data TLB: 4 KByte pages, 4-way set associative, 512 entries</td></tr> |
| 640 | <tr><td> 0x66 </td><td> Cache </td><td> 1st-level data cache: 8 KByte, 4-way set associative, 64 byte line size</td></tr> |
| 641 | <tr><td> 0x67 </td><td> Cache </td><td> 1st-level data cache: 16 KByte, 4-way set associative, 64 byte line size</td></tr> |
| 642 | <tr><td> 0x68 </td><td> Cache </td><td> 1st-level data cache: 32 KByte, 4-way set associative, 64 byte line size</td></tr> |
| 643 | <tr><td> 0x6A </td><td> Cache </td><td> uTLB: 4 KByte pages, 8-way set associative, 64 entries</td></tr> |
| 644 | <tr><td> 0x6B </td><td> Cache </td><td> DTLB: 4 KByte pages, 8-way set associative, 256 entries</td></tr> |
| 645 | <tr><td> 0x6C </td><td> Cache </td><td> DTLB: 2M/4M pages, 8-way set associative, 128 entries</td></tr> |
| 646 | <tr><td> 0x6D </td><td> Cache </td><td> DTLB: 1 GByte pages, fully associative, 16 entries</td></tr> |
| 647 | <tr><td> 0x70 </td><td> Cache </td><td> Trace cache: 12 K-uop, 8-way set associative</td></tr> |
| 648 | <tr><td> 0x71 </td><td> Cache </td><td> Trace cache: 16 K-uop, 8-way set associative</td></tr> |
| 649 | <tr><td> 0x72 </td><td> Cache </td><td> Trace cache: 32 K-uop, 8-way set associative</td></tr> |
| 650 | <tr><td> 0x76 </td><td> TLB </td><td> Instruction TLB: 2M/4M pages, fully associative, 8 entries</td></tr> |
| 651 | <tr><td> 0x78 </td><td> Cache </td><td> 2nd-level cache: 1 MByte, 4-way set associative, 64byte line size</td></tr> |
| 652 | <tr><td> 0x79 </td><td> Cache </td><td> 2nd-level cache: 128 KByte, 8-way set associative, 64 byte line size, |
| 653 | 2 lines per sector</td></tr> |
| 654 | <tr><td> 0x7A </td><td> Cache </td><td> 2nd-level cache: 256 KByte, 8-way set associative, 64 byte line size, |
| 655 | 2 lines per sector</td></tr> |
| 656 | <tr><td> 0x7B </td><td> Cache </td><td> 2nd-level cache: 512 KByte, 8-way set associative, 64 byte line size, |
| 657 | 2 lines per sector</td></tr> |
| 658 | <tr><td> 0x7C </td><td> Cache </td><td> 2nd-level cache: 1 MByte, 8-way set associative, 64 byte line size, |
| 659 | 2 lines per sector</td></tr> |
| 660 | <tr><td> 0x7D </td><td> Cache </td><td> 2nd-level cache: 2 MByte, 8-way set associative, 64byte line size</td></tr> |
| 661 | <tr><td> 0x7F </td><td> Cache </td><td> 2nd-level cache: 512 KByte, 2-way set associative, 64-byte line size</td></tr> |
| 662 | <tr><td> 0x80 </td><td> Cache </td><td> 2nd-level cache: 512 KByte, 8-way set associative, 64-byte line size</td></tr> |
| 663 | <tr><td> 0x82 </td><td> Cache </td><td> 2nd-level cache: 256 KByte, 8-way set associative, 32 byte line size</td></tr> |
| 664 | <tr><td> 0x83 </td><td> Cache </td><td> 2nd-level cache: 512 KByte, 8-way set associative, 32 byte line size</td></tr> |
| 665 | <tr><td> 0x84 </td><td> Cache </td><td> 2nd-level cache: 1 MByte, 8-way set associative, 32 byte line size</td></tr> |
| 666 | <tr><td> 0x85 </td><td> Cache </td><td> 2nd-level cache: 2 MByte, 8-way set associative, 32 byte line size</td></tr> |
| 667 | <tr><td> 0x86 </td><td> Cache </td><td> 2nd-level cache: 512 KByte, 4-way set associative, 64 byte line size</td></tr> |
| 668 | <tr><td> 0x87 </td><td> Cache </td><td> 2nd-level cache: 1 MByte, 8-way set associative, 64 byte line size</td></tr> |
| 669 | <tr><td> 0xA0 </td><td> DTLB </td><td> DTLB: 4k pages, fully associative, 32 entries</td></tr> |
| 670 | <tr><td> 0xB0 </td><td> TLB </td><td> Instruction TLB: 4 KByte pages, 4-way set associative, 128 entries</td></tr> |
| 671 | <tr><td> 0xB1 </td><td> TLB </td><td> Instruction TLB: 2M pages, 4-way, 8 entries or 4M pages, 4-way, 4 entries</td></tr> |
| 672 | <tr><td> 0xB2 </td><td> TLB </td><td> Instruction TLB: 4KByte pages, 4-way set associative, 64 entries</td></tr> |
| 673 | <tr><td> 0xB3 </td><td> TLB </td><td> Data TLB: 4 KByte pages, 4-way set associative, 128 entries</td></tr> |
| 674 | <tr><td> 0xB4 </td><td> TLB </td><td> Data TLB1: 4 KByte pages, 4-way associative, 256 entries</td></tr> |
| 675 | <tr><td> 0xB5 </td><td> TLB </td><td> Instruction TLB: 4KByte pages, 8-way set associative, 64 entries</td></tr> |
| 676 | <tr><td> 0xB6 </td><td> TLB </td><td> Instruction TLB: 4KByte pages, 8-way set associative, |
| 677 | 128 entries</td></tr> |
| 678 | <tr><td> 0xBA </td><td> TLB </td><td> Data TLB1: 4 KByte pages, 4-way associative, 64 entries</td></tr> |
| 679 | <tr><td> 0xC0 </td><td> TLB </td><td> Data TLB: 4 KByte and 4 MByte pages, 4-way associative, 8 entries</td></tr> |
| 680 | <tr><td> 0xC1 </td><td> STLB </td><td> Shared 2nd-Level TLB: 4 KByte/2MByte pages, 8-way associative, |
| 681 | 1024 entries</td></tr> |
| 682 | <tr><td> 0xC2 </td><td> DTLB </td><td> DTLB: 4 KByte/2 MByte pages, 4-way associative, 16 entries</td></tr> |
| 683 | <tr><td> 0xC3 </td><td> STLB </td><td> Shared 2nd-Level TLB: 4 KByte /2 MByte pages, 6-way associative, |
| 684 | 1536 entries. Also 1GBbyte pages, 4-way, 16 entries.</td></tr> |
| 685 | <tr><td> 0xC4 </td><td> DTLB </td><td> DTLB: 2M/4M Byte pages, 4-way associative, 32 entries</td></tr> |
| 686 | <tr><td> 0xCA </td><td> STLB </td><td> Shared 2nd-Level TLB: 4 KByte pages, 4-way associative, 512 entries</td></tr> |
| 687 | <tr><td> 0xD0 </td><td> Cache </td><td> 3rd-level cache: 512 KByte, 4-way set associative, 64 byte line size</td></tr> |
| 688 | <tr><td> 0xD1 </td><td> Cache </td><td> 3rd-level cache: 1 MByte, 4-way set associative, 64 byte line size</td></tr> |
| 689 | <tr><td> 0xD2 </td><td> Cache </td><td> 3rd-level cache: 2 MByte, 4-way set associative, 64 byte line size</td></tr> |
| 690 | <tr><td> 0xD6 </td><td> Cache </td><td> 3rd-level cache: 1 MByte, 8-way set associative, 64 byte line size</td></tr> |
| 691 | <tr><td> 0xD7 </td><td> Cache </td><td> 3rd-level cache: 2 MByte, 8-way set associative, 64 byte line size</td></tr> |
| 692 | <tr><td> 0xD8 </td><td> Cache </td><td> 3rd-level cache: 4 MByte, 8-way set associative, 64 byte line size</td></tr> |
| 693 | <tr><td> 0xDC </td><td> Cache </td><td> 3rd-level cache: 1.5 MByte, 12-way set associative, 64 byte line size</td></tr> |
| 694 | <tr><td> 0xDD </td><td> Cache </td><td> 3rd-level cache: 3 MByte, 12-way set associative, 64 byte line size</td></tr> |
| 695 | <tr><td> 0xDE </td><td> Cache </td><td> 3rd-level cache: 6 MByte, 12-way set associative, 64 byte line size</td></tr> |
| 696 | <tr><td> 0xE2 </td><td> Cache </td><td> 3rd-level cache: 2 MByte, 16-way set associative, 64 byte line size</td></tr> |
| 697 | <tr><td> 0xE3 </td><td> Cache </td><td> 3rd-level cache: 4 MByte, 16-way set associative, 64 byte line size</td></tr> |
| 698 | <tr><td> 0xE4 </td><td> Cache </td><td> 3rd-level cache: 8 MByte, 16-way set associative, 64 byte line size</td></tr> |
| 699 | <tr><td> 0xEA </td><td> Cache </td><td> 3rd-level cache: 12MByte, 24-way set associative, 64 byte line size</td></tr> |
| 700 | <tr><td> 0xEB </td><td> Cache </td><td> 3rd-level cache: 18MByte, 24-way set associative, 64 byte line size</td></tr> |
| 701 | <tr><td> 0xEC </td><td> Cache </td><td> 3rd-level cache: 24MByte, 24-way set associative, 64 byte line size</td></tr> |
| 702 | <tr><td> 0xF0 </td><td> Prefetch</td><td> 64-Byte prefetching</td></tr> |
| 703 | <tr><td> 0xF1 </td><td> Prefetch</td><td> 128-Byte prefetching</td></tr> |
| 704 | <tr><td> 0xFE </td><td> General </td><td> CPUID leaf 2 does not report TLB descriptor information; use CPUID |
| 705 | leaf 18H to query TLB and other address translation parameters.</td></tr> |
| 706 | <tr><td> 0xFF </td><td> General </td><td> CPUID leaf 2 does not report cache descriptor information, |
| 707 | use CPUID leaf 4 to query cache parameters</td></tr> |
| 708 | </table> |
| 709 | **/ |
| 710 | #define CPUID_CACHE_INFO 0x02 |
| 711 | |
| 712 | /** |
| 713 | CPUID Cache and TLB Information returned in EAX, EBX, ECX, and EDX for CPUID |
| 714 | leaf #CPUID_CACHE_INFO. |
| 715 | **/ |
| 716 | typedef union { |
| 717 | /// |
| 718 | /// Individual bit fields |
| 719 | /// |
| 720 | struct { |
| 721 | UINT32 Reserved : 31; |
| 722 | /// |
| 723 | /// [Bit 31] If 0, then the cache descriptor bytes in the register are valid. |
| 724 | /// if 1, then none of the cache descriptor bytes in the register are valid. |
| 725 | /// |
| 726 | UINT32 NotValid : 1; |
| 727 | } Bits; |
| 728 | /// |
| 729 | /// Array of Cache and TLB descriptor bytes |
| 730 | /// |
| 731 | UINT8 CacheDescriptor[4]; |
| 732 | /// |
| 733 | /// All bit fields as a 32-bit value |
| 734 | /// |
| 735 | UINT32 Uint32; |
| 736 | } CPUID_CACHE_INFO_CACHE_TLB; |
| 737 | |
| 738 | /** |
| 739 | CPUID Processor Serial Number |
| 740 | |
| 741 | Processor serial number (PSN) is not supported in the Pentium 4 processor |
| 742 | or later. On all models, use the PSN flag (returned using CPUID) to check |
| 743 | for PSN support before accessing the feature. |
| 744 | |
| 745 | @param EAX CPUID_SERIAL_NUMBER (0x03) |
| 746 | |
| 747 | @retval EAX Reserved. |
| 748 | @retval EBX Reserved. |
| 749 | @retval ECX Bits 31:0 of 96 bit processor serial number. (Available in |
| 750 | Pentium III processor only; otherwise, the value in this |
| 751 | register is reserved.) |
| 752 | @retval EDX Bits 63:32 of 96 bit processor serial number. (Available in |
| 753 | Pentium III processor only; otherwise, the value in this |
| 754 | register is reserved.) |
| 755 | |
| 756 | <b>Example usage</b> |
| 757 | @code |
| 758 | UINT32 Ecx; |
| 759 | UINT32 Edx; |
| 760 | |
| 761 | AsmCpuid (CPUID_SERIAL_NUMBER, NULL, NULL, &Ecx, &Edx); |
| 762 | @endcode |
| 763 | **/ |
| 764 | #define CPUID_SERIAL_NUMBER 0x03 |
| 765 | |
| 766 | /** |
| 767 | CPUID Cache Parameters |
| 768 | |
| 769 | @param EAX CPUID_CACHE_PARAMS (0x04) |
| 770 | @param ECX Cache Level. Valid values start at 0. Software can enumerate |
| 771 | the deterministic cache parameters for each level of the cache |
| 772 | hierarchy starting with an index value of 0, until the |
| 773 | parameters report the value associated with the CacheType |
| 774 | field in CPUID_CACHE_PARAMS_EAX is 0. |
| 775 | |
| 776 | @retval EAX Returns cache type information described by the type |
| 777 | CPUID_CACHE_PARAMS_EAX. |
| 778 | @retval EBX Returns cache line and associativity information described by |
| 779 | the type CPUID_CACHE_PARAMS_EBX. |
| 780 | @retval ECX Returns the number of sets in the cache. |
| 781 | @retval EDX Returns cache WINVD/INVD behavior described by the type |
| 782 | CPUID_CACHE_PARAMS_EDX. |
| 783 | |
| 784 | <b>Example usage</b> |
| 785 | @code |
| 786 | UINT32 CacheLevel; |
| 787 | CPUID_CACHE_PARAMS_EAX Eax; |
| 788 | CPUID_CACHE_PARAMS_EBX Ebx; |
| 789 | UINT32 Ecx; |
| 790 | CPUID_CACHE_PARAMS_EDX Edx; |
| 791 | |
| 792 | CacheLevel = 0; |
| 793 | do { |
| 794 | AsmCpuidEx ( |
| 795 | CPUID_CACHE_PARAMS, CacheLevel, |
| 796 | &Eax.Uint32, &Ebx.Uint32, &Ecx, &Edx.Uint32 |
| 797 | ); |
| 798 | CacheLevel++; |
| 799 | } while (Eax.Bits.CacheType != CPUID_CACHE_PARAMS_CACHE_TYPE_NULL); |
| 800 | @endcode |
| 801 | **/ |
| 802 | #define CPUID_CACHE_PARAMS 0x04 |
| 803 | |
| 804 | /** |
| 805 | CPUID Cache Parameters Information returned in EAX for CPUID leaf |
| 806 | #CPUID_CACHE_PARAMS. |
| 807 | **/ |
| 808 | typedef union { |
| 809 | /// |
| 810 | /// Individual bit fields |
| 811 | /// |
| 812 | struct { |
| 813 | /// |
| 814 | /// [Bits 4:0] Cache type field. If #CPUID_CACHE_PARAMS_CACHE_TYPE_NULL, |
| 815 | /// then there is no information for the requested cache level. |
| 816 | /// |
| 817 | UINT32 CacheType : 5; |
| 818 | /// |
| 819 | /// [Bits 7:5] Cache level (Starts at 1). |
| 820 | /// |
| 821 | UINT32 CacheLevel : 3; |
| 822 | /// |
| 823 | /// [Bit 8] Self Initializing cache level (does not need SW initialization). |
| 824 | /// |
| 825 | UINT32 SelfInitializingCache : 1; |
| 826 | /// |
| 827 | /// [Bit 9] Fully Associative cache. |
| 828 | /// |
| 829 | UINT32 FullyAssociativeCache : 1; |
| 830 | /// |
| 831 | /// [Bits 13:10] Reserved. |
| 832 | /// |
| 833 | UINT32 Reserved : 4; |
| 834 | /// |
| 835 | /// [Bits 25:14] Maximum number of addressable IDs for logical processors |
| 836 | /// sharing this cache. |
| 837 | /// |
| 838 | /// Add one to the return value to get the result. |
| 839 | /// The nearest power-of-2 integer that is not smaller than (1 + EAX[25:14]) |
| 840 | /// is the number of unique initial APIC IDs reserved for addressing |
| 841 | /// different logical processors sharing this cache. |
| 842 | /// |
| 843 | UINT32 MaximumAddressableIdsForLogicalProcessors : 12; |
| 844 | /// |
| 845 | /// [Bits 31:26] Maximum number of addressable IDs for processor cores in |
| 846 | /// the physical package. |
| 847 | /// |
| 848 | /// The nearest power-of-2 integer that is not smaller than (1 + EAX[31:26]) |
| 849 | /// is the number of unique Core_IDs reserved for addressing different |
| 850 | /// processor cores in a physical package. Core ID is a subset of bits of |
| 851 | /// the initial APIC ID. |
| 852 | /// The returned value is constant for valid initial values in ECX. Valid |
| 853 | /// ECX values start from 0. |
| 854 | /// |
| 855 | UINT32 MaximumAddressableIdsForProcessorCores : 6; |
| 856 | } Bits; |
| 857 | /// |
| 858 | /// All bit fields as a 32-bit value |
| 859 | /// |
| 860 | UINT32 Uint32; |
| 861 | } CPUID_CACHE_PARAMS_EAX; |
| 862 | |
| 863 | /// |
| 864 | /// @{ Define value for bit field CPUID_CACHE_PARAMS_EAX.CacheType |
| 865 | /// |
| 866 | #define CPUID_CACHE_PARAMS_CACHE_TYPE_NULL 0x00 |
| 867 | #define CPUID_CACHE_PARAMS_CACHE_TYPE_DATA 0x01 |
| 868 | #define CPUID_CACHE_PARAMS_CACHE_TYPE_INSTRUCTION 0x02 |
| 869 | #define CPUID_CACHE_PARAMS_CACHE_TYPE_UNIFIED 0x03 |
| 870 | /// |
| 871 | /// @} |
| 872 | /// |
| 873 | |
| 874 | /** |
| 875 | CPUID Cache Parameters Information returned in EBX for CPUID leaf |
| 876 | #CPUID_CACHE_PARAMS. |
| 877 | **/ |
| 878 | typedef union { |
| 879 | /// |
| 880 | /// Individual bit fields |
| 881 | /// |
| 882 | struct { |
| 883 | /// |
| 884 | /// [Bits 11:0] System Coherency Line Size. Add one to the return value to |
| 885 | /// get the result. |
| 886 | /// |
| 887 | UINT32 LineSize : 12; |
| 888 | /// |
| 889 | /// [Bits 21:12] Physical Line Partitions. Add one to the return value to |
| 890 | /// get the result. |
| 891 | /// |
| 892 | UINT32 LinePartitions : 10; |
| 893 | /// |
| 894 | /// [Bits 31:22] Ways of associativity. Add one to the return value to get |
| 895 | /// the result. |
| 896 | /// |
| 897 | UINT32 Ways : 10; |
| 898 | } Bits; |
| 899 | /// |
| 900 | /// All bit fields as a 32-bit value |
| 901 | /// |
| 902 | UINT32 Uint32; |
| 903 | } CPUID_CACHE_PARAMS_EBX; |
| 904 | |
| 905 | /** |
| 906 | CPUID Cache Parameters Information returned in EDX for CPUID leaf |
| 907 | #CPUID_CACHE_PARAMS. |
| 908 | **/ |
| 909 | typedef union { |
| 910 | /// |
| 911 | /// Individual bit fields |
| 912 | /// |
| 913 | struct { |
| 914 | /// |
| 915 | /// [Bit 0] Write-Back Invalidate/Invalidate. |
| 916 | /// 0 = WBINVD/INVD from threads sharing this cache acts upon lower level |
| 917 | /// caches for threads sharing this cache. |
| 918 | /// 1 = WBINVD/INVD is not guaranteed to act upon lower level caches of |
| 919 | /// non-originating threads sharing this cache. |
| 920 | /// |
| 921 | UINT32 Invalidate : 1; |
| 922 | /// |
| 923 | /// [Bit 1] Cache Inclusiveness. |
| 924 | /// 0 = Cache is not inclusive of lower cache levels. |
| 925 | /// 1 = Cache is inclusive of lower cache levels. |
| 926 | /// |
| 927 | UINT32 CacheInclusiveness : 1; |
| 928 | /// |
| 929 | /// [Bit 2] Complex Cache Indexing. |
| 930 | /// 0 = Direct mapped cache. |
| 931 | /// 1 = A complex function is used to index the cache, potentially using all |
| 932 | /// address bits. |
| 933 | /// |
| 934 | UINT32 ComplexCacheIndexing : 1; |
| 935 | UINT32 Reserved : 29; |
| 936 | } Bits; |
| 937 | /// |
| 938 | /// All bit fields as a 32-bit value |
| 939 | /// |
| 940 | UINT32 Uint32; |
| 941 | } CPUID_CACHE_PARAMS_EDX; |
| 942 | |
| 943 | /** |
| 944 | CPUID MONITOR/MWAIT Information |
| 945 | |
| 946 | @param EAX CPUID_MONITOR_MWAIT (0x05) |
| 947 | |
| 948 | @retval EAX Smallest monitor-line size in bytes described by the type |
| 949 | CPUID_MONITOR_MWAIT_EAX. |
| 950 | @retval EBX Largest monitor-line size in bytes described by the type |
| 951 | CPUID_MONITOR_MWAIT_EBX. |
| 952 | @retval ECX Enumeration of Monitor-Mwait extensions support described by |
| 953 | the type CPUID_MONITOR_MWAIT_ECX. |
| 954 | @retval EDX Sub C-states supported described by the type |
| 955 | CPUID_MONITOR_MWAIT_EDX. |
| 956 | |
| 957 | <b>Example usage</b> |
| 958 | @code |
| 959 | CPUID_MONITOR_MWAIT_EAX Eax; |
| 960 | CPUID_MONITOR_MWAIT_EBX Ebx; |
| 961 | CPUID_MONITOR_MWAIT_ECX Ecx; |
| 962 | CPUID_MONITOR_MWAIT_EDX Edx; |
| 963 | |
| 964 | AsmCpuid (CPUID_MONITOR_MWAIT, &Eax.Uint32, &Ebx.Uint32, &Ecx.Uint32, &Edx.Uint32); |
| 965 | @endcode |
| 966 | **/ |
| 967 | #define CPUID_MONITOR_MWAIT 0x05 |
| 968 | |
| 969 | /** |
| 970 | CPUID MONITOR/MWAIT Information returned in EAX for CPUID leaf |
| 971 | #CPUID_MONITOR_MWAIT. |
| 972 | **/ |
| 973 | typedef union { |
| 974 | /// |
| 975 | /// Individual bit fields |
| 976 | /// |
| 977 | struct { |
| 978 | /// |
| 979 | /// [Bits 15:0] Smallest monitor-line size in bytes (default is processor's |
| 980 | /// monitor granularity). |
| 981 | /// |
| 982 | UINT32 SmallestMonitorLineSize : 16; |
| 983 | UINT32 Reserved : 16; |
| 984 | } Bits; |
| 985 | /// |
| 986 | /// All bit fields as a 32-bit value |
| 987 | /// |
| 988 | UINT32 Uint32; |
| 989 | } CPUID_MONITOR_MWAIT_EAX; |
| 990 | |
| 991 | /** |
| 992 | CPUID MONITOR/MWAIT Information returned in EBX for CPUID leaf |
| 993 | #CPUID_MONITOR_MWAIT. |
| 994 | **/ |
| 995 | typedef union { |
| 996 | /// |
| 997 | /// Individual bit fields |
| 998 | /// |
| 999 | struct { |
| 1000 | /// |
| 1001 | /// [Bits 15:0] Largest monitor-line size in bytes (default is processor's |
| 1002 | /// monitor granularity). |
| 1003 | /// |
| 1004 | UINT32 LargestMonitorLineSize : 16; |
| 1005 | UINT32 Reserved : 16; |
| 1006 | } Bits; |
| 1007 | /// |
| 1008 | /// All bit fields as a 32-bit value |
| 1009 | /// |
| 1010 | UINT32 Uint32; |
| 1011 | } CPUID_MONITOR_MWAIT_EBX; |
| 1012 | |
| 1013 | /** |
| 1014 | CPUID MONITOR/MWAIT Information returned in ECX for CPUID leaf |
| 1015 | #CPUID_MONITOR_MWAIT. |
| 1016 | **/ |
| 1017 | typedef union { |
| 1018 | /// |
| 1019 | /// Individual bit fields |
| 1020 | /// |
| 1021 | struct { |
| 1022 | /// |
| 1023 | /// [Bit 0] If 0, then only EAX and EBX are valid. If 1, then EAX, EBX, ECX, |
| 1024 | /// and EDX are valid. |
| 1025 | /// |
| 1026 | UINT32 ExtensionsSupported : 1; |
| 1027 | /// |
| 1028 | /// [Bit 1] Supports treating interrupts as break-event for MWAIT, even when |
| 1029 | /// interrupts disabled. |
| 1030 | /// |
| 1031 | UINT32 InterruptAsBreak : 1; |
| 1032 | UINT32 Reserved : 30; |
| 1033 | } Bits; |
| 1034 | /// |
| 1035 | /// All bit fields as a 32-bit value |
| 1036 | /// |
| 1037 | UINT32 Uint32; |
| 1038 | } CPUID_MONITOR_MWAIT_ECX; |
| 1039 | |
| 1040 | /** |
| 1041 | CPUID MONITOR/MWAIT Information returned in EDX for CPUID leaf |
| 1042 | #CPUID_MONITOR_MWAIT. |
| 1043 | |
| 1044 | @note |
| 1045 | The definition of C0 through C7 states for MWAIT extension are |
| 1046 | processor-specific C-states, not ACPI C-states. |
| 1047 | **/ |
| 1048 | typedef union { |
| 1049 | /// |
| 1050 | /// Individual bit fields |
| 1051 | /// |
| 1052 | struct { |
| 1053 | /// |
| 1054 | /// [Bits 3:0] Number of C0 sub C-states supported using MWAIT. |
| 1055 | /// |
| 1056 | UINT32 C0States : 4; |
| 1057 | /// |
| 1058 | /// [Bits 7:4] Number of C1 sub C-states supported using MWAIT. |
| 1059 | /// |
| 1060 | UINT32 C1States : 4; |
| 1061 | /// |
| 1062 | /// [Bits 11:8] Number of C2 sub C-states supported using MWAIT. |
| 1063 | /// |
| 1064 | UINT32 C2States : 4; |
| 1065 | /// |
| 1066 | /// [Bits 15:12] Number of C3 sub C-states supported using MWAIT. |
| 1067 | /// |
| 1068 | UINT32 C3States : 4; |
| 1069 | /// |
| 1070 | /// [Bits 19:16] Number of C4 sub C-states supported using MWAIT. |
| 1071 | /// |
| 1072 | UINT32 C4States : 4; |
| 1073 | /// |
| 1074 | /// [Bits 23:20] Number of C5 sub C-states supported using MWAIT. |
| 1075 | /// |
| 1076 | UINT32 C5States : 4; |
| 1077 | /// |
| 1078 | /// [Bits 27:24] Number of C6 sub C-states supported using MWAIT. |
| 1079 | /// |
| 1080 | UINT32 C6States : 4; |
| 1081 | /// |
| 1082 | /// [Bits 31:28] Number of C7 sub C-states supported using MWAIT. |
| 1083 | /// |
| 1084 | UINT32 C7States : 4; |
| 1085 | } Bits; |
| 1086 | /// |
| 1087 | /// All bit fields as a 32-bit value |
| 1088 | /// |
| 1089 | UINT32 Uint32; |
| 1090 | } CPUID_MONITOR_MWAIT_EDX; |
| 1091 | |
| 1092 | /** |
| 1093 | CPUID Thermal and Power Management |
| 1094 | |
| 1095 | @param EAX CPUID_THERMAL_POWER_MANAGEMENT (0x06) |
| 1096 | |
| 1097 | @retval EAX Thermal and power management features described by the type |
| 1098 | CPUID_THERMAL_POWER_MANAGEMENT_EAX. |
| 1099 | @retval EBX Number of Interrupt Thresholds in Digital Thermal Sensor |
| 1100 | described by the type CPUID_THERMAL_POWER_MANAGEMENT_EBX. |
| 1101 | @retval ECX Performance features described by the type |
| 1102 | CPUID_THERMAL_POWER_MANAGEMENT_ECX. |
| 1103 | @retval EDX Reserved. |
| 1104 | |
| 1105 | <b>Example usage</b> |
| 1106 | @code |
| 1107 | CPUID_THERMAL_POWER_MANAGEMENT_EAX Eax; |
| 1108 | CPUID_THERMAL_POWER_MANAGEMENT_EBX Ebx; |
| 1109 | CPUID_THERMAL_POWER_MANAGEMENT_ECX Ecx; |
| 1110 | |
| 1111 | AsmCpuid (CPUID_THERMAL_POWER_MANAGEMENT, &Eax.Uint32, &Ebx.Uint32, &Ecx.Uint32, NULL); |
| 1112 | @endcode |
| 1113 | **/ |
| 1114 | #define CPUID_THERMAL_POWER_MANAGEMENT 0x06 |
| 1115 | |
| 1116 | /** |
| 1117 | CPUID Thermal and Power Management Information returned in EAX for CPUID leaf |
| 1118 | #CPUID_THERMAL_POWER_MANAGEMENT. |
| 1119 | **/ |
| 1120 | typedef union { |
| 1121 | /// |
| 1122 | /// Individual bit fields |
| 1123 | /// |
| 1124 | struct { |
| 1125 | /// |
| 1126 | /// [Bit 0] Digital temperature sensor is supported if set. |
| 1127 | /// |
| 1128 | UINT32 DigitalTemperatureSensor : 1; |
| 1129 | /// |
| 1130 | /// [Bit 1] Intel Turbo Boost Technology Available (see IA32_MISC_ENABLE[38]). |
| 1131 | /// |
| 1132 | UINT32 TurboBoostTechnology : 1; |
| 1133 | /// |
| 1134 | /// [Bit 2] APIC-Timer-always-running feature is supported if set. |
| 1135 | /// |
| 1136 | UINT32 ARAT : 1; |
| 1137 | UINT32 Reserved1 : 1; |
| 1138 | /// |
| 1139 | /// [Bit 4] Power limit notification controls are supported if set. |
| 1140 | /// |
| 1141 | UINT32 PLN : 1; |
| 1142 | /// |
| 1143 | /// [Bit 5] Clock modulation duty cycle extension is supported if set. |
| 1144 | /// |
| 1145 | UINT32 ECMD : 1; |
| 1146 | /// |
| 1147 | /// [Bit 6] Package thermal management is supported if set. |
| 1148 | /// |
| 1149 | UINT32 PTM : 1; |
| 1150 | /// |
| 1151 | /// [Bit 7] HWP base registers (IA32_PM_ENABLE[Bit 0], IA32_HWP_CAPABILITIES, |
| 1152 | /// IA32_HWP_REQUEST, IA32_HWP_STATUS) are supported if set. |
| 1153 | /// |
| 1154 | UINT32 HWP : 1; |
| 1155 | /// |
| 1156 | /// [Bit 8] IA32_HWP_INTERRUPT MSR is supported if set. |
| 1157 | /// |
| 1158 | UINT32 HWP_Notification : 1; |
| 1159 | /// |
| 1160 | /// [Bit 9] IA32_HWP_REQUEST[Bits 41:32] is supported if set. |
| 1161 | /// |
| 1162 | UINT32 HWP_Activity_Window : 1; |
| 1163 | /// |
| 1164 | /// [Bit 10] IA32_HWP_REQUEST[Bits 31:24] is supported if set. |
| 1165 | /// |
| 1166 | UINT32 HWP_Energy_Performance_Preference : 1; |
| 1167 | /// |
| 1168 | /// [Bit 11] IA32_HWP_REQUEST_PKG MSR is supported if set. |
| 1169 | /// |
| 1170 | UINT32 HWP_Package_Level_Request : 1; |
| 1171 | UINT32 Reserved2 : 1; |
| 1172 | /// |
| 1173 | /// [Bit 13] HDC base registers IA32_PKG_HDC_CTL, IA32_PM_CTL1, |
| 1174 | /// IA32_THREAD_STALL MSRs are supported if set. |
| 1175 | /// |
| 1176 | UINT32 HDC : 1; |
| 1177 | /// |
| 1178 | /// [Bit 14] Intel Turbo Boost Max Technology 3.0 available. |
| 1179 | /// |
| 1180 | UINT32 TurboBoostMaxTechnology30 : 1; |
| 1181 | /// |
| 1182 | /// [Bit 15] HWP Capabilities. |
| 1183 | /// Highest Performance change is supported if set. |
| 1184 | /// |
| 1185 | UINT32 HWPCapabilities : 1; |
| 1186 | /// |
| 1187 | /// [Bit 16] HWP PECI override is supported if set. |
| 1188 | /// |
| 1189 | UINT32 HWPPECIOverride : 1; |
| 1190 | /// |
| 1191 | /// [Bit 17] Flexible HWP is supported if set. |
| 1192 | /// |
| 1193 | UINT32 FlexibleHWP : 1; |
| 1194 | /// |
| 1195 | /// [Bit 18] Fast access mode for the IA32_HWP_REQUEST MSR is supported if set. |
| 1196 | /// |
| 1197 | UINT32 FastAccessMode : 1; |
| 1198 | UINT32 Reserved4 : 1; |
| 1199 | /// |
| 1200 | /// [Bit 20] Ignoring Idle Logical Processor HWP request is supported if set. |
| 1201 | /// |
| 1202 | UINT32 IgnoringIdleLogicalProcessorHWPRequest : 1; |
| 1203 | UINT32 Reserved5 : 11; |
| 1204 | } Bits; |
| 1205 | /// |
| 1206 | /// All bit fields as a 32-bit value |
| 1207 | /// |
| 1208 | UINT32 Uint32; |
| 1209 | } CPUID_THERMAL_POWER_MANAGEMENT_EAX; |
| 1210 | |
| 1211 | /** |
| 1212 | CPUID Thermal and Power Management Information returned in EBX for CPUID leaf |
| 1213 | #CPUID_THERMAL_POWER_MANAGEMENT. |
| 1214 | **/ |
| 1215 | typedef union { |
| 1216 | /// |
| 1217 | /// Individual bit fields |
| 1218 | /// |
| 1219 | struct { |
| 1220 | /// |
| 1221 | /// {Bits 3:0] Number of Interrupt Thresholds in Digital Thermal Sensor. |
| 1222 | /// |
| 1223 | UINT32 InterruptThresholds : 4; |
| 1224 | UINT32 Reserved : 28; |
| 1225 | } Bits; |
| 1226 | /// |
| 1227 | /// All bit fields as a 32-bit value |
| 1228 | /// |
| 1229 | UINT32 Uint32; |
| 1230 | } CPUID_THERMAL_POWER_MANAGEMENT_EBX; |
| 1231 | |
| 1232 | /** |
| 1233 | CPUID Thermal and Power Management Information returned in ECX for CPUID leaf |
| 1234 | #CPUID_THERMAL_POWER_MANAGEMENT. |
| 1235 | **/ |
| 1236 | typedef union { |
| 1237 | /// |
| 1238 | /// Individual bit fields |
| 1239 | /// |
| 1240 | struct { |
| 1241 | /// |
| 1242 | /// [Bit 0] Hardware Coordination Feedback Capability (Presence of IA32_MPERF |
| 1243 | /// and IA32_APERF). The capability to provide a measure of delivered |
| 1244 | /// processor performance (since last reset of the counters), as a percentage |
| 1245 | /// of the expected processor performance when running at the TSC frequency. |
| 1246 | /// |
| 1247 | UINT32 HardwareCoordinationFeedback : 1; |
| 1248 | UINT32 Reserved1 : 2; |
| 1249 | /// |
| 1250 | /// [Bit 3] If this bit is set, then the processor supports performance-energy |
| 1251 | /// bias preference and the architectural MSR called IA32_ENERGY_PERF_BIAS |
| 1252 | /// (1B0H). |
| 1253 | /// |
| 1254 | UINT32 PerformanceEnergyBias : 1; |
| 1255 | UINT32 Reserved2 : 28; |
| 1256 | } Bits; |
| 1257 | /// |
| 1258 | /// All bit fields as a 32-bit value |
| 1259 | /// |
| 1260 | UINT32 Uint32; |
| 1261 | } CPUID_THERMAL_POWER_MANAGEMENT_ECX; |
| 1262 | |
| 1263 | /** |
| 1264 | CPUID Structured Extended Feature Flags Enumeration |
| 1265 | |
| 1266 | @param EAX CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS (0x07) |
| 1267 | @param ECX CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_SUB_LEAF_INFO (0x00). |
| 1268 | |
| 1269 | @note |
| 1270 | If ECX contains an invalid sub-leaf index, EAX/EBX/ECX/EDX return 0. Sub-leaf |
| 1271 | index n is invalid if n exceeds the value that sub-leaf 0 returns in EAX. |
| 1272 | |
| 1273 | @retval EAX The maximum input value for ECX to retrieve sub-leaf information. |
| 1274 | @retval EBX Structured Extended Feature Flags described by the type |
| 1275 | CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_EBX. |
| 1276 | @retval ECX Structured Extended Feature Flags described by the type |
| 1277 | CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_ECX. |
| 1278 | @retval EDX Reserved. |
| 1279 | |
| 1280 | <b>Example usage</b> |
| 1281 | @code |
| 1282 | UINT32 Eax; |
| 1283 | CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_EBX Ebx; |
| 1284 | CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_ECX Ecx; |
| 1285 | UINT32 SubLeaf; |
| 1286 | |
| 1287 | AsmCpuidEx ( |
| 1288 | CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS, |
| 1289 | CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_SUB_LEAF_INFO, |
| 1290 | &Eax, NULL, NULL, NULL |
| 1291 | ); |
| 1292 | for (SubLeaf = 0; SubLeaf <= Eax; SubLeaf++) { |
| 1293 | AsmCpuidEx ( |
| 1294 | CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS, |
| 1295 | SubLeaf, |
| 1296 | NULL, &Ebx.Uint32, &Ecx.Uint32, NULL |
| 1297 | ); |
| 1298 | } |
| 1299 | @endcode |
| 1300 | **/ |
| 1301 | #define CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS 0x07 |
| 1302 | |
| 1303 | /// |
| 1304 | /// CPUID Structured Extended Feature Flags Enumeration sub-leaf |
| 1305 | /// |
| 1306 | #define CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_SUB_LEAF_INFO 0x00 |
| 1307 | |
| 1308 | /** |
| 1309 | CPUID Structured Extended Feature Flags Enumeration in EBX for CPUID leaf |
| 1310 | #CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS sub leaf |
| 1311 | #CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_SUB_LEAF_INFO. |
| 1312 | **/ |
| 1313 | typedef union { |
| 1314 | /// |
| 1315 | /// Individual bit fields |
| 1316 | /// |
| 1317 | struct { |
| 1318 | /// |
| 1319 | /// [Bit 0] Supports RDFSBASE/RDGSBASE/WRFSBASE/WRGSBASE if 1. |
| 1320 | /// |
| 1321 | UINT32 FSGSBASE : 1; |
| 1322 | /// |
| 1323 | /// [Bit 1] IA32_TSC_ADJUST MSR is supported if 1. |
| 1324 | /// |
| 1325 | UINT32 IA32_TSC_ADJUST : 1; |
| 1326 | /// |
| 1327 | /// [Bit 2] Intel SGX is supported if 1. See section 37.7 "DISCOVERING SUPPORT |
| 1328 | /// FOR INTEL(R) SGX AND ENABLING ENCLAVE INSTRUCTIONS". |
| 1329 | /// |
| 1330 | UINT32 SGX : 1; |
| 1331 | /// |
| 1332 | /// [Bit 3] If 1 indicates the processor supports the first group of advanced |
| 1333 | /// bit manipulation extensions (ANDN, BEXTR, BLSI, BLSMSK, BLSR, TZCNT) |
| 1334 | /// |
| 1335 | UINT32 BMI1 : 1; |
| 1336 | /// |
| 1337 | /// [Bit 4] Hardware Lock Elision |
| 1338 | /// |
| 1339 | UINT32 HLE : 1; |
| 1340 | /// |
| 1341 | /// [Bit 5] If 1 indicates the processor supports AVX2 instruction extensions. |
| 1342 | /// |
| 1343 | UINT32 AVX2 : 1; |
| 1344 | /// |
| 1345 | /// [Bit 6] x87 FPU Data Pointer updated only on x87 exceptions if 1. |
| 1346 | /// |
| 1347 | UINT32 FDP_EXCPTN_ONLY : 1; |
| 1348 | /// |
| 1349 | /// [Bit 7] Supports Supervisor-Mode Execution Prevention if 1. |
| 1350 | /// |
| 1351 | UINT32 SMEP : 1; |
| 1352 | /// |
| 1353 | /// [Bit 8] If 1 indicates the processor supports the second group of |
| 1354 | /// advanced bit manipulation extensions (BZHI, MULX, PDEP, PEXT, RORX, |
| 1355 | /// SARX, SHLX, SHRX) |
| 1356 | /// |
| 1357 | UINT32 BMI2 : 1; |
| 1358 | /// |
| 1359 | /// [Bit 9] Supports Enhanced REP MOVSB/STOSB if 1. |
| 1360 | /// |
| 1361 | UINT32 EnhancedRepMovsbStosb : 1; |
| 1362 | /// |
| 1363 | /// [Bit 10] If 1, supports INVPCID instruction for system software that |
| 1364 | /// manages process-context identifiers. |
| 1365 | /// |
| 1366 | UINT32 INVPCID : 1; |
| 1367 | /// |
| 1368 | /// [Bit 11] Restricted Transactional Memory |
| 1369 | /// |
| 1370 | UINT32 RTM : 1; |
| 1371 | /// |
| 1372 | /// [Bit 12] Supports Intel(R) Resource Director Technology (Intel(R) RDT) |
| 1373 | /// Monitoring capability if 1. |
| 1374 | /// |
| 1375 | UINT32 RDT_M : 1; |
| 1376 | /// |
| 1377 | /// [Bit 13] Deprecates FPU CS and FPU DS values if 1. |
| 1378 | /// |
| 1379 | UINT32 DeprecateFpuCsDs : 1; |
| 1380 | /// |
| 1381 | /// [Bit 14] Supports Intel(R) Memory Protection Extensions if 1. |
| 1382 | /// |
| 1383 | UINT32 MPX : 1; |
| 1384 | /// |
| 1385 | /// [Bit 15] Supports Intel(R) Resource Director Technology (Intel(R) RDT) |
| 1386 | /// Allocation capability if 1. |
| 1387 | /// |
| 1388 | UINT32 RDT_A : 1; |
| 1389 | /// |
| 1390 | /// [Bit 16] AVX512F. |
| 1391 | /// |
| 1392 | UINT32 AVX512F : 1; |
| 1393 | /// |
| 1394 | /// [Bit 17] AVX512DQ. |
| 1395 | /// |
| 1396 | UINT32 AVX512DQ : 1; |
| 1397 | /// |
| 1398 | /// [Bit 18] If 1 indicates the processor supports the RDSEED instruction. |
| 1399 | /// |
| 1400 | UINT32 RDSEED : 1; |
| 1401 | /// |
| 1402 | /// [Bit 19] If 1 indicates the processor supports the ADCX and ADOX |
| 1403 | /// instructions. |
| 1404 | /// |
| 1405 | UINT32 ADX : 1; |
| 1406 | /// |
| 1407 | /// [Bit 20] Supports Supervisor-Mode Access Prevention (and the CLAC/STAC |
| 1408 | /// instructions) if 1. |
| 1409 | /// |
| 1410 | UINT32 SMAP : 1; |
| 1411 | /// |
| 1412 | /// [Bit 21] AVX512_IFMA. |
| 1413 | /// |
| 1414 | UINT32 AVX512_IFMA : 1; |
| 1415 | UINT32 Reserved6 : 1; |
| 1416 | /// |
| 1417 | /// [Bit 23] If 1 indicates the processor supports the CLFLUSHOPT instruction. |
| 1418 | /// |
| 1419 | UINT32 CLFLUSHOPT : 1; |
| 1420 | /// |
| 1421 | /// [Bit 24] If 1 indicates the processor supports the CLWB instruction. |
| 1422 | /// |
| 1423 | UINT32 CLWB : 1; |
| 1424 | /// |
| 1425 | /// [Bit 25] If 1 indicates the processor supports the Intel Processor Trace |
| 1426 | /// extensions. |
| 1427 | /// |
| 1428 | UINT32 IntelProcessorTrace : 1; |
| 1429 | /// |
| 1430 | /// [Bit 26] AVX512PF. (Intel Xeon Phi only.). |
| 1431 | /// |
| 1432 | UINT32 AVX512PF : 1; |
| 1433 | /// |
| 1434 | /// [Bit 27] AVX512ER. (Intel Xeon Phi only.). |
| 1435 | /// |
| 1436 | UINT32 AVX512ER : 1; |
| 1437 | /// |
| 1438 | /// [Bit 28] AVX512CD. |
| 1439 | /// |
| 1440 | UINT32 AVX512CD : 1; |
| 1441 | /// |
| 1442 | /// [Bit 29] Supports Intel(R) Secure Hash Algorithm Extensions (Intel(R) |
| 1443 | /// SHA Extensions) if 1. |
| 1444 | /// |
| 1445 | UINT32 SHA : 1; |
| 1446 | /// |
| 1447 | /// [Bit 30] AVX512BW. |
| 1448 | /// |
| 1449 | UINT32 AVX512BW : 1; |
| 1450 | /// |
| 1451 | /// [Bit 31] AVX512VL. |
| 1452 | /// |
| 1453 | UINT32 AVX512VL : 1; |
| 1454 | } Bits; |
| 1455 | /// |
| 1456 | /// All bit fields as a 32-bit value |
| 1457 | /// |
| 1458 | UINT32 Uint32; |
| 1459 | } CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_EBX; |
| 1460 | |
| 1461 | /** |
| 1462 | CPUID Structured Extended Feature Flags Enumeration in ECX for CPUID leaf |
| 1463 | #CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS sub leaf |
| 1464 | #CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_SUB_LEAF_INFO. |
| 1465 | **/ |
| 1466 | typedef union { |
| 1467 | /// |
| 1468 | /// Individual bit fields |
| 1469 | /// |
| 1470 | struct { |
| 1471 | /// |
| 1472 | /// [Bit 0] If 1 indicates the processor supports the PREFETCHWT1 instruction. |
| 1473 | /// (Intel Xeon Phi only.) |
| 1474 | /// |
| 1475 | UINT32 PREFETCHWT1 : 1; |
| 1476 | /// |
| 1477 | /// [Bit 1] AVX512_VBMI. |
| 1478 | /// |
| 1479 | UINT32 AVX512_VBMI : 1; |
| 1480 | /// |
| 1481 | /// [Bit 2] Supports user-mode instruction prevention if 1. |
| 1482 | /// |
| 1483 | UINT32 UMIP : 1; |
| 1484 | /// |
| 1485 | /// [Bit 3] Supports protection keys for user-mode pages if 1. |
| 1486 | /// |
| 1487 | UINT32 PKU : 1; |
| 1488 | /// |
| 1489 | /// [Bit 4] If 1, OS has set CR4.PKE to enable protection keys (and the |
| 1490 | /// RDPKRU/WRPKRU instructions). |
| 1491 | /// |
| 1492 | UINT32 OSPKE : 1; |
| 1493 | UINT32 Reserved5 : 9; |
| 1494 | /// |
| 1495 | /// [Bits 14] AVX512_VPOPCNTDQ. (Intel Xeon Phi only.). |
| 1496 | /// |
| 1497 | UINT32 AVX512_VPOPCNTDQ : 1; |
| 1498 | UINT32 Reserved7 : 1; |
| 1499 | /// |
| 1500 | /// [Bits 16] Supports 5-level paging if 1. |
| 1501 | /// |
| 1502 | UINT32 FiveLevelPage : 1; |
| 1503 | /// |
| 1504 | /// [Bits 21:17] The value of MAWAU used by the BNDLDX and BNDSTX instructions |
| 1505 | /// in 64-bit mode. |
| 1506 | /// |
| 1507 | UINT32 MAWAU : 5; |
| 1508 | /// |
| 1509 | /// [Bit 22] RDPID and IA32_TSC_AUX are available if 1. |
| 1510 | /// |
| 1511 | UINT32 RDPID : 1; |
| 1512 | UINT32 Reserved3 : 7; |
| 1513 | /// |
| 1514 | /// [Bit 30] Supports SGX Launch Configuration if 1. |
| 1515 | /// |
| 1516 | UINT32 SGX_LC : 1; |
| 1517 | UINT32 Reserved4 : 1; |
| 1518 | } Bits; |
| 1519 | /// |
| 1520 | /// All bit fields as a 32-bit value |
| 1521 | /// |
| 1522 | UINT32 Uint32; |
| 1523 | } CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_ECX; |
| 1524 | |
| 1525 | /** |
| 1526 | CPUID Structured Extended Feature Flags Enumeration in EDX for CPUID leaf |
| 1527 | #CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS sub leaf |
| 1528 | #CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_SUB_LEAF_INFO. |
| 1529 | **/ |
| 1530 | typedef union { |
| 1531 | /// |
| 1532 | /// Individual bit fields |
| 1533 | /// |
| 1534 | struct { |
| 1535 | /// |
| 1536 | /// [Bit 1:0] Reserved. |
| 1537 | /// |
| 1538 | UINT32 Reserved1 : 2; |
| 1539 | /// |
| 1540 | /// [Bit 2] AVX512_4VNNIW. (Intel Xeon Phi only.) |
| 1541 | /// |
| 1542 | UINT32 AVX512_4VNNIW : 1; |
| 1543 | /// |
| 1544 | /// [Bit 3] AVX512_4FMAPS. (Intel Xeon Phi only.) |
| 1545 | /// |
| 1546 | UINT32 AVX512_4FMAPS : 1; |
| 1547 | /// |
| 1548 | /// [Bit 14:4] Reserved. |
| 1549 | /// |
| 1550 | UINT32 Reserved4 : 11; |
| 1551 | /// |
| 1552 | /// [Bit 15] Hybrid. If 1, the processor is identified as a hybrid part. |
| 1553 | /// |
| 1554 | UINT32 Hybrid : 1; |
| 1555 | /// |
| 1556 | /// [Bit 25:16] Reserved. |
| 1557 | /// |
| 1558 | UINT32 Reserved5 : 10; |
| 1559 | /// |
| 1560 | /// [Bit 26] Enumerates support for indirect branch restricted speculation |
| 1561 | /// (IBRS) and the indirect branch pre-dictor barrier (IBPB). Processors |
| 1562 | /// that set this bit support the IA32_SPEC_CTRL MSR and the IA32_PRED_CMD |
| 1563 | /// MSR. They allow software to set IA32_SPEC_CTRL[0] (IBRS) and |
| 1564 | /// IA32_PRED_CMD[0] (IBPB). |
| 1565 | /// |
| 1566 | UINT32 EnumeratesSupportForIBRSAndIBPB : 1; |
| 1567 | /// |
| 1568 | /// [Bit 27] Enumerates support for single thread indirect branch |
| 1569 | /// predictors (STIBP). Processors that set this bit support the |
| 1570 | /// IA32_SPEC_CTRL MSR. They allow software to set IA32_SPEC_CTRL[1] |
| 1571 | /// (STIBP). |
| 1572 | /// |
| 1573 | UINT32 EnumeratesSupportForSTIBP : 1; |
| 1574 | /// |
| 1575 | /// [Bit 28] Enumerates support for L1D_FLUSH. Processors that set this bit |
| 1576 | /// support the IA32_FLUSH_CMD MSR. They allow software to set |
| 1577 | /// IA32_FLUSH_CMD[0] (L1D_FLUSH). |
| 1578 | /// |
| 1579 | UINT32 EnumeratesSupportForL1D_FLUSH : 1; |
| 1580 | /// |
| 1581 | /// [Bit 29] Enumerates support for the IA32_ARCH_CAPABILITIES MSR. |
| 1582 | /// |
| 1583 | UINT32 EnumeratesSupportForCapability : 1; |
| 1584 | /// |
| 1585 | /// [Bit 30] Enumerates support for the IA32_CORE_CAPABILITIES MSR. |
| 1586 | /// |
| 1587 | UINT32 EnumeratesSupportForCoreCapabilitiesMsr : 1; |
| 1588 | /// |
| 1589 | /// [Bit 31] Enumerates support for Speculative Store Bypass Disable (SSBD). |
| 1590 | /// Processors that set this bit sup-port the IA32_SPEC_CTRL MSR. They allow |
| 1591 | /// software to set IA32_SPEC_CTRL[2] (SSBD). |
| 1592 | /// |
| 1593 | UINT32 EnumeratesSupportForSSBD : 1; |
| 1594 | } Bits; |
| 1595 | /// |
| 1596 | /// All bit fields as a 32-bit value |
| 1597 | /// |
| 1598 | UINT32 Uint32; |
| 1599 | } CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_EDX; |
| 1600 | |
| 1601 | /** |
| 1602 | CPUID Direct Cache Access Information |
| 1603 | |
| 1604 | @param EAX CPUID_DIRECT_CACHE_ACCESS_INFO (0x09) |
| 1605 | |
| 1606 | @retval EAX Value of bits [31:0] of IA32_PLATFORM_DCA_CAP MSR (address 1F8H). |
| 1607 | @retval EBX Reserved. |
| 1608 | @retval ECX Reserved. |
| 1609 | @retval EDX Reserved. |
| 1610 | |
| 1611 | <b>Example usage</b> |
| 1612 | @code |
| 1613 | UINT32 Eax; |
| 1614 | |
| 1615 | AsmCpuid (CPUID_DIRECT_CACHE_ACCESS_INFO, &Eax, NULL, NULL, NULL); |
| 1616 | @endcode |
| 1617 | **/ |
| 1618 | #define CPUID_DIRECT_CACHE_ACCESS_INFO 0x09 |
| 1619 | |
| 1620 | /** |
| 1621 | CPUID Architectural Performance Monitoring |
| 1622 | |
| 1623 | @param EAX CPUID_ARCHITECTURAL_PERFORMANCE_MONITORING (0x0A) |
| 1624 | |
| 1625 | @retval EAX Architectural Performance Monitoring information described by |
| 1626 | the type CPUID_ARCHITECTURAL_PERFORMANCE_MONITORING_EAX. |
| 1627 | @retval EBX Architectural Performance Monitoring information described by |
| 1628 | the type CPUID_ARCHITECTURAL_PERFORMANCE_MONITORING_EBX. |
| 1629 | @retval ECX Reserved. |
| 1630 | @retval EDX Architectural Performance Monitoring information described by |
| 1631 | the type CPUID_ARCHITECTURAL_PERFORMANCE_MONITORING_EDX. |
| 1632 | |
| 1633 | <b>Example usage</b> |
| 1634 | @code |
| 1635 | CPUID_ARCHITECTURAL_PERFORMANCE_MONITORING_EAX Eax; |
| 1636 | CPUID_ARCHITECTURAL_PERFORMANCE_MONITORING_EBX Ebx; |
| 1637 | CPUID_ARCHITECTURAL_PERFORMANCE_MONITORING_EDX Edx; |
| 1638 | |
| 1639 | AsmCpuid (CPUID_ARCHITECTURAL_PERFORMANCE_MONITORING, &Eax.Uint32, &Ebx.Uint32, NULL, &Edx.Uint32); |
| 1640 | @endcode |
| 1641 | **/ |
| 1642 | #define CPUID_ARCHITECTURAL_PERFORMANCE_MONITORING 0x0A |
| 1643 | |
| 1644 | /** |
| 1645 | CPUID Architectural Performance Monitoring EAX for CPUID leaf |
| 1646 | #CPUID_ARCHITECTURAL_PERFORMANCE_MONITORING. |
| 1647 | **/ |
| 1648 | typedef union { |
| 1649 | /// |
| 1650 | /// Individual bit fields |
| 1651 | /// |
| 1652 | struct { |
| 1653 | /// |
| 1654 | /// [Bit 7:0] Version ID of architectural performance monitoring. |
| 1655 | /// |
| 1656 | UINT32 ArchPerfMonVerID : 8; |
| 1657 | /// |
| 1658 | /// [Bits 15:8] Number of general-purpose performance monitoring counter |
| 1659 | /// per logical processor. |
| 1660 | /// |
| 1661 | /// IA32_PERFEVTSELx MSRs start at address 186H and occupy a contiguous |
| 1662 | /// block of MSR address space. Each performance event select register is |
| 1663 | /// paired with a corresponding performance counter in the 0C1H address |
| 1664 | /// block. |
| 1665 | /// |
| 1666 | UINT32 PerformanceMonitorCounters : 8; |
| 1667 | /// |
| 1668 | /// [Bits 23:16] Bit width of general-purpose, performance monitoring counter. |
| 1669 | /// |
| 1670 | /// The bit width of an IA32_PMCx MSR. This the number of valid bits for |
| 1671 | /// read operation. On write operations, the lower-order 32 bits of the MSR |
| 1672 | /// may be written with any value, and the high-order bits are sign-extended |
| 1673 | /// from the value of bit 31. |
| 1674 | /// |
| 1675 | UINT32 PerformanceMonitorCounterWidth : 8; |
| 1676 | /// |
| 1677 | /// [Bits 31:24] Length of EBX bit vector to enumerate architectural |
| 1678 | /// performance monitoring events. |
| 1679 | /// |
| 1680 | UINT32 EbxBitVectorLength : 8; |
| 1681 | } Bits; |
| 1682 | /// |
| 1683 | /// All bit fields as a 32-bit value |
| 1684 | /// |
| 1685 | UINT32 Uint32; |
| 1686 | } CPUID_ARCHITECTURAL_PERFORMANCE_MONITORING_EAX; |
| 1687 | |
| 1688 | /** |
| 1689 | CPUID Architectural Performance Monitoring EBX for CPUID leaf |
| 1690 | #CPUID_ARCHITECTURAL_PERFORMANCE_MONITORING. |
| 1691 | **/ |
| 1692 | typedef union { |
| 1693 | /// |
| 1694 | /// Individual bit fields |
| 1695 | /// |
| 1696 | struct { |
| 1697 | /// |
| 1698 | /// [Bit 0] Core cycle event not available if 1. |
| 1699 | /// |
| 1700 | UINT32 UnhaltedCoreCycles : 1; |
| 1701 | /// |
| 1702 | /// [Bit 1] Instruction retired event not available if 1. |
| 1703 | /// |
| 1704 | UINT32 InstructionsRetired : 1; |
| 1705 | /// |
| 1706 | /// [Bit 2] Reference cycles event not available if 1. |
| 1707 | /// |
| 1708 | UINT32 UnhaltedReferenceCycles : 1; |
| 1709 | /// |
| 1710 | /// [Bit 3] Last-level cache reference event not available if 1. |
| 1711 | /// |
| 1712 | UINT32 LastLevelCacheReferences : 1; |
| 1713 | /// |
| 1714 | /// [Bit 4] Last-level cache misses event not available if 1. |
| 1715 | /// |
| 1716 | UINT32 LastLevelCacheMisses : 1; |
| 1717 | /// |
| 1718 | /// [Bit 5] Branch instruction retired event not available if 1. |
| 1719 | /// |
| 1720 | UINT32 BranchInstructionsRetired : 1; |
| 1721 | /// |
| 1722 | /// [Bit 6] Branch mispredict retired event not available if 1. |
| 1723 | /// |
| 1724 | UINT32 AllBranchMispredictRetired : 1; |
| 1725 | UINT32 Reserved : 25; |
| 1726 | } Bits; |
| 1727 | /// |
| 1728 | /// All bit fields as a 32-bit value |
| 1729 | /// |
| 1730 | UINT32 Uint32; |
| 1731 | } CPUID_ARCHITECTURAL_PERFORMANCE_MONITORING_EBX; |
| 1732 | |
| 1733 | /** |
| 1734 | CPUID Architectural Performance Monitoring EDX for CPUID leaf |
| 1735 | #CPUID_ARCHITECTURAL_PERFORMANCE_MONITORING. |
| 1736 | **/ |
| 1737 | typedef union { |
| 1738 | /// |
| 1739 | /// Individual bit fields |
| 1740 | /// |
| 1741 | struct { |
| 1742 | /// |
| 1743 | /// [Bits 4:0] Number of fixed-function performance counters |
| 1744 | /// (if Version ID > 1). |
| 1745 | /// |
| 1746 | UINT32 FixedFunctionPerformanceCounters : 5; |
| 1747 | /// |
| 1748 | /// [Bits 12:5] Bit width of fixed-function performance counters |
| 1749 | /// (if Version ID > 1). |
| 1750 | /// |
| 1751 | UINT32 FixedFunctionPerformanceCounterWidth : 8; |
| 1752 | UINT32 Reserved1 : 2; |
| 1753 | /// |
| 1754 | /// [Bits 15] AnyThread deprecation. |
| 1755 | /// |
| 1756 | UINT32 AnyThreadDeprecation : 1; |
| 1757 | UINT32 Reserved2 : 16; |
| 1758 | } Bits; |
| 1759 | /// |
| 1760 | /// All bit fields as a 32-bit value |
| 1761 | /// |
| 1762 | UINT32 Uint32; |
| 1763 | } CPUID_ARCHITECTURAL_PERFORMANCE_MONITORING_EDX; |
| 1764 | |
| 1765 | /** |
| 1766 | CPUID Extended Topology Information |
| 1767 | |
| 1768 | @note |
| 1769 | CPUID leaf 1FH is a preferred superset to leaf 0BH. Intel recommends first |
| 1770 | checking for the existence of Leaf 1FH before using leaf 0BH. |
| 1771 | Most of Leaf 0BH output depends on the initial value in ECX. The EDX output |
| 1772 | of leaf 0BH is always valid and does not vary with input value in ECX. Output |
| 1773 | value in ECX[7:0] always equals input value in ECX[7:0]. |
| 1774 | Sub-leaf index 0 enumerates SMT level. Each subsequent higher sub-leaf index |
| 1775 | enumerates a higher-level topological entity in hierarchical order. |
| 1776 | For sub-leaves that return an invalid level-type of 0 in ECX[15:8]; EAX and |
| 1777 | EBX will return 0. |
| 1778 | If an input value n in ECX returns the invalid level-type of 0 in ECX[15:8], |
| 1779 | other input values with ECX > n also return 0 in ECX[15:8]. |
| 1780 | |
| 1781 | @param EAX CPUID_EXTENDED_TOPOLOGY (0x0B) |
| 1782 | @param ECX Level number |
| 1783 | |
| 1784 | @retval EAX Extended topology information described by the type |
| 1785 | CPUID_EXTENDED_TOPOLOGY_EAX. |
| 1786 | @retval EBX Extended topology information described by the type |
| 1787 | CPUID_EXTENDED_TOPOLOGY_EBX. |
| 1788 | @retval ECX Extended topology information described by the type |
| 1789 | CPUID_EXTENDED_TOPOLOGY_ECX. |
| 1790 | @retval EDX x2APIC ID the current logical processor. |
| 1791 | |
| 1792 | <b>Example usage</b> |
| 1793 | @code |
| 1794 | CPUID_EXTENDED_TOPOLOGY_EAX Eax; |
| 1795 | CPUID_EXTENDED_TOPOLOGY_EBX Ebx; |
| 1796 | CPUID_EXTENDED_TOPOLOGY_ECX Ecx; |
| 1797 | UINT32 Edx; |
| 1798 | UINT32 LevelNumber; |
| 1799 | |
| 1800 | LevelNumber = 0; |
| 1801 | do { |
| 1802 | AsmCpuidEx ( |
| 1803 | CPUID_EXTENDED_TOPOLOGY, LevelNumber, |
| 1804 | &Eax.Uint32, &Ebx.Uint32, &Ecx.Uint32, &Edx |
| 1805 | ); |
| 1806 | LevelNumber++; |
| 1807 | } while (Eax.Bits.ApicIdShift != 0); |
| 1808 | @endcode |
| 1809 | **/ |
| 1810 | #define CPUID_EXTENDED_TOPOLOGY 0x0B |
| 1811 | |
| 1812 | /** |
| 1813 | CPUID Extended Topology Information EAX for CPUID leaf #CPUID_EXTENDED_TOPOLOGY. |
| 1814 | **/ |
| 1815 | typedef union { |
| 1816 | /// |
| 1817 | /// Individual bit fields |
| 1818 | /// |
| 1819 | struct { |
| 1820 | /// |
| 1821 | /// [Bits 4:0] Number of bits to shift right on x2APIC ID to get a unique |
| 1822 | /// topology ID of the next level type. All logical processors with the |
| 1823 | /// same next level ID share current level. |
| 1824 | /// |
| 1825 | /// @note |
| 1826 | /// Software should use this field (EAX[4:0]) to enumerate processor |
| 1827 | /// topology of the system. |
| 1828 | /// |
| 1829 | UINT32 ApicIdShift : 5; |
| 1830 | UINT32 Reserved : 27; |
| 1831 | } Bits; |
| 1832 | /// |
| 1833 | /// All bit fields as a 32-bit value |
| 1834 | /// |
| 1835 | UINT32 Uint32; |
| 1836 | } CPUID_EXTENDED_TOPOLOGY_EAX; |
| 1837 | |
| 1838 | /** |
| 1839 | CPUID Extended Topology Information EBX for CPUID leaf #CPUID_EXTENDED_TOPOLOGY. |
| 1840 | **/ |
| 1841 | typedef union { |
| 1842 | /// |
| 1843 | /// Individual bit fields |
| 1844 | /// |
| 1845 | struct { |
| 1846 | /// |
| 1847 | /// [Bits 15:0] Number of logical processors at this level type. The number |
| 1848 | /// reflects configuration as shipped by Intel. |
| 1849 | /// |
| 1850 | /// @note |
| 1851 | /// Software must not use EBX[15:0] to enumerate processor topology of the |
| 1852 | /// system. This value in this field (EBX[15:0]) is only intended for |
| 1853 | /// display/diagnostic purposes. The actual number of logical processors |
| 1854 | /// available to BIOS/OS/Applications may be different from the value of |
| 1855 | /// EBX[15:0], depending on software and platform hardware configurations. |
| 1856 | /// |
| 1857 | UINT32 LogicalProcessors : 16; |
| 1858 | UINT32 Reserved : 16; |
| 1859 | } Bits; |
| 1860 | /// |
| 1861 | /// All bit fields as a 32-bit value |
| 1862 | /// |
| 1863 | UINT32 Uint32; |
| 1864 | } CPUID_EXTENDED_TOPOLOGY_EBX; |
| 1865 | |
| 1866 | /** |
| 1867 | CPUID Extended Topology Information ECX for CPUID leaf #CPUID_EXTENDED_TOPOLOGY. |
| 1868 | **/ |
| 1869 | typedef union { |
| 1870 | /// |
| 1871 | /// Individual bit fields |
| 1872 | /// |
| 1873 | struct { |
| 1874 | /// |
| 1875 | /// [Bits 7:0] Level number. Same value in ECX input. |
| 1876 | /// |
| 1877 | UINT32 LevelNumber : 8; |
| 1878 | /// |
| 1879 | /// [Bits 15:8] Level type. |
| 1880 | /// |
| 1881 | /// @note |
| 1882 | /// The value of the "level type" field is not related to level numbers in |
| 1883 | /// any way, higher "level type" values do not mean higher levels. |
| 1884 | /// |
| 1885 | UINT32 LevelType : 8; |
| 1886 | UINT32 Reserved : 16; |
| 1887 | } Bits; |
| 1888 | /// |
| 1889 | /// All bit fields as a 32-bit value |
| 1890 | /// |
| 1891 | UINT32 Uint32; |
| 1892 | } CPUID_EXTENDED_TOPOLOGY_ECX; |
| 1893 | |
| 1894 | /// |
| 1895 | /// @{ Define value for CPUID_EXTENDED_TOPOLOGY_ECX.LevelType |
| 1896 | /// |
| 1897 | #define CPUID_EXTENDED_TOPOLOGY_LEVEL_TYPE_INVALID 0x00 |
| 1898 | #define CPUID_EXTENDED_TOPOLOGY_LEVEL_TYPE_SMT 0x01 |
| 1899 | #define CPUID_EXTENDED_TOPOLOGY_LEVEL_TYPE_CORE 0x02 |
| 1900 | /// |
| 1901 | /// @} |
| 1902 | /// |
| 1903 | |
| 1904 | /** |
| 1905 | CPUID Extended State Information |
| 1906 | |
| 1907 | @param EAX CPUID_EXTENDED_STATE (0x0D) |
| 1908 | @param ECX CPUID_EXTENDED_STATE_MAIN_LEAF (0x00). |
| 1909 | CPUID_EXTENDED_STATE_SUB_LEAF (0x01). |
| 1910 | CPUID_EXTENDED_STATE_SIZE_OFFSET (0x02). |
| 1911 | Sub leafs 2..n based on supported bits in XCR0 or IA32_XSS_MSR. |
| 1912 | **/ |
| 1913 | #define CPUID_EXTENDED_STATE 0x0D |
| 1914 | |
| 1915 | /** |
| 1916 | CPUID Extended State Information Main Leaf |
| 1917 | |
| 1918 | @param EAX CPUID_EXTENDED_STATE (0x0D) |
| 1919 | @param ECX CPUID_EXTENDED_STATE_MAIN_LEAF (0x00) |
| 1920 | |
| 1921 | @retval EAX Reports the supported bits of the lower 32 bits of XCR0. XCR0[n] |
| 1922 | can be set to 1 only if EAX[n] is 1. The format of the extended |
| 1923 | state main leaf is described by the type |
| 1924 | CPUID_EXTENDED_STATE_MAIN_LEAF_EAX. |
| 1925 | @retval EBX Maximum size (bytes, from the beginning of the XSAVE/XRSTOR save |
| 1926 | area) required by enabled features in XCR0. May be different than |
| 1927 | ECX if some features at the end of the XSAVE save area are not |
| 1928 | enabled. |
| 1929 | @retval ECX Maximum size (bytes, from the beginning of the XSAVE/XRSTOR save |
| 1930 | area) of the XSAVE/XRSTOR save area required by all supported |
| 1931 | features in the processor, i.e., all the valid bit fields in XCR0. |
| 1932 | @retval EDX Reports the supported bits of the upper 32 bits of XCR0. |
| 1933 | XCR0[n+32] can be set to 1 only if EDX[n] is 1. |
| 1934 | |
| 1935 | <b>Example usage</b> |
| 1936 | @code |
| 1937 | CPUID_EXTENDED_STATE_MAIN_LEAF_EAX Eax; |
| 1938 | UINT32 Ebx; |
| 1939 | UINT32 Ecx; |
| 1940 | UINT32 Edx; |
| 1941 | |
| 1942 | AsmCpuidEx ( |
| 1943 | CPUID_EXTENDED_STATE, CPUID_EXTENDED_STATE_MAIN_LEAF, |
| 1944 | &Eax.Uint32, &Ebx, &Ecx, &Edx |
| 1945 | ); |
| 1946 | @endcode |
| 1947 | **/ |
| 1948 | #define CPUID_EXTENDED_STATE_MAIN_LEAF 0x00 |
| 1949 | |
| 1950 | /** |
| 1951 | CPUID Extended State Information EAX for CPUID leaf #CPUID_EXTENDED_STATE, |
| 1952 | sub-leaf #CPUID_EXTENDED_STATE_MAIN_LEAF. |
| 1953 | **/ |
| 1954 | typedef union { |
| 1955 | /// |
| 1956 | /// Individual bit fields |
| 1957 | /// |
| 1958 | struct { |
| 1959 | /// |
| 1960 | /// [Bit 0] x87 state. |
| 1961 | /// |
| 1962 | UINT32 x87 : 1; |
| 1963 | /// |
| 1964 | /// [Bit 1] SSE state. |
| 1965 | /// |
| 1966 | UINT32 SSE : 1; |
| 1967 | /// |
| 1968 | /// [Bit 2] AVX state. |
| 1969 | /// |
| 1970 | UINT32 AVX : 1; |
| 1971 | /// |
| 1972 | /// [Bits 4:3] MPX state. |
| 1973 | /// |
| 1974 | UINT32 MPX : 2; |
| 1975 | /// |
| 1976 | /// [Bits 7:5] AVX-512 state. |
| 1977 | /// |
| 1978 | UINT32 AVX_512 : 3; |
| 1979 | /// |
| 1980 | /// [Bit 8] Used for IA32_XSS. |
| 1981 | /// |
| 1982 | UINT32 IA32_XSS : 1; |
| 1983 | /// |
| 1984 | /// [Bit 9] PKRU state. |
| 1985 | /// |
| 1986 | UINT32 PKRU : 1; |
| 1987 | UINT32 Reserved1 : 3; |
| 1988 | /// |
| 1989 | /// [Bit 13] Used for IA32_XSS, part 2. |
| 1990 | /// |
| 1991 | UINT32 IA32_XSS_2 : 1; |
| 1992 | UINT32 Reserved2 : 18; |
| 1993 | } Bits; |
| 1994 | /// |
| 1995 | /// All bit fields as a 32-bit value |
| 1996 | /// |
| 1997 | UINT32 Uint32; |
| 1998 | } CPUID_EXTENDED_STATE_MAIN_LEAF_EAX; |
| 1999 | |
| 2000 | /** |
| 2001 | CPUID Extended State Information Sub Leaf |
| 2002 | |
| 2003 | @param EAX CPUID_EXTENDED_STATE (0x0D) |
| 2004 | @param ECX CPUID_EXTENDED_STATE_SUB_LEAF (0x01) |
| 2005 | |
| 2006 | @retval EAX The format of the extended state sub-leaf is described by the |
| 2007 | type CPUID_EXTENDED_STATE_SUB_LEAF_EAX. |
| 2008 | @retval EBX The size in bytes of the XSAVE area containing all states |
| 2009 | enabled by XCRO | IA32_XSS. |
| 2010 | @retval ECX The format of the extended state sub-leaf is described by the |
| 2011 | type CPUID_EXTENDED_STATE_SUB_LEAF_ECX. |
| 2012 | @retval EDX Reports the supported bits of the upper 32 bits of the |
| 2013 | IA32_XSS MSR. IA32_XSS[n+32] can be set to 1 only if EDX[n] is 1. |
| 2014 | |
| 2015 | <b>Example usage</b> |
| 2016 | @code |
| 2017 | CPUID_EXTENDED_STATE_SUB_LEAF_EAX Eax; |
| 2018 | UINT32 Ebx; |
| 2019 | CPUID_EXTENDED_STATE_SUB_LEAF_ECX Ecx; |
| 2020 | UINT32 Edx; |
| 2021 | |
| 2022 | AsmCpuidEx ( |
| 2023 | CPUID_EXTENDED_STATE, CPUID_EXTENDED_STATE_SUB_LEAF, |
| 2024 | &Eax.Uint32, &Ebx, &Ecx.Uint32, &Edx |
| 2025 | ); |
| 2026 | @endcode |
| 2027 | **/ |
| 2028 | #define CPUID_EXTENDED_STATE_SUB_LEAF 0x01 |
| 2029 | |
| 2030 | /** |
| 2031 | CPUID Extended State Information EAX for CPUID leaf #CPUID_EXTENDED_STATE, |
| 2032 | sub-leaf #CPUID_EXTENDED_STATE_SUB_LEAF. |
| 2033 | **/ |
| 2034 | typedef union { |
| 2035 | /// |
| 2036 | /// Individual bit fields |
| 2037 | /// |
| 2038 | struct { |
| 2039 | /// |
| 2040 | /// [Bit 0] XSAVEOPT is available. |
| 2041 | /// |
| 2042 | UINT32 XSAVEOPT : 1; |
| 2043 | /// |
| 2044 | /// [Bit 1] Supports XSAVEC and the compacted form of XRSTOR if set. |
| 2045 | /// |
| 2046 | UINT32 XSAVEC : 1; |
| 2047 | /// |
| 2048 | /// [Bit 2] Supports XGETBV with ECX = 1 if set. |
| 2049 | /// |
| 2050 | UINT32 XGETBV : 1; |
| 2051 | /// |
| 2052 | /// [Bit 3] Supports XSAVES/XRSTORS and IA32_XSS if set. |
| 2053 | /// |
| 2054 | UINT32 XSAVES : 1; |
| 2055 | UINT32 Reserved : 28; |
| 2056 | } Bits; |
| 2057 | /// |
| 2058 | /// All bit fields as a 32-bit value |
| 2059 | /// |
| 2060 | UINT32 Uint32; |
| 2061 | } CPUID_EXTENDED_STATE_SUB_LEAF_EAX; |
| 2062 | |
| 2063 | /** |
| 2064 | CPUID Extended State Information ECX for CPUID leaf #CPUID_EXTENDED_STATE, |
| 2065 | sub-leaf #CPUID_EXTENDED_STATE_SUB_LEAF. |
| 2066 | **/ |
| 2067 | typedef union { |
| 2068 | /// |
| 2069 | /// Individual bit fields |
| 2070 | /// |
| 2071 | struct { |
| 2072 | /// |
| 2073 | /// [Bits 7:0] Used for XCR0. |
| 2074 | /// |
| 2075 | UINT32 XCR0 : 1; |
| 2076 | /// |
| 2077 | /// [Bit 8] PT STate. |
| 2078 | /// |
| 2079 | UINT32 PT : 1; |
| 2080 | /// |
| 2081 | /// [Bit 9] Used for XCR0. |
| 2082 | /// |
| 2083 | UINT32 XCR0_1 : 1; |
| 2084 | UINT32 Reserved1 : 3; |
| 2085 | /// |
| 2086 | /// [Bit 13] HWP state. |
| 2087 | /// |
| 2088 | UINT32 HWPState : 1; |
| 2089 | UINT32 Reserved8 : 18; |
| 2090 | } Bits; |
| 2091 | /// |
| 2092 | /// All bit fields as a 32-bit value |
| 2093 | /// |
| 2094 | UINT32 Uint32; |
| 2095 | } CPUID_EXTENDED_STATE_SUB_LEAF_ECX; |
| 2096 | |
| 2097 | /** |
| 2098 | CPUID Extended State Information Size and Offset Sub Leaf |
| 2099 | |
| 2100 | @note |
| 2101 | Leaf 0DH output depends on the initial value in ECX. |
| 2102 | Each sub-leaf index (starting at position 2) is supported if it corresponds to |
| 2103 | a supported bit in either the XCR0 register or the IA32_XSS MSR. |
| 2104 | If ECX contains an invalid sub-leaf index, EAX/EBX/ECX/EDX return 0. Sub-leaf |
| 2105 | n (0 <= n <= 31) is invalid if sub-leaf 0 returns 0 in EAX[n] and sub-leaf 1 |
| 2106 | returns 0 in ECX[n]. Sub-leaf n (32 <= n <= 63) is invalid if sub-leaf 0 |
| 2107 | returns 0 in EDX[n-32] and sub-leaf 1 returns 0 in EDX[n-32]. |
| 2108 | |
| 2109 | @param EAX CPUID_EXTENDED_STATE (0x0D) |
| 2110 | @param ECX CPUID_EXTENDED_STATE_SIZE_OFFSET (0x02). Sub leafs 2..n based |
| 2111 | on supported bits in XCR0 or IA32_XSS_MSR. |
| 2112 | |
| 2113 | @retval EAX The size in bytes (from the offset specified in EBX) of the save |
| 2114 | area for an extended state feature associated with a valid |
| 2115 | sub-leaf index, n. |
| 2116 | @retval EBX The offset in bytes of this extended state component's save area |
| 2117 | from the beginning of the XSAVE/XRSTOR area. This field reports |
| 2118 | 0 if the sub-leaf index, n, does not map to a valid bit in the |
| 2119 | XCR0 register. |
| 2120 | @retval ECX The format of the extended state components's save area as |
| 2121 | described by the type CPUID_EXTENDED_STATE_SIZE_OFFSET_ECX. |
| 2122 | This field reports 0 if the sub-leaf index, n, is invalid. |
| 2123 | @retval EDX This field reports 0 if the sub-leaf index, n, is invalid; |
| 2124 | otherwise it is reserved. |
| 2125 | |
| 2126 | <b>Example usage</b> |
| 2127 | @code |
| 2128 | UINT32 Eax; |
| 2129 | UINT32 Ebx; |
| 2130 | CPUID_EXTENDED_STATE_SIZE_OFFSET_ECX Ecx; |
| 2131 | UINT32 Edx; |
| 2132 | UINTN SubLeaf; |
| 2133 | |
| 2134 | for (SubLeaf = CPUID_EXTENDED_STATE_SIZE_OFFSET; SubLeaf < 32; SubLeaf++) { |
| 2135 | AsmCpuidEx ( |
| 2136 | CPUID_EXTENDED_STATE, SubLeaf, |
| 2137 | &Eax, &Ebx, &Ecx.Uint32, &Edx |
| 2138 | ); |
| 2139 | } |
| 2140 | @endcode |
| 2141 | **/ |
| 2142 | #define CPUID_EXTENDED_STATE_SIZE_OFFSET 0x02 |
| 2143 | |
| 2144 | /** |
| 2145 | CPUID Extended State Information ECX for CPUID leaf #CPUID_EXTENDED_STATE, |
| 2146 | sub-leaf #CPUID_EXTENDED_STATE_SIZE_OFFSET. |
| 2147 | **/ |
| 2148 | typedef union { |
| 2149 | /// |
| 2150 | /// Individual bit fields |
| 2151 | /// |
| 2152 | struct { |
| 2153 | /// |
| 2154 | /// [Bit 0] Is set if the bit n (corresponding to the sub-leaf index) is |
| 2155 | /// supported in the IA32_XSS MSR; it is clear if bit n is instead supported |
| 2156 | /// in XCR0. |
| 2157 | /// |
| 2158 | UINT32 XSS : 1; |
| 2159 | /// |
| 2160 | /// [Bit 1] is set if, when the compacted format of an XSAVE area is used, |
| 2161 | /// this extended state component located on the next 64-byte boundary |
| 2162 | /// following the preceding state component (otherwise, it is located |
| 2163 | /// immediately following the preceding state component). |
| 2164 | /// |
| 2165 | UINT32 Compacted : 1; |
| 2166 | UINT32 Reserved : 30; |
| 2167 | } Bits; |
| 2168 | /// |
| 2169 | /// All bit fields as a 32-bit value |
| 2170 | /// |
| 2171 | UINT32 Uint32; |
| 2172 | } CPUID_EXTENDED_STATE_SIZE_OFFSET_ECX; |
| 2173 | |
| 2174 | /** |
| 2175 | CPUID Intel Resource Director Technology (Intel RDT) Monitoring Information |
| 2176 | |
| 2177 | @param EAX CPUID_INTEL_RDT_MONITORING (0x0F) |
| 2178 | @param ECX CPUID_INTEL_RDT_MONITORING_ENUMERATION_SUB_LEAF (0x00). |
| 2179 | CPUID_INTEL_RDT_MONITORING_L3_CACHE_SUB_LEAF (0x01). |
| 2180 | |
| 2181 | **/ |
| 2182 | #define CPUID_INTEL_RDT_MONITORING 0x0F |
| 2183 | |
| 2184 | /** |
| 2185 | CPUID Intel Resource Director Technology (Intel RDT) Monitoring Information |
| 2186 | Enumeration Sub-leaf |
| 2187 | |
| 2188 | @param EAX CPUID_INTEL_RDT_MONITORING (0x0F) |
| 2189 | @param ECX CPUID_INTEL_RDT_MONITORING_ENUMERATION_SUB_LEAF (0x00) |
| 2190 | |
| 2191 | @retval EAX Reserved. |
| 2192 | @retval EBX Maximum range (zero-based) of RMID within this physical |
| 2193 | processor of all types. |
| 2194 | @retval ECX Reserved. |
| 2195 | @retval EDX L3 Cache Intel RDT Monitoring Information Enumeration described by |
| 2196 | the type CPUID_INTEL_RDT_MONITORING_ENUMERATION_SUB_LEAF_EDX. |
| 2197 | |
| 2198 | <b>Example usage</b> |
| 2199 | @code |
| 2200 | UINT32 Ebx; |
| 2201 | CPUID_INTEL_RDT_MONITORING_ENUMERATION_SUB_LEAF_EDX Edx; |
| 2202 | |
| 2203 | AsmCpuidEx ( |
| 2204 | CPUID_INTEL_RDT_MONITORING, CPUID_INTEL_RDT_MONITORING_ENUMERATION_SUB_LEAF, |
| 2205 | NULL, &Ebx, NULL, &Edx.Uint32 |
| 2206 | ); |
| 2207 | @endcode |
| 2208 | **/ |
| 2209 | #define CPUID_INTEL_RDT_MONITORING_ENUMERATION_SUB_LEAF 0x00 |
| 2210 | |
| 2211 | /** |
| 2212 | CPUID Intel RDT Monitoring Information EDX for CPUID leaf |
| 2213 | #CPUID_INTEL_RDT_MONITORING, sub-leaf |
| 2214 | #CPUID_INTEL_RDT_MONITORING_ENUMERATION_SUB_LEAF. |
| 2215 | **/ |
| 2216 | typedef union { |
| 2217 | /// |
| 2218 | /// Individual bit fields |
| 2219 | /// |
| 2220 | struct { |
| 2221 | UINT32 Reserved1 : 1; |
| 2222 | /// |
| 2223 | /// [Bit 1] Supports L3 Cache Intel RDT Monitoring if 1. |
| 2224 | /// |
| 2225 | UINT32 L3CacheRDT_M : 1; |
| 2226 | UINT32 Reserved2 : 30; |
| 2227 | } Bits; |
| 2228 | /// |
| 2229 | /// All bit fields as a 32-bit value |
| 2230 | /// |
| 2231 | UINT32 Uint32; |
| 2232 | } CPUID_INTEL_RDT_MONITORING_ENUMERATION_SUB_LEAF_EDX; |
| 2233 | |
| 2234 | /** |
| 2235 | CPUID L3 Cache Intel RDT Monitoring Capability Enumeration Sub-leaf |
| 2236 | |
| 2237 | @param EAX CPUID_INTEL_RDT_MONITORING (0x0F) |
| 2238 | @param ECX CPUID_INTEL_RDT_MONITORING_L3_CACHE_SUB_LEAF (0x01) |
| 2239 | |
| 2240 | @retval EAX Reserved. |
| 2241 | @retval EBX Conversion factor from reported IA32_QM_CTR value to occupancy metric (bytes). |
| 2242 | @retval ECX Maximum range (zero-based) of RMID of this resource type. |
| 2243 | @retval EDX L3 Cache Intel RDT Monitoring Capability information described by the |
| 2244 | type CPUID_INTEL_RDT_MONITORING_L3_CACHE_SUB_LEAF_EDX. |
| 2245 | |
| 2246 | <b>Example usage</b> |
| 2247 | @code |
| 2248 | UINT32 Ebx; |
| 2249 | UINT32 Ecx; |
| 2250 | CPUID_INTEL_RDT_MONITORING_L3_CACHE_SUB_LEAF_EDX Edx; |
| 2251 | |
| 2252 | AsmCpuidEx ( |
| 2253 | CPUID_INTEL_RDT_MONITORING, CPUID_INTEL_RDT_MONITORING_L3_CACHE_SUB_LEAF, |
| 2254 | NULL, &Ebx, &Ecx, &Edx.Uint32 |
| 2255 | ); |
| 2256 | @endcode |
| 2257 | **/ |
| 2258 | #define CPUID_INTEL_RDT_MONITORING_L3_CACHE_SUB_LEAF 0x01 |
| 2259 | |
| 2260 | /** |
| 2261 | CPUID L3 Cache Intel RDT Monitoring Capability Information EDX for CPUID leaf |
| 2262 | #CPUID_INTEL_RDT_MONITORING, sub-leaf |
| 2263 | #CPUID_INTEL_RDT_MONITORING_L3_CACHE_SUB_LEAF. |
| 2264 | **/ |
| 2265 | typedef union { |
| 2266 | /// |
| 2267 | /// Individual bit fields |
| 2268 | /// |
| 2269 | struct { |
| 2270 | /// |
| 2271 | /// [Bit 0] Supports L3 occupancy monitoring if 1. |
| 2272 | /// |
| 2273 | UINT32 L3CacheOccupancyMonitoring : 1; |
| 2274 | /// |
| 2275 | /// [Bit 1] Supports L3 Total Bandwidth monitoring if 1. |
| 2276 | /// |
| 2277 | UINT32 L3CacheTotalBandwidthMonitoring : 1; |
| 2278 | /// |
| 2279 | /// [Bit 2] Supports L3 Local Bandwidth monitoring if 1. |
| 2280 | /// |
| 2281 | UINT32 L3CacheLocalBandwidthMonitoring : 1; |
| 2282 | UINT32 Reserved : 29; |
| 2283 | } Bits; |
| 2284 | /// |
| 2285 | /// All bit fields as a 32-bit value |
| 2286 | /// |
| 2287 | UINT32 Uint32; |
| 2288 | } CPUID_INTEL_RDT_MONITORING_L3_CACHE_SUB_LEAF_EDX; |
| 2289 | |
| 2290 | /** |
| 2291 | CPUID Intel Resource Director Technology (Intel RDT) Allocation Information |
| 2292 | |
| 2293 | @param EAX CPUID_INTEL_RDT_ALLOCATION (0x10). |
| 2294 | @param ECX CPUID_INTEL_RDT_ALLOCATION_ENUMERATION_SUB_LEAF (0x00). |
| 2295 | CPUID_INTEL_RDT_ALLOCATION_L3_CACHE_SUB_LEAF (0x01). |
| 2296 | CPUID_INTEL_RDT_ALLOCATION_L2_CACHE_SUB_LEAF (0x02). |
| 2297 | **/ |
| 2298 | #define CPUID_INTEL_RDT_ALLOCATION 0x10 |
| 2299 | |
| 2300 | /** |
| 2301 | Intel Resource Director Technology (Intel RDT) Allocation Enumeration Sub-leaf |
| 2302 | |
| 2303 | @param EAX CPUID_INTEL_RDT_ALLOCATION (0x10) |
| 2304 | @param ECX CPUID_INTEL_RDT_ALLOCATION_ENUMERATION_SUB_LEAF (0x00). |
| 2305 | |
| 2306 | @retval EAX Reserved. |
| 2307 | @retval EBX L3 and L2 Cache Allocation Technology information described by |
| 2308 | the type CPUID_INTEL_RDT_ALLOCATION_ENUMERATION_SUB_LEAF_EBX. |
| 2309 | @retval ECX Reserved. |
| 2310 | @retval EDX Reserved. |
| 2311 | |
| 2312 | <b>Example usage</b> |
| 2313 | @code |
| 2314 | CPUID_INTEL_RDT_ALLOCATION_ENUMERATION_SUB_LEAF_EBX Ebx; |
| 2315 | |
| 2316 | AsmCpuidEx ( |
| 2317 | CPUID_INTEL_RDT_ALLOCATION, CPUID_INTEL_RDT_ALLOCATION_ENUMERATION_SUB_LEAF, |
| 2318 | NULL, &Ebx.Uint32, NULL, NULL |
| 2319 | ); |
| 2320 | @endcode |
| 2321 | **/ |
| 2322 | #define CPUID_INTEL_RDT_ALLOCATION_ENUMERATION_SUB_LEAF 0x00 |
| 2323 | |
| 2324 | /** |
| 2325 | CPUID L3 and L2 Cache Allocation Support Information EBX for CPUID leaf |
| 2326 | #CPUID_INTEL_RDT_ALLOCATION, sub-leaf |
| 2327 | #CPUID_INTEL_RDT_ALLOCATION_ENUMERATION_SUB_LEAF. |
| 2328 | **/ |
| 2329 | typedef union { |
| 2330 | /// |
| 2331 | /// Individual bit fields |
| 2332 | /// |
| 2333 | struct { |
| 2334 | UINT32 Reserved1 : 1; |
| 2335 | /// |
| 2336 | /// [Bit 1] Supports L3 Cache Allocation Technology if 1. |
| 2337 | /// |
| 2338 | UINT32 L3CacheAllocation : 1; |
| 2339 | /// |
| 2340 | /// [Bit 2] Supports L2 Cache Allocation Technology if 1. |
| 2341 | /// |
| 2342 | UINT32 L2CacheAllocation : 1; |
| 2343 | /// |
| 2344 | /// [Bit 3] Supports Memory Bandwidth Allocation if 1. |
| 2345 | /// |
| 2346 | UINT32 MemoryBandwidth : 1; |
| 2347 | UINT32 Reserved3 : 28; |
| 2348 | } Bits; |
| 2349 | /// |
| 2350 | /// All bit fields as a 32-bit value |
| 2351 | /// |
| 2352 | UINT32 Uint32; |
| 2353 | } CPUID_INTEL_RDT_ALLOCATION_ENUMERATION_SUB_LEAF_EBX; |
| 2354 | |
| 2355 | /** |
| 2356 | L3 Cache Allocation Technology Enumeration Sub-leaf |
| 2357 | |
| 2358 | @param EAX CPUID_INTEL_RDT_ALLOCATION (0x10) |
| 2359 | @param ECX CPUID_INTEL_RDT_ALLOCATION_L3_CACHE_SUB_LEAF (0x01) |
| 2360 | |
| 2361 | @retval EAX RESID L3 Cache Allocation Technology information described by |
| 2362 | the type CPUID_INTEL_RDT_ALLOCATION_L3_CACHE_SUB_LEAF_EAX. |
| 2363 | @retval EBX Bit-granular map of isolation/contention of allocation units. |
| 2364 | @retval ECX RESID L3 Cache Allocation Technology information described by |
| 2365 | the type CPUID_INTEL_RDT_ALLOCATION_L3_CACHE_SUB_LEAF_ECX. |
| 2366 | @retval EDX RESID L3 Cache Allocation Technology information described by |
| 2367 | the type CPUID_INTEL_RDT_ALLOCATION_L3_CACHE_SUB_LEAF_EDX. |
| 2368 | |
| 2369 | <b>Example usage</b> |
| 2370 | @code |
| 2371 | CPUID_INTEL_RDT_ALLOCATION_L3_CACHE_SUB_LEAF_EAX Eax; |
| 2372 | UINT32 Ebx; |
| 2373 | CPUID_INTEL_RDT_ALLOCATION_L3_CACHE_SUB_LEAF_ECX Ecx; |
| 2374 | CPUID_INTEL_RDT_ALLOCATION_L3_CACHE_SUB_LEAF_EDX Edx; |
| 2375 | |
| 2376 | AsmCpuidEx ( |
| 2377 | CPUID_INTEL_RDT_ALLOCATION, CPUID_INTEL_RDT_ALLOCATION_L3_CACHE_SUB_LEAF, |
| 2378 | &Eax.Uint32, &Ebx, &Ecx.Uint32, &Edx.Uint32 |
| 2379 | ); |
| 2380 | @endcode |
| 2381 | **/ |
| 2382 | #define CPUID_INTEL_RDT_ALLOCATION_L3_CACHE_SUB_LEAF 0x01 |
| 2383 | |
| 2384 | /** |
| 2385 | CPUID L3 Cache Allocation Technology Information EAX for CPUID leaf |
| 2386 | #CPUID_INTEL_RDT_ALLOCATION, sub-leaf |
| 2387 | #CPUID_INTEL_RDT_ALLOCATION_L3_CACHE_SUB_LEAF. |
| 2388 | **/ |
| 2389 | typedef union { |
| 2390 | /// |
| 2391 | /// Individual bit fields |
| 2392 | /// |
| 2393 | struct { |
| 2394 | /// |
| 2395 | /// [Bits 4:0] Length of the capacity bit mask for the corresponding ResID |
| 2396 | /// using minus-one notation. |
| 2397 | /// |
| 2398 | UINT32 CapacityLength : 5; |
| 2399 | UINT32 Reserved : 27; |
| 2400 | } Bits; |
| 2401 | /// |
| 2402 | /// All bit fields as a 32-bit value |
| 2403 | /// |
| 2404 | UINT32 Uint32; |
| 2405 | } CPUID_INTEL_RDT_ALLOCATION_L3_CACHE_SUB_LEAF_EAX; |
| 2406 | |
| 2407 | /** |
| 2408 | CPUID L3 Cache Allocation Technology Information ECX for CPUID leaf |
| 2409 | #CPUID_INTEL_RDT_ALLOCATION, sub-leaf |
| 2410 | #CPUID_INTEL_RDT_ALLOCATION_L3_CACHE_SUB_LEAF. |
| 2411 | **/ |
| 2412 | typedef union { |
| 2413 | /// |
| 2414 | /// Individual bit fields |
| 2415 | /// |
| 2416 | struct { |
| 2417 | UINT32 Reserved3 : 2; |
| 2418 | /// |
| 2419 | /// [Bit 2] Code and Data Prioritization Technology supported if 1. |
| 2420 | /// |
| 2421 | UINT32 CodeDataPrioritization : 1; |
| 2422 | UINT32 Reserved2 : 29; |
| 2423 | } Bits; |
| 2424 | /// |
| 2425 | /// All bit fields as a 32-bit value |
| 2426 | /// |
| 2427 | UINT32 Uint32; |
| 2428 | } CPUID_INTEL_RDT_ALLOCATION_L3_CACHE_SUB_LEAF_ECX; |
| 2429 | |
| 2430 | /** |
| 2431 | CPUID L3 Cache Allocation Technology Information EDX for CPUID leaf |
| 2432 | #CPUID_INTEL_RDT_ALLOCATION, sub-leaf |
| 2433 | #CPUID_INTEL_RDT_ALLOCATION_L3_CACHE_SUB_LEAF. |
| 2434 | **/ |
| 2435 | typedef union { |
| 2436 | /// |
| 2437 | /// Individual bit fields |
| 2438 | /// |
| 2439 | struct { |
| 2440 | /// |
| 2441 | /// [Bits 15:0] Highest COS number supported for this ResID. |
| 2442 | /// |
| 2443 | UINT32 HighestCosNumber : 16; |
| 2444 | UINT32 Reserved : 16; |
| 2445 | } Bits; |
| 2446 | /// |
| 2447 | /// All bit fields as a 32-bit value |
| 2448 | /// |
| 2449 | UINT32 Uint32; |
| 2450 | } CPUID_INTEL_RDT_ALLOCATION_L3_CACHE_SUB_LEAF_EDX; |
| 2451 | |
| 2452 | /** |
| 2453 | L2 Cache Allocation Technology Enumeration Sub-leaf |
| 2454 | |
| 2455 | @param EAX CPUID_INTEL_RDT_ALLOCATION (0x10) |
| 2456 | @param ECX CPUID_INTEL_RDT_ALLOCATION_L2_CACHE_SUB_LEAF (0x02) |
| 2457 | |
| 2458 | @retval EAX RESID L2 Cache Allocation Technology information described by |
| 2459 | the type CPUID_INTEL_RDT_ALLOCATION_L2_CACHE_SUB_LEAF_EAX. |
| 2460 | @retval EBX Bit-granular map of isolation/contention of allocation units. |
| 2461 | @retval ECX Reserved. |
| 2462 | @retval EDX RESID L2 Cache Allocation Technology information described by |
| 2463 | the type CPUID_INTEL_RDT_ALLOCATION_L2_CACHE_SUB_LEAF_EDX. |
| 2464 | |
| 2465 | <b>Example usage</b> |
| 2466 | @code |
| 2467 | CPUID_INTEL_RDT_ALLOCATION_L2_CACHE_SUB_LEAF_EAX Eax; |
| 2468 | UINT32 Ebx; |
| 2469 | CPUID_INTEL_RDT_ALLOCATION_L2_CACHE_SUB_LEAF_EDX Edx; |
| 2470 | |
| 2471 | AsmCpuidEx ( |
| 2472 | CPUID_INTEL_RDT_ALLOCATION, CPUID_INTEL_RDT_ALLOCATION_L2_CACHE_SUB_LEAF, |
| 2473 | &Eax.Uint32, &Ebx, NULL, &Edx.Uint32 |
| 2474 | ); |
| 2475 | @endcode |
| 2476 | **/ |
| 2477 | #define CPUID_INTEL_RDT_ALLOCATION_L2_CACHE_SUB_LEAF 0x02 |
| 2478 | |
| 2479 | /** |
| 2480 | CPUID L2 Cache Allocation Technology Information EAX for CPUID leaf |
| 2481 | #CPUID_INTEL_RDT_ALLOCATION, sub-leaf |
| 2482 | #CPUID_INTEL_RDT_ALLOCATION_L2_CACHE_SUB_LEAF. |
| 2483 | **/ |
| 2484 | typedef union { |
| 2485 | /// |
| 2486 | /// Individual bit fields |
| 2487 | /// |
| 2488 | struct { |
| 2489 | /// |
| 2490 | /// [Bits 4:0] Length of the capacity bit mask for the corresponding ResID |
| 2491 | /// using minus-one notation. |
| 2492 | /// |
| 2493 | UINT32 CapacityLength : 5; |
| 2494 | UINT32 Reserved : 27; |
| 2495 | } Bits; |
| 2496 | /// |
| 2497 | /// All bit fields as a 32-bit value |
| 2498 | /// |
| 2499 | UINT32 Uint32; |
| 2500 | } CPUID_INTEL_RDT_ALLOCATION_L2_CACHE_SUB_LEAF_EAX; |
| 2501 | |
| 2502 | /** |
| 2503 | CPUID L2 Cache Allocation Technology Information EDX for CPUID leaf |
| 2504 | #CPUID_INTEL_RDT_ALLOCATION, sub-leaf |
| 2505 | #CPUID_INTEL_RDT_ALLOCATION_L2_CACHE_SUB_LEAF. |
| 2506 | **/ |
| 2507 | typedef union { |
| 2508 | /// |
| 2509 | /// Individual bit fields |
| 2510 | /// |
| 2511 | struct { |
| 2512 | /// |
| 2513 | /// [Bits 15:0] Highest COS number supported for this ResID. |
| 2514 | /// |
| 2515 | UINT32 HighestCosNumber : 16; |
| 2516 | UINT32 Reserved : 16; |
| 2517 | } Bits; |
| 2518 | /// |
| 2519 | /// All bit fields as a 32-bit value |
| 2520 | /// |
| 2521 | UINT32 Uint32; |
| 2522 | } CPUID_INTEL_RDT_ALLOCATION_L2_CACHE_SUB_LEAF_EDX; |
| 2523 | |
| 2524 | /** |
| 2525 | Memory Bandwidth Allocation Enumeration Sub-leaf |
| 2526 | |
| 2527 | @param EAX CPUID_INTEL_RDT_ALLOCATION (0x10) |
| 2528 | @param ECX CPUID_INTEL_RDT_ALLOCATION_MEMORY_BANDWIDTH_SUB_LEAF (0x03) |
| 2529 | |
| 2530 | @retval EAX RESID memory bandwidth Allocation Technology information |
| 2531 | described by the type |
| 2532 | CPUID_INTEL_RDT_ALLOCATION_MEMORY_BANDWIDTH_SUB_LEAF_EAX. |
| 2533 | @retval EBX Reserved. |
| 2534 | @retval ECX RESID memory bandwidth Allocation Technology information |
| 2535 | described by the type |
| 2536 | CPUID_INTEL_RDT_ALLOCATION_MEMORY_BANDWIDTH_SUB_LEAF_ECX. |
| 2537 | @retval EDX RESID memory bandwidth Allocation Technology information |
| 2538 | described by the type |
| 2539 | CPUID_INTEL_RDT_ALLOCATION_MEMORY_BANDWIDTH_SUB_LEAF_EDX. |
| 2540 | |
| 2541 | <b>Example usage</b> |
| 2542 | @code |
| 2543 | CPUID_INTEL_RDT_ALLOCATION_MEMORY_BANDWIDTH_SUB_LEAF_EAX Eax; |
| 2544 | UINT32 Ebx; |
| 2545 | CPUID_INTEL_RDT_ALLOCATION_MEMORY_BANDWIDTH_SUB_LEAF_ECX Ecx; |
| 2546 | CPUID_INTEL_RDT_ALLOCATION_MEMORY_BANDWIDTH_SUB_LEAF_EDX Edx; |
| 2547 | |
| 2548 | |
| 2549 | AsmCpuidEx ( |
| 2550 | CPUID_INTEL_RDT_ALLOCATION, CPUID_INTEL_RDT_ALLOCATION_MEMORY_BANDWIDTH_SUB_LEAF, |
| 2551 | &Eax.Uint32, &Ebx, NULL, &Edx.Uint32 |
| 2552 | ); |
| 2553 | @endcode |
| 2554 | **/ |
| 2555 | #define CPUID_INTEL_RDT_ALLOCATION_MEMORY_BANDWIDTH_SUB_LEAF 0x03 |
| 2556 | |
| 2557 | /** |
| 2558 | CPUID memory bandwidth Allocation Technology Information EAX for CPUID leaf |
| 2559 | #CPUID_INTEL_RDT_ALLOCATION, sub-leaf |
| 2560 | #CPUID_INTEL_RDT_ALLOCATION_MEMORY_BANDWIDTH_SUB_LEAF. |
| 2561 | **/ |
| 2562 | typedef union { |
| 2563 | /// |
| 2564 | /// Individual bit fields |
| 2565 | /// |
| 2566 | struct { |
| 2567 | /// |
| 2568 | /// [Bits 11:0] Reports the maximum MBA throttling value supported for |
| 2569 | /// the corresponding ResID using minus-one notation. |
| 2570 | /// |
| 2571 | UINT32 MaximumMBAThrottling : 12; |
| 2572 | UINT32 Reserved : 20; |
| 2573 | } Bits; |
| 2574 | /// |
| 2575 | /// All bit fields as a 32-bit value |
| 2576 | /// |
| 2577 | UINT32 Uint32; |
| 2578 | } CPUID_INTEL_RDT_ALLOCATION_MEMORY_BANDWIDTH_SUB_LEAF_EAX; |
| 2579 | |
| 2580 | /** |
| 2581 | CPUID memory bandwidth Allocation Technology Information ECX for CPUID leaf |
| 2582 | #CPUID_INTEL_RDT_ALLOCATION, sub-leaf |
| 2583 | #CPUID_INTEL_RDT_ALLOCATION_MEMORY_BANDWIDTH_SUB_LEAF. |
| 2584 | **/ |
| 2585 | typedef union { |
| 2586 | /// |
| 2587 | /// Individual bit fields |
| 2588 | /// |
| 2589 | struct { |
| 2590 | /// |
| 2591 | /// [Bits 1:0] Reserved. |
| 2592 | /// |
| 2593 | UINT32 Reserved1 : 2; |
| 2594 | /// |
| 2595 | /// [Bits 3] Reports whether the response of the delay values is linear. |
| 2596 | /// |
| 2597 | UINT32 Liner : 1; |
| 2598 | UINT32 Reserved2 : 29; |
| 2599 | } Bits; |
| 2600 | /// |
| 2601 | /// All bit fields as a 32-bit value |
| 2602 | /// |
| 2603 | UINT32 Uint32; |
| 2604 | } CPUID_INTEL_RDT_ALLOCATION_MEMORY_BANDWIDTH_SUB_LEAF_ECX; |
| 2605 | |
| 2606 | /** |
| 2607 | CPUID memory bandwidth Allocation Technology Information EDX for CPUID leaf |
| 2608 | #CPUID_INTEL_RDT_ALLOCATION, sub-leaf |
| 2609 | #CPUID_INTEL_RDT_ALLOCATION_MEMORY_BANDWIDTH_SUB_LEAF. |
| 2610 | **/ |
| 2611 | typedef union { |
| 2612 | /// |
| 2613 | /// Individual bit fields |
| 2614 | /// |
| 2615 | struct { |
| 2616 | /// |
| 2617 | /// [Bits 15:0] Highest COS number supported for this ResID. |
| 2618 | /// |
| 2619 | UINT32 HighestCosNumber : 16; |
| 2620 | UINT32 Reserved : 16; |
| 2621 | } Bits; |
| 2622 | /// |
| 2623 | /// All bit fields as a 32-bit value |
| 2624 | /// |
| 2625 | UINT32 Uint32; |
| 2626 | } CPUID_INTEL_RDT_ALLOCATION_MEMORY_BANDWIDTH_SUB_LEAF_EDX; |
| 2627 | |
| 2628 | /** |
| 2629 | Intel SGX resource capability and configuration. |
| 2630 | See Section 37.7.2 "Intel(R) SGX Resource Enumeration Leaves". |
| 2631 | |
| 2632 | If CPUID.(EAX=07H, ECX=0H):EBX.SGX = 1, the processor also supports querying |
| 2633 | CPUID with EAX=12H on Intel SGX resource capability and configuration. |
| 2634 | |
| 2635 | @param EAX CPUID_INTEL_SGX (0x12) |
| 2636 | @param ECX CPUID_INTEL_SGX_CAPABILITIES_0_SUB_LEAF (0x00). |
| 2637 | CPUID_INTEL_SGX_CAPABILITIES_1_SUB_LEAF (0x01). |
| 2638 | CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF (0x02). |
| 2639 | Sub leafs 2..n based on the sub-leaf-type encoding (returned in EAX[3:0]) |
| 2640 | until the sub-leaf type is invalid. |
| 2641 | |
| 2642 | **/ |
| 2643 | #define CPUID_INTEL_SGX 0x12 |
| 2644 | |
| 2645 | /** |
| 2646 | Sub-Leaf 0 Enumeration of Intel SGX Capabilities. |
| 2647 | Enumerates Intel SGX capability, including enclave instruction opcode support. |
| 2648 | |
| 2649 | @param EAX CPUID_INTEL_SGX (0x12) |
| 2650 | @param ECX CPUID_INTEL_SGX_CAPABILITIES_0_SUB_LEAF (0x00) |
| 2651 | |
| 2652 | @retval EAX The format of Sub-Leaf 0 Enumeration of Intel SGX Capabilities is |
| 2653 | described by the type CPUID_INTEL_SGX_CAPABILITIES_0_SUB_LEAF_EAX. |
| 2654 | @retval EBX MISCSELECT: Reports the bit vector of supported extended features |
| 2655 | that can be written to the MISC region of the SSA. |
| 2656 | @retval ECX Reserved. |
| 2657 | @retval EDX The format of Sub-Leaf 0 Enumeration of Intel SGX Capabilities is |
| 2658 | described by the type CPUID_INTEL_SGX_CAPABILITIES_0_SUB_LEAF_EDX. |
| 2659 | |
| 2660 | <b>Example usage</b> |
| 2661 | @code |
| 2662 | CPUID_INTEL_SGX_CAPABILITIES_0_SUB_LEAF_EAX Eax; |
| 2663 | UINT32 Ebx; |
| 2664 | CPUID_INTEL_SGX_CAPABILITIES_0_SUB_LEAF_EDX Edx; |
| 2665 | |
| 2666 | AsmCpuidEx ( |
| 2667 | CPUID_INTEL_SGX, CPUID_INTEL_SGX_CAPABILITIES_0_SUB_LEAF, |
| 2668 | &Eax.Uint32, &Ebx, NULL, &Edx.Uint32 |
| 2669 | ); |
| 2670 | @endcode |
| 2671 | **/ |
| 2672 | #define CPUID_INTEL_SGX_CAPABILITIES_0_SUB_LEAF 0x00 |
| 2673 | |
| 2674 | /** |
| 2675 | Sub-Leaf 0 Enumeration of Intel SGX Capabilities EAX for CPUID leaf #CPUID_INTEL_SGX, |
| 2676 | sub-leaf #CPUID_INTEL_SGX_CAPABILITIES_0_SUB_LEAF. |
| 2677 | **/ |
| 2678 | typedef union { |
| 2679 | /// |
| 2680 | /// Individual bit fields |
| 2681 | /// |
| 2682 | struct { |
| 2683 | /// |
| 2684 | /// [Bit 0] If 1, indicates leaf functions of SGX1 instruction are supported. |
| 2685 | /// |
| 2686 | UINT32 SGX1 : 1; |
| 2687 | /// |
| 2688 | /// [Bit 1] If 1, indicates leaf functions of SGX2 instruction are supported. |
| 2689 | /// |
| 2690 | UINT32 SGX2 : 1; |
| 2691 | UINT32 Reserved1 : 3; |
| 2692 | /// |
| 2693 | /// [Bit 5] If 1, indicates Intel SGX supports ENCLV instruction leaves |
| 2694 | /// EINCVIRTCHILD, EDECVIRTCHILD, and ESETCONTEXT. |
| 2695 | /// |
| 2696 | UINT32 ENCLV : 1; |
| 2697 | /// |
| 2698 | /// [Bit 6] If 1, indicates Intel SGX supports ENCLS instruction leaves ETRACKC, |
| 2699 | /// ERDINFO, ELDBC, and ELDUC. |
| 2700 | /// |
| 2701 | UINT32 ENCLS : 1; |
| 2702 | UINT32 Reserved2 : 25; |
| 2703 | } Bits; |
| 2704 | /// |
| 2705 | /// All bit fields as a 32-bit value |
| 2706 | /// |
| 2707 | UINT32 Uint32; |
| 2708 | } CPUID_INTEL_SGX_CAPABILITIES_0_SUB_LEAF_EAX; |
| 2709 | |
| 2710 | /** |
| 2711 | Sub-Leaf 0 Enumeration of Intel SGX Capabilities EDX for CPUID leaf #CPUID_INTEL_SGX, |
| 2712 | sub-leaf #CPUID_INTEL_SGX_CAPABILITIES_0_SUB_LEAF. |
| 2713 | **/ |
| 2714 | typedef union { |
| 2715 | /// |
| 2716 | /// Individual bit fields |
| 2717 | /// |
| 2718 | struct { |
| 2719 | /// |
| 2720 | /// [Bit 7:0] The maximum supported enclave size is 2^(EDX[7:0]) bytes |
| 2721 | /// when not in 64-bit mode. |
| 2722 | /// |
| 2723 | UINT32 MaxEnclaveSize_Not64 : 8; |
| 2724 | /// |
| 2725 | /// [Bit 15:8] The maximum supported enclave size is 2^(EDX[15:8]) bytes |
| 2726 | /// when operating in 64-bit mode. |
| 2727 | /// |
| 2728 | UINT32 MaxEnclaveSize_64 : 8; |
| 2729 | UINT32 Reserved : 16; |
| 2730 | } Bits; |
| 2731 | /// |
| 2732 | /// All bit fields as a 32-bit value |
| 2733 | /// |
| 2734 | UINT32 Uint32; |
| 2735 | } CPUID_INTEL_SGX_CAPABILITIES_0_SUB_LEAF_EDX; |
| 2736 | |
| 2737 | /** |
| 2738 | Sub-Leaf 1 Enumeration of Intel SGX Capabilities. |
| 2739 | Enumerates Intel SGX capability of processor state configuration and enclave |
| 2740 | configuration in the SECS structure. |
| 2741 | |
| 2742 | @param EAX CPUID_INTEL_SGX (0x12) |
| 2743 | @param ECX CPUID_INTEL_SGX_CAPABILITIES_1_SUB_LEAF (0x01) |
| 2744 | |
| 2745 | @retval EAX Report the valid bits of SECS.ATTRIBUTES[31:0] that software can |
| 2746 | set with ECREATE. SECS.ATTRIBUTES[n] can be set to 1 using ECREATE |
| 2747 | only if EAX[n] is 1, where n < 32. |
| 2748 | @retval EBX Report the valid bits of SECS.ATTRIBUTES[63:32] that software can |
| 2749 | set with ECREATE. SECS.ATTRIBUTES[n+32] can be set to 1 using ECREATE |
| 2750 | only if EBX[n] is 1, where n < 32. |
| 2751 | @retval ECX Report the valid bits of SECS.ATTRIBUTES[95:64] that software can |
| 2752 | set with ECREATE. SECS.ATTRIBUTES[n+64] can be set to 1 using ECREATE |
| 2753 | only if ECX[n] is 1, where n < 32. |
| 2754 | @retval EDX Report the valid bits of SECS.ATTRIBUTES[127:96] that software can |
| 2755 | set with ECREATE. SECS.ATTRIBUTES[n+96] can be set to 1 using ECREATE |
| 2756 | only if EDX[n] is 1, where n < 32. |
| 2757 | |
| 2758 | <b>Example usage</b> |
| 2759 | @code |
| 2760 | UINT32 Eax; |
| 2761 | UINT32 Ebx; |
| 2762 | UINT32 Ecx; |
| 2763 | UINT32 Edx; |
| 2764 | |
| 2765 | AsmCpuidEx ( |
| 2766 | CPUID_INTEL_SGX, CPUID_INTEL_SGX_CAPABILITIES_1_SUB_LEAF, |
| 2767 | &Eax, &Ebx, &Ecx, &Edx |
| 2768 | ); |
| 2769 | @endcode |
| 2770 | **/ |
| 2771 | #define CPUID_INTEL_SGX_CAPABILITIES_1_SUB_LEAF 0x01 |
| 2772 | |
| 2773 | /** |
| 2774 | Sub-Leaf Index 2 or Higher Enumeration of Intel SGX Resources. |
| 2775 | Enumerates available EPC resources. |
| 2776 | |
| 2777 | @param EAX CPUID_INTEL_SGX (0x12) |
| 2778 | @param ECX CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF (0x02) |
| 2779 | |
| 2780 | @retval EAX The format of Sub-Leaf Index 2 or Higher Enumeration of Intel SGX |
| 2781 | Resources is described by the type |
| 2782 | CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF_EAX. |
| 2783 | @retval EBX The format of Sub-Leaf Index 2 or Higher Enumeration of Intel SGX |
| 2784 | Resources is described by the type |
| 2785 | CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF_EBX. |
| 2786 | @retval EDX The format of Sub-Leaf Index 2 or Higher Enumeration of Intel SGX |
| 2787 | Resources is described by the type |
| 2788 | CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF_ECX. |
| 2789 | @retval EDX The format of Sub-Leaf Index 2 or Higher Enumeration of Intel SGX |
| 2790 | Resources is described by the type |
| 2791 | CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF_EDX. |
| 2792 | |
| 2793 | <b>Example usage</b> |
| 2794 | @code |
| 2795 | CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF_EAX Eax; |
| 2796 | CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF_EBX Ebx; |
| 2797 | CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF_ECX Ecx; |
| 2798 | CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF_EDX Edx; |
| 2799 | |
| 2800 | AsmCpuidEx ( |
| 2801 | CPUID_INTEL_SGX, CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF, |
| 2802 | &Eax.Uint32, &Ebx.Uint32, &Ecx.Uint32, &Edx.Uint32 |
| 2803 | ); |
| 2804 | @endcode |
| 2805 | **/ |
| 2806 | #define CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF 0x02 |
| 2807 | |
| 2808 | /** |
| 2809 | Sub-Leaf Index 2 or Higher Enumeration of Intel SGX Resources EAX for CPUID |
| 2810 | leaf #CPUID_INTEL_SGX, sub-leaf #CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF. |
| 2811 | **/ |
| 2812 | typedef union { |
| 2813 | /// |
| 2814 | /// Individual bit fields |
| 2815 | /// |
| 2816 | struct { |
| 2817 | /// |
| 2818 | /// [Bit 3:0] Sub-leaf-type encoding. |
| 2819 | /// 0000b: This sub-leaf is invalid, EBX:EAX and EDX:ECX report 0. |
| 2820 | /// 0001b: This sub-leaf provides information on the Enclave Page Cache (EPC) |
| 2821 | /// in EBX:EAX and EDX:ECX. |
| 2822 | /// All other encoding are reserved. |
| 2823 | /// |
| 2824 | UINT32 SubLeafType : 4; |
| 2825 | UINT32 Reserved : 8; |
| 2826 | /// |
| 2827 | /// [Bit 31:12] If EAX[3:0] = 0001b, these are bits 31:12 of the physical address of |
| 2828 | /// the base of the EPC section. |
| 2829 | /// |
| 2830 | UINT32 LowAddressOfEpcSection : 20; |
| 2831 | } Bits; |
| 2832 | /// |
| 2833 | /// All bit fields as a 32-bit value |
| 2834 | /// |
| 2835 | UINT32 Uint32; |
| 2836 | } CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF_EAX; |
| 2837 | |
| 2838 | /** |
| 2839 | Sub-Leaf Index 2 or Higher Enumeration of Intel SGX Resources EBX for CPUID |
| 2840 | leaf #CPUID_INTEL_SGX, sub-leaf #CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF. |
| 2841 | **/ |
| 2842 | typedef union { |
| 2843 | /// |
| 2844 | /// Individual bit fields |
| 2845 | /// |
| 2846 | struct { |
| 2847 | /// |
| 2848 | /// [Bit 19:0] If EAX[3:0] = 0001b, these are bits 51:32 of the physical address of |
| 2849 | /// the base of the EPC section. |
| 2850 | /// |
| 2851 | UINT32 HighAddressOfEpcSection : 20; |
| 2852 | UINT32 Reserved : 12; |
| 2853 | } Bits; |
| 2854 | /// |
| 2855 | /// All bit fields as a 32-bit value |
| 2856 | /// |
| 2857 | UINT32 Uint32; |
| 2858 | } CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF_EBX; |
| 2859 | |
| 2860 | /** |
| 2861 | Sub-Leaf Index 2 or Higher Enumeration of Intel SGX Resources ECX for CPUID |
| 2862 | leaf #CPUID_INTEL_SGX, sub-leaf #CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF. |
| 2863 | **/ |
| 2864 | typedef union { |
| 2865 | /// |
| 2866 | /// Individual bit fields |
| 2867 | /// |
| 2868 | struct { |
| 2869 | /// |
| 2870 | /// [Bit 3:0] The EPC section encoding. |
| 2871 | /// 0000b: Not valid. |
| 2872 | /// 0001b: The EPC section is confidentiality, integrity and replay protected. |
| 2873 | /// All other encoding are reserved. |
| 2874 | /// |
| 2875 | UINT32 EpcSection : 4; |
| 2876 | UINT32 Reserved : 8; |
| 2877 | /// |
| 2878 | /// [Bit 31:12] If EAX[3:0] = 0001b, these are bits 31:12 of the size of the |
| 2879 | /// corresponding EPC section within the Processor Reserved Memory. |
| 2880 | /// |
| 2881 | UINT32 LowSizeOfEpcSection : 20; |
| 2882 | } Bits; |
| 2883 | /// |
| 2884 | /// All bit fields as a 32-bit value |
| 2885 | /// |
| 2886 | UINT32 Uint32; |
| 2887 | } CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF_ECX; |
| 2888 | |
| 2889 | /** |
| 2890 | Sub-Leaf Index 2 or Higher Enumeration of Intel SGX Resources EDX for CPUID |
| 2891 | leaf #CPUID_INTEL_SGX, sub-leaf #CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF. |
| 2892 | **/ |
| 2893 | typedef union { |
| 2894 | /// |
| 2895 | /// Individual bit fields |
| 2896 | /// |
| 2897 | struct { |
| 2898 | /// |
| 2899 | /// [Bit 19:0] If EAX[3:0] = 0001b, these are bits 51:32 of the size of the |
| 2900 | /// corresponding EPC section within the Processor Reserved Memory. |
| 2901 | /// |
| 2902 | UINT32 HighSizeOfEpcSection : 20; |
| 2903 | UINT32 Reserved : 12; |
| 2904 | } Bits; |
| 2905 | /// |
| 2906 | /// All bit fields as a 32-bit value |
| 2907 | /// |
| 2908 | UINT32 Uint32; |
| 2909 | } CPUID_INTEL_SGX_CAPABILITIES_RESOURCES_SUB_LEAF_EDX; |
| 2910 | |
| 2911 | /** |
| 2912 | CPUID Intel Processor Trace Information |
| 2913 | |
| 2914 | @param EAX CPUID_INTEL_PROCESSOR_TRACE (0x14) |
| 2915 | @param ECX CPUID_INTEL_PROCESSOR_TRACE_MAIN_LEAF (0x00). |
| 2916 | CPUID_INTEL_PROCESSOR_TRACE_SUB_LEAF (0x01). |
| 2917 | |
| 2918 | **/ |
| 2919 | #define CPUID_INTEL_PROCESSOR_TRACE 0x14 |
| 2920 | |
| 2921 | /** |
| 2922 | CPUID Intel Processor Trace Information Main Leaf |
| 2923 | |
| 2924 | @param EAX CPUID_INTEL_PROCEDSSOR_TRACE (0x14) |
| 2925 | @param ECX CPUID_INTEL_PROCEDSSOR_TRACE_MAIN_LEAF (0x00) |
| 2926 | |
| 2927 | @retval EAX Reports the maximum sub-leaf supported in leaf 14H. |
| 2928 | @retval EBX Returns Intel processor trace information described by the |
| 2929 | type CPUID_INTEL_PROCESSOR_TRACE_MAIN_LEAF_EBX. |
| 2930 | @retval ECX Returns Intel processor trace information described by the |
| 2931 | type CPUID_INTEL_PROCESSOR_TRACE_MAIN_LEAF_ECX. |
| 2932 | @retval EDX Reserved. |
| 2933 | |
| 2934 | <b>Example usage</b> |
| 2935 | @code |
| 2936 | UINT32 Eax; |
| 2937 | CPUID_INTEL_PROCESSOR_TRACE_MAIN_LEAF_EBX Ebx; |
| 2938 | CPUID_INTEL_PROCESSOR_TRACE_MAIN_LEAF_ECX Ecx; |
| 2939 | |
| 2940 | AsmCpuidEx ( |
| 2941 | CPUID_INTEL_PROCESSOR_TRACE, CPUID_INTEL_PROCESSOR_TRACE_MAIN_LEAF, |
| 2942 | &Eax, &Ebx.Uint32, &Ecx.Uint32, NULL |
| 2943 | ); |
| 2944 | @endcode |
| 2945 | **/ |
| 2946 | #define CPUID_INTEL_PROCESSOR_TRACE_MAIN_LEAF 0x00 |
| 2947 | |
| 2948 | /** |
| 2949 | CPUID Intel Processor Trace EBX for CPUID leaf #CPUID_INTEL_PROCESSOR_TRACE, |
| 2950 | sub-leaf #CPUID_INTEL_PROCESSOR_TRACE_MAIN_LEAF. |
| 2951 | **/ |
| 2952 | typedef union { |
| 2953 | /// |
| 2954 | /// Individual bit fields |
| 2955 | /// |
| 2956 | struct { |
| 2957 | /// |
| 2958 | /// [Bit 0] If 1, indicates that IA32_RTIT_CTL.CR3Filter can be set to 1, |
| 2959 | /// and that IA32_RTIT_CR3_MATCH MSR can be accessed. |
| 2960 | /// |
| 2961 | UINT32 Cr3Filter : 1; |
| 2962 | /// |
| 2963 | /// [Bit 1] If 1, indicates support of Configurable PSB and Cycle-Accurate |
| 2964 | /// Mode. |
| 2965 | /// |
| 2966 | UINT32 ConfigurablePsb : 1; |
| 2967 | /// |
| 2968 | /// [Bit 2] If 1, indicates support of IP Filtering, TraceStop filtering, |
| 2969 | /// and preservation of Intel PT MSRs across warm reset. |
| 2970 | /// |
| 2971 | UINT32 IpTraceStopFiltering : 1; |
| 2972 | /// |
| 2973 | /// [Bit 3] If 1, indicates support of MTC timing packet and suppression of |
| 2974 | /// COFI-based packets. |
| 2975 | /// |
| 2976 | UINT32 Mtc : 1; |
| 2977 | /// |
| 2978 | /// [Bit 4] If 1, indicates support of PTWRITE. Writes can set |
| 2979 | /// IA32_RTIT_CTL[12] (PTWEn) and IA32_RTIT_CTL[5] (FUPonPTW), and PTWRITE |
| 2980 | /// can generate packets. |
| 2981 | /// |
| 2982 | UINT32 PTWrite : 1; |
| 2983 | /// |
| 2984 | /// [Bit 5] If 1, indicates support of Power Event Trace. Writes can set |
| 2985 | /// IA32_RTIT_CTL[4] (PwrEvtEn), enabling Power Event Trace packet |
| 2986 | /// generation. |
| 2987 | /// |
| 2988 | UINT32 PowerEventTrace : 1; |
| 2989 | UINT32 Reserved : 26; |
| 2990 | } Bits; |
| 2991 | /// |
| 2992 | /// All bit fields as a 32-bit value |
| 2993 | /// |
| 2994 | UINT32 Uint32; |
| 2995 | } CPUID_INTEL_PROCESSOR_TRACE_MAIN_LEAF_EBX; |
| 2996 | |
| 2997 | /** |
| 2998 | CPUID Intel Processor Trace ECX for CPUID leaf #CPUID_INTEL_PROCESSOR_TRACE, |
| 2999 | sub-leaf #CPUID_INTEL_PROCESSOR_TRACE_MAIN_LEAF. |
| 3000 | **/ |
| 3001 | typedef union { |
| 3002 | /// |
| 3003 | /// Individual bit fields |
| 3004 | /// |
| 3005 | struct { |
| 3006 | /// |
| 3007 | /// [Bit 0] If 1, Tracing can be enabled with IA32_RTIT_CTL.ToPA = 1, hence |
| 3008 | /// utilizing the ToPA output scheme; IA32_RTIT_OUTPUT_BASE and |
| 3009 | /// IA32_RTIT_OUTPUT_MASK_PTRS MSRs can be accessed. |
| 3010 | /// |
| 3011 | UINT32 RTIT : 1; |
| 3012 | /// |
| 3013 | /// [Bit 1] If 1, ToPA tables can hold any number of output entries, up to |
| 3014 | /// the maximum allowed by the MaskOrTableOffset field of |
| 3015 | /// IA32_RTIT_OUTPUT_MASK_PTRS. |
| 3016 | /// |
| 3017 | UINT32 ToPA : 1; |
| 3018 | /// |
| 3019 | /// [Bit 2] If 1, indicates support of Single-Range Output scheme. |
| 3020 | /// |
| 3021 | UINT32 SingleRangeOutput : 1; |
| 3022 | /// |
| 3023 | /// [Bit 3] If 1, indicates support of output to Trace Transport subsystem. |
| 3024 | /// |
| 3025 | UINT32 TraceTransportSubsystem : 1; |
| 3026 | UINT32 Reserved : 27; |
| 3027 | /// |
| 3028 | /// [Bit 31] If 1, generated packets which contain IP payloads have LIP |
| 3029 | /// values, which include the CS base component. |
| 3030 | /// |
| 3031 | UINT32 LIP : 1; |
| 3032 | } Bits; |
| 3033 | /// |
| 3034 | /// All bit fields as a 32-bit value |
| 3035 | /// |
| 3036 | UINT32 Uint32; |
| 3037 | } CPUID_INTEL_PROCESSOR_TRACE_MAIN_LEAF_ECX; |
| 3038 | |
| 3039 | /** |
| 3040 | CPUID Intel Processor Trace Information Sub-leaf |
| 3041 | |
| 3042 | @param EAX CPUID_INTEL_PROCEDSSOR_TRACE (0x14) |
| 3043 | @param ECX CPUID_INTEL_PROCESSOR_TRACE_SUB_LEAF (0x01) |
| 3044 | |
| 3045 | @retval EAX Returns Intel processor trace information described by the |
| 3046 | type CPUID_INTEL_PROCESSOR_TRACE_SUB_LEAF_EAX. |
| 3047 | @retval EBX Returns Intel processor trace information described by the |
| 3048 | type CPUID_INTEL_PROCESSOR_TRACE_SUB_LEAF_EBX. |
| 3049 | @retval ECX Reserved. |
| 3050 | @retval EDX Reserved. |
| 3051 | |
| 3052 | <b>Example usage</b> |
| 3053 | @code |
| 3054 | UINT32 MaximumSubLeaf; |
| 3055 | UINT32 SubLeaf; |
| 3056 | CPUID_INTEL_PROCESSOR_TRACE_SUB_LEAF_EAX Eax; |
| 3057 | CPUID_INTEL_PROCESSOR_TRACE_SUB_LEAF_EBX Ebx; |
| 3058 | |
| 3059 | AsmCpuidEx ( |
| 3060 | CPUID_INTEL_PROCESSOR_TRACE, CPUID_INTEL_PROCESSOR_TRACE_MAIN_LEAF, |
| 3061 | &MaximumSubLeaf, NULL, NULL, NULL |
| 3062 | ); |
| 3063 | |
| 3064 | for (SubLeaf = CPUID_INTEL_PROCESSOR_TRACE_SUB_LEAF; SubLeaf <= MaximumSubLeaf; SubLeaf++) { |
| 3065 | AsmCpuidEx ( |
| 3066 | CPUID_INTEL_PROCESSOR_TRACE, SubLeaf, |
| 3067 | &Eax.Uint32, &Ebx.Uint32, NULL, NULL |
| 3068 | ); |
| 3069 | } |
| 3070 | @endcode |
| 3071 | **/ |
| 3072 | #define CPUID_INTEL_PROCESSOR_TRACE_SUB_LEAF 0x01 |
| 3073 | |
| 3074 | /** |
| 3075 | CPUID Intel Processor Trace EAX for CPUID leaf #CPUID_INTEL_PROCESSOR_TRACE, |
| 3076 | sub-leaf #CPUID_INTEL_PROCESSOR_TRACE_SUB_LEAF. |
| 3077 | **/ |
| 3078 | typedef union { |
| 3079 | /// |
| 3080 | /// Individual bit fields |
| 3081 | /// |
| 3082 | struct { |
| 3083 | /// |
| 3084 | /// [Bits 2:0] Number of configurable Address Ranges for filtering. |
| 3085 | /// |
| 3086 | UINT32 ConfigurableAddressRanges : 3; |
| 3087 | UINT32 Reserved : 13; |
| 3088 | /// |
| 3089 | /// [Bits 31:16] Bitmap of supported MTC period encodings |
| 3090 | /// |
| 3091 | UINT32 MtcPeriodEncodings : 16; |
| 3092 | } Bits; |
| 3093 | /// |
| 3094 | /// All bit fields as a 32-bit value |
| 3095 | /// |
| 3096 | UINT32 Uint32; |
| 3097 | } CPUID_INTEL_PROCESSOR_TRACE_SUB_LEAF_EAX; |
| 3098 | |
| 3099 | /** |
| 3100 | CPUID Intel Processor Trace EBX for CPUID leaf #CPUID_INTEL_PROCESSOR_TRACE, |
| 3101 | sub-leaf #CPUID_INTEL_PROCESSOR_TRACE_SUB_LEAF. |
| 3102 | **/ |
| 3103 | typedef union { |
| 3104 | /// |
| 3105 | /// Individual bit fields |
| 3106 | /// |
| 3107 | struct { |
| 3108 | /// |
| 3109 | /// [Bits 15:0] Bitmap of supported Cycle Threshold value encodings. |
| 3110 | /// |
| 3111 | UINT32 CycleThresholdEncodings : 16; |
| 3112 | /// |
| 3113 | /// [Bits 31:16] Bitmap of supported Configurable PSB frequency encodings. |
| 3114 | /// |
| 3115 | UINT32 PsbFrequencyEncodings : 16; |
| 3116 | } Bits; |
| 3117 | /// |
| 3118 | /// All bit fields as a 32-bit value |
| 3119 | /// |
| 3120 | UINT32 Uint32; |
| 3121 | } CPUID_INTEL_PROCESSOR_TRACE_SUB_LEAF_EBX; |
| 3122 | |
| 3123 | /** |
| 3124 | CPUID Time Stamp Counter and Nominal Core Crystal Clock Information |
| 3125 | |
| 3126 | @note |
| 3127 | If EBX[31:0] is 0, the TSC/"core crystal clock" ratio is not enumerated. |
| 3128 | EBX[31:0]/EAX[31:0] indicates the ratio of the TSC frequency and the core |
| 3129 | crystal clock frequency. |
| 3130 | If ECX is 0, the nominal core crystal clock frequency is not enumerated. |
| 3131 | "TSC frequency" = "core crystal clock frequency" * EBX/EAX. |
| 3132 | The core crystal clock may differ from the reference clock, bus clock, or core |
| 3133 | clock frequencies. |
| 3134 | |
| 3135 | @param EAX CPUID_TIME_STAMP_COUNTER (0x15) |
| 3136 | |
| 3137 | @retval EAX An unsigned integer which is the denominator of the |
| 3138 | TSC/"core crystal clock" ratio |
| 3139 | @retval EBX An unsigned integer which is the numerator of the |
| 3140 | TSC/"core crystal clock" ratio. |
| 3141 | @retval ECX An unsigned integer which is the nominal frequency |
| 3142 | of the core crystal clock in Hz. |
| 3143 | @retval EDX Reserved. |
| 3144 | |
| 3145 | <b>Example usage</b> |
| 3146 | @code |
| 3147 | UINT32 Eax; |
| 3148 | UINT32 Ebx; |
| 3149 | UINT32 Ecx; |
| 3150 | |
| 3151 | AsmCpuid (CPUID_TIME_STAMP_COUNTER, &Eax, &Ebx, &Ecx, NULL); |
| 3152 | @endcode |
| 3153 | **/ |
| 3154 | #define CPUID_TIME_STAMP_COUNTER 0x15 |
| 3155 | |
| 3156 | /** |
| 3157 | CPUID Processor Frequency Information |
| 3158 | |
| 3159 | @note |
| 3160 | Data is returned from this interface in accordance with the processor's |
| 3161 | specification and does not reflect actual values. Suitable use of this data |
| 3162 | includes the display of processor information in like manner to the processor |
| 3163 | brand string and for determining the appropriate range to use when displaying |
| 3164 | processor information e.g. frequency history graphs. The returned information |
| 3165 | should not be used for any other purpose as the returned information does not |
| 3166 | accurately correlate to information / counters returned by other processor |
| 3167 | interfaces. While a processor may support the Processor Frequency Information |
| 3168 | leaf, fields that return a value of zero are not supported. |
| 3169 | |
| 3170 | @param EAX CPUID_TIME_STAMP_COUNTER (0x16) |
| 3171 | |
| 3172 | @retval EAX Returns processor base frequency information described by the |
| 3173 | type CPUID_PROCESSOR_FREQUENCY_EAX. |
| 3174 | @retval EBX Returns maximum frequency information described by the type |
| 3175 | CPUID_PROCESSOR_FREQUENCY_EBX. |
| 3176 | @retval ECX Returns bus frequency information described by the type |
| 3177 | CPUID_PROCESSOR_FREQUENCY_ECX. |
| 3178 | @retval EDX Reserved. |
| 3179 | |
| 3180 | <b>Example usage</b> |
| 3181 | @code |
| 3182 | CPUID_PROCESSOR_FREQUENCY_EAX Eax; |
| 3183 | CPUID_PROCESSOR_FREQUENCY_EBX Ebx; |
| 3184 | CPUID_PROCESSOR_FREQUENCY_ECX Ecx; |
| 3185 | |
| 3186 | AsmCpuid (CPUID_PROCESSOR_FREQUENCY, &Eax.Uint32, &Ebx.Uint32, &Ecx.Uint32, NULL); |
| 3187 | @endcode |
| 3188 | **/ |
| 3189 | #define CPUID_PROCESSOR_FREQUENCY 0x16 |
| 3190 | |
| 3191 | /** |
| 3192 | CPUID Processor Frequency Information EAX for CPUID leaf |
| 3193 | #CPUID_PROCESSOR_FREQUENCY. |
| 3194 | **/ |
| 3195 | typedef union { |
| 3196 | /// |
| 3197 | /// Individual bit fields |
| 3198 | /// |
| 3199 | struct { |
| 3200 | /// |
| 3201 | /// [Bits 15:0] Processor Base Frequency (in MHz). |
| 3202 | /// |
| 3203 | UINT32 ProcessorBaseFrequency : 16; |
| 3204 | UINT32 Reserved : 16; |
| 3205 | } Bits; |
| 3206 | /// |
| 3207 | /// All bit fields as a 32-bit value |
| 3208 | /// |
| 3209 | UINT32 Uint32; |
| 3210 | } CPUID_PROCESSOR_FREQUENCY_EAX; |
| 3211 | |
| 3212 | /** |
| 3213 | CPUID Processor Frequency Information EBX for CPUID leaf |
| 3214 | #CPUID_PROCESSOR_FREQUENCY. |
| 3215 | **/ |
| 3216 | typedef union { |
| 3217 | /// |
| 3218 | /// Individual bit fields |
| 3219 | /// |
| 3220 | struct { |
| 3221 | /// |
| 3222 | /// [Bits 15:0] Maximum Frequency (in MHz). |
| 3223 | /// |
| 3224 | UINT32 MaximumFrequency : 16; |
| 3225 | UINT32 Reserved : 16; |
| 3226 | } Bits; |
| 3227 | /// |
| 3228 | /// All bit fields as a 32-bit value |
| 3229 | /// |
| 3230 | UINT32 Uint32; |
| 3231 | } CPUID_PROCESSOR_FREQUENCY_EBX; |
| 3232 | |
| 3233 | /** |
| 3234 | CPUID Processor Frequency Information ECX for CPUID leaf |
| 3235 | #CPUID_PROCESSOR_FREQUENCY. |
| 3236 | **/ |
| 3237 | typedef union { |
| 3238 | /// |
| 3239 | /// Individual bit fields |
| 3240 | /// |
| 3241 | struct { |
| 3242 | /// |
| 3243 | /// [Bits 15:0] Bus (Reference) Frequency (in MHz). |
| 3244 | /// |
| 3245 | UINT32 BusFrequency : 16; |
| 3246 | UINT32 Reserved : 16; |
| 3247 | } Bits; |
| 3248 | /// |
| 3249 | /// All bit fields as a 32-bit value |
| 3250 | /// |
| 3251 | UINT32 Uint32; |
| 3252 | } CPUID_PROCESSOR_FREQUENCY_ECX; |
| 3253 | |
| 3254 | /** |
| 3255 | CPUID SoC Vendor Information |
| 3256 | |
| 3257 | @param EAX CPUID_SOC_VENDOR (0x17) |
| 3258 | @param ECX CPUID_SOC_VENDOR_MAIN_LEAF (0x00) |
| 3259 | CPUID_SOC_VENDOR_BRAND_STRING1 (0x01) |
| 3260 | CPUID_SOC_VENDOR_BRAND_STRING1 (0x02) |
| 3261 | CPUID_SOC_VENDOR_BRAND_STRING1 (0x03) |
| 3262 | |
| 3263 | @note |
| 3264 | Leaf 17H output depends on the initial value in ECX. SOC Vendor Brand String |
| 3265 | is a UTF-8 encoded string padded with trailing bytes of 00H. The complete SOC |
| 3266 | Vendor Brand String is constructed by concatenating in ascending order of |
| 3267 | EAX:EBX:ECX:EDX and from the sub-leaf 1 fragment towards sub-leaf 3. |
| 3268 | |
| 3269 | **/ |
| 3270 | #define CPUID_SOC_VENDOR 0x17 |
| 3271 | |
| 3272 | /** |
| 3273 | CPUID SoC Vendor Information |
| 3274 | |
| 3275 | @param EAX CPUID_SOC_VENDOR (0x17) |
| 3276 | @param ECX CPUID_SOC_VENDOR_MAIN_LEAF (0x00) |
| 3277 | |
| 3278 | @retval EAX MaxSOCID_Index. Reports the maximum input value of supported |
| 3279 | sub-leaf in leaf 17H. |
| 3280 | @retval EBX Returns SoC Vendor information described by the type |
| 3281 | CPUID_SOC_VENDOR_MAIN_LEAF_EBX. |
| 3282 | @retval ECX Project ID. A unique number an SOC vendor assigns to its SOC |
| 3283 | projects. |
| 3284 | @retval EDX Stepping ID. A unique number within an SOC project that an SOC |
| 3285 | vendor assigns. |
| 3286 | |
| 3287 | <b>Example usage</b> |
| 3288 | @code |
| 3289 | UINT32 Eax; |
| 3290 | CPUID_SOC_VENDOR_MAIN_LEAF_EBX Ebx; |
| 3291 | UINT32 Ecx; |
| 3292 | UINT32 Edx; |
| 3293 | |
| 3294 | AsmCpuidEx ( |
| 3295 | CPUID_SOC_VENDOR, CPUID_SOC_VENDOR_MAIN_LEAF, |
| 3296 | &Eax, &Ebx.Uint32, &Ecx, &Edx |
| 3297 | ); |
| 3298 | @endcode |
| 3299 | **/ |
| 3300 | #define CPUID_SOC_VENDOR_MAIN_LEAF 0x00 |
| 3301 | |
| 3302 | /** |
| 3303 | CPUID SoC Vendor Information EBX for CPUID leaf #CPUID_SOC_VENDOR sub-leaf |
| 3304 | #CPUID_SOC_VENDOR_MAIN_LEAF. |
| 3305 | **/ |
| 3306 | typedef union { |
| 3307 | /// |
| 3308 | /// Individual bit fields |
| 3309 | /// |
| 3310 | struct { |
| 3311 | /// |
| 3312 | /// [Bits 15:0] SOC Vendor ID. |
| 3313 | /// |
| 3314 | UINT32 SocVendorId : 16; |
| 3315 | /// |
| 3316 | /// [Bit 16] If 1, the SOC Vendor ID field is assigned via an industry |
| 3317 | /// standard enumeration scheme. Otherwise, the SOC Vendor ID field is |
| 3318 | /// assigned by Intel. |
| 3319 | /// |
| 3320 | UINT32 IsVendorScheme : 1; |
| 3321 | UINT32 Reserved : 15; |
| 3322 | } Bits; |
| 3323 | /// |
| 3324 | /// All bit fields as a 32-bit value |
| 3325 | /// |
| 3326 | UINT32 Uint32; |
| 3327 | } CPUID_SOC_VENDOR_MAIN_LEAF_EBX; |
| 3328 | |
| 3329 | /** |
| 3330 | CPUID SoC Vendor Information |
| 3331 | |
| 3332 | @param EAX CPUID_SOC_VENDOR (0x17) |
| 3333 | @param ECX CPUID_SOC_VENDOR_BRAND_STRING1 (0x01) |
| 3334 | |
| 3335 | @retval EAX SOC Vendor Brand String. UTF-8 encoded string of type |
| 3336 | CPUID_SOC_VENDOR_BRAND_STRING_DATA. |
| 3337 | @retval EBX SOC Vendor Brand String. UTF-8 encoded string of type |
| 3338 | CPUID_SOC_VENDOR_BRAND_STRING_DATA. |
| 3339 | @retval ECX SOC Vendor Brand String. UTF-8 encoded string of type |
| 3340 | CPUID_SOC_VENDOR_BRAND_STRING_DATA. |
| 3341 | @retval EDX SOC Vendor Brand String. UTF-8 encoded string of type |
| 3342 | CPUID_SOC_VENDOR_BRAND_STRING_DATA. |
| 3343 | |
| 3344 | <b>Example usage</b> |
| 3345 | @code |
| 3346 | CPUID_SOC_VENDOR_BRAND_STRING_DATA Eax; |
| 3347 | CPUID_SOC_VENDOR_BRAND_STRING_DATA Ebx; |
| 3348 | CPUID_SOC_VENDOR_BRAND_STRING_DATA Ecx; |
| 3349 | CPUID_SOC_VENDOR_BRAND_STRING_DATA Edx; |
| 3350 | |
| 3351 | AsmCpuidEx ( |
| 3352 | CPUID_SOC_VENDOR, CPUID_SOC_VENDOR_BRAND_STRING1, |
| 3353 | &Eax.Uint32, &Ebx.Uint32, &Ecx.Uint32, &Edx.Uint32 |
| 3354 | ); |
| 3355 | @endcode |
| 3356 | **/ |
| 3357 | #define CPUID_SOC_VENDOR_BRAND_STRING1 0x01 |
| 3358 | |
| 3359 | /** |
| 3360 | CPUID SoC Vendor Brand String for CPUID leafs #CPUID_SOC_VENDOR_BRAND_STRING1, |
| 3361 | #CPUID_SOC_VENDOR_BRAND_STRING2, and #CPUID_SOC_VENDOR_BRAND_STRING3. |
| 3362 | **/ |
| 3363 | typedef union { |
| 3364 | /// |
| 3365 | /// 4 UTF-8 characters of Soc Vendor Brand String |
| 3366 | /// |
| 3367 | CHAR8 BrandString[4]; |
| 3368 | /// |
| 3369 | /// All fields as a 32-bit value |
| 3370 | /// |
| 3371 | UINT32 Uint32; |
| 3372 | } CPUID_SOC_VENDOR_BRAND_STRING_DATA; |
| 3373 | |
| 3374 | /** |
| 3375 | CPUID SoC Vendor Information |
| 3376 | |
| 3377 | @param EAX CPUID_SOC_VENDOR (0x17) |
| 3378 | @param ECX CPUID_SOC_VENDOR_BRAND_STRING2 (0x02) |
| 3379 | |
| 3380 | @retval EAX SOC Vendor Brand String. UTF-8 encoded string of type |
| 3381 | CPUID_SOC_VENDOR_BRAND_STRING_DATA. |
| 3382 | @retval EBX SOC Vendor Brand String. UTF-8 encoded string of type |
| 3383 | CPUID_SOC_VENDOR_BRAND_STRING_DATA. |
| 3384 | @retval ECX SOC Vendor Brand String. UTF-8 encoded string of type |
| 3385 | CPUID_SOC_VENDOR_BRAND_STRING_DATA. |
| 3386 | @retval EDX SOC Vendor Brand String. UTF-8 encoded string of type |
| 3387 | CPUID_SOC_VENDOR_BRAND_STRING_DATA. |
| 3388 | |
| 3389 | <b>Example usage</b> |
| 3390 | @code |
| 3391 | CPUID_SOC_VENDOR_BRAND_STRING_DATA Eax; |
| 3392 | CPUID_SOC_VENDOR_BRAND_STRING_DATA Ebx; |
| 3393 | CPUID_SOC_VENDOR_BRAND_STRING_DATA Ecx; |
| 3394 | CPUID_SOC_VENDOR_BRAND_STRING_DATA Edx; |
| 3395 | |
| 3396 | AsmCpuidEx ( |
| 3397 | CPUID_SOC_VENDOR, CPUID_SOC_VENDOR_BRAND_STRING2, |
| 3398 | &Eax.Uint32, &Ebx.Uint32, &Ecx.Uint32, &Edx.Uint32 |
| 3399 | ); |
| 3400 | @endcode |
| 3401 | **/ |
| 3402 | #define CPUID_SOC_VENDOR_BRAND_STRING2 0x02 |
| 3403 | |
| 3404 | /** |
| 3405 | CPUID SoC Vendor Information |
| 3406 | |
| 3407 | @param EAX CPUID_SOC_VENDOR (0x17) |
| 3408 | @param ECX CPUID_SOC_VENDOR_BRAND_STRING3 (0x03) |
| 3409 | |
| 3410 | @retval EAX SOC Vendor Brand String. UTF-8 encoded string of type |
| 3411 | CPUID_SOC_VENDOR_BRAND_STRING_DATA. |
| 3412 | @retval EBX SOC Vendor Brand String. UTF-8 encoded string of type |
| 3413 | CPUID_SOC_VENDOR_BRAND_STRING_DATA. |
| 3414 | @retval ECX SOC Vendor Brand String. UTF-8 encoded string of type |
| 3415 | CPUID_SOC_VENDOR_BRAND_STRING_DATA. |
| 3416 | @retval EDX SOC Vendor Brand String. UTF-8 encoded string of type |
| 3417 | CPUID_SOC_VENDOR_BRAND_STRING_DATA. |
| 3418 | |
| 3419 | <b>Example usage</b> |
| 3420 | @code |
| 3421 | CPUID_SOC_VENDOR_BRAND_STRING_DATA Eax; |
| 3422 | CPUID_SOC_VENDOR_BRAND_STRING_DATA Ebx; |
| 3423 | CPUID_SOC_VENDOR_BRAND_STRING_DATA Ecx; |
| 3424 | CPUID_SOC_VENDOR_BRAND_STRING_DATA Edx; |
| 3425 | |
| 3426 | AsmCpuidEx ( |
| 3427 | CPUID_SOC_VENDOR, CPUID_SOC_VENDOR_BRAND_STRING3, |
| 3428 | &Eax.Uint32, &Ebx.Uint32, &Ecx.Uint32, &Edx.Uint32 |
| 3429 | ); |
| 3430 | @endcode |
| 3431 | **/ |
| 3432 | #define CPUID_SOC_VENDOR_BRAND_STRING3 0x03 |
| 3433 | |
| 3434 | /** |
| 3435 | CPUID Deterministic Address Translation Parameters |
| 3436 | |
| 3437 | @note |
| 3438 | Each sub-leaf enumerates a different address translation structure. |
| 3439 | If ECX contains an invalid sub-leaf index, EAX/EBX/ECX/EDX return 0. Sub-leaf |
| 3440 | index n is invalid if n exceeds the value that sub-leaf 0 returns in EAX. A |
| 3441 | sub-leaf index is also invalid if EDX[4:0] returns 0. |
| 3442 | Valid sub-leaves do not need to be contiguous or in any particular order. A |
| 3443 | valid sub-leaf may be in a higher input ECX value than an invalid sub-leaf or |
| 3444 | than a valid sub-leaf of a higher or lower-level structure. |
| 3445 | * Some unified TLBs will allow a single TLB entry to satisfy data read/write |
| 3446 | and instruction fetches. Others will require separate entries (e.g., one |
| 3447 | loaded on data read/write and another loaded on an instruction fetch). |
| 3448 | Please see the Intel 64 and IA-32 Architectures Optimization Reference Manual |
| 3449 | for details of a particular product. |
| 3450 | ** Add one to the return value to get the result. |
| 3451 | |
| 3452 | @param EAX CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS (0x18) |
| 3453 | @param ECX CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS_MAIN_LEAF (0x00) |
| 3454 | CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS_SUB_LEAF (0x*) |
| 3455 | |
| 3456 | **/ |
| 3457 | #define CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS 0x18 |
| 3458 | |
| 3459 | /** |
| 3460 | CPUID Deterministic Address Translation Parameters |
| 3461 | |
| 3462 | @param EAX CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS (0x18) |
| 3463 | @param ECX CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS_MAIN_LEAF (0x00) |
| 3464 | |
| 3465 | @retval EAX Reports the maximum input value of supported sub-leaf in leaf 18H. |
| 3466 | @retval EBX Returns Deterministic Address Translation Parameters described by |
| 3467 | the type CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS_EBX. |
| 3468 | @retval ECX Number of Sets. |
| 3469 | @retval EDX Returns Deterministic Address Translation Parameters described by |
| 3470 | the type CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS_EDX. |
| 3471 | |
| 3472 | <b>Example usage</b> |
| 3473 | @code |
| 3474 | UINT32 Eax; |
| 3475 | CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS_EBX Ebx; |
| 3476 | UINT32 Ecx; |
| 3477 | CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS_EDX Edx; |
| 3478 | |
| 3479 | AsmCpuidEx ( |
| 3480 | CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS, |
| 3481 | CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS_MAIN_LEAF, |
| 3482 | &Eax, &Ebx.Uint32, &Ecx, &Edx.Uint32 |
| 3483 | ); |
| 3484 | @endcode |
| 3485 | **/ |
| 3486 | #define CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS_MAIN_LEAF 0x00 |
| 3487 | |
| 3488 | /** |
| 3489 | CPUID Deterministic Address Translation Parameters EBX for CPUID leafs. |
| 3490 | **/ |
| 3491 | typedef union { |
| 3492 | /// |
| 3493 | /// Individual bit fields |
| 3494 | /// |
| 3495 | struct { |
| 3496 | /// |
| 3497 | /// [Bits 0] 4K page size entries supported by this structure. |
| 3498 | /// |
| 3499 | UINT32 Page4K : 1; |
| 3500 | /// |
| 3501 | /// [Bits 1] 2MB page size entries supported by this structure. |
| 3502 | /// |
| 3503 | UINT32 Page2M : 1; |
| 3504 | /// |
| 3505 | /// [Bits 2] 4MB page size entries supported by this structure. |
| 3506 | /// |
| 3507 | UINT32 Page4M : 1; |
| 3508 | /// |
| 3509 | /// [Bits 3] 1 GB page size entries supported by this structure. |
| 3510 | /// |
| 3511 | UINT32 Page1G : 1; |
| 3512 | /// |
| 3513 | /// [Bits 7:4] Reserved. |
| 3514 | /// |
| 3515 | UINT32 Reserved1 : 4; |
| 3516 | /// |
| 3517 | /// [Bits 10:8] Partitioning (0: Soft partitioning between the logical |
| 3518 | /// processors sharing this structure) |
| 3519 | /// |
| 3520 | UINT32 Partitioning : 3; |
| 3521 | /// |
| 3522 | /// [Bits 15:11] Reserved. |
| 3523 | /// |
| 3524 | UINT32 Reserved2 : 5; |
| 3525 | /// |
| 3526 | /// [Bits 31:16] W = Ways of associativity. |
| 3527 | /// |
| 3528 | UINT32 Way : 16; |
| 3529 | } Bits; |
| 3530 | /// |
| 3531 | /// All bit fields as a 32-bit value |
| 3532 | /// |
| 3533 | UINT32 Uint32; |
| 3534 | } CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS_EBX; |
| 3535 | |
| 3536 | /** |
| 3537 | CPUID Deterministic Address Translation Parameters EDX for CPUID leafs. |
| 3538 | **/ |
| 3539 | typedef union { |
| 3540 | /// |
| 3541 | /// Individual bit fields |
| 3542 | /// |
| 3543 | struct { |
| 3544 | /// |
| 3545 | /// [Bits 4:0] Translation cache type field. |
| 3546 | /// |
| 3547 | UINT32 TranslationCacheType : 5; |
| 3548 | /// |
| 3549 | /// [Bits 7:5] Translation cache level (starts at 1). |
| 3550 | /// |
| 3551 | UINT32 TranslationCacheLevel : 3; |
| 3552 | /// |
| 3553 | /// [Bits 8] Fully associative structure. |
| 3554 | /// |
| 3555 | UINT32 FullyAssociative : 1; |
| 3556 | /// |
| 3557 | /// [Bits 13:9] Reserved. |
| 3558 | /// |
| 3559 | UINT32 Reserved1 : 5; |
| 3560 | /// |
| 3561 | /// [Bits 25:14] Maximum number of addressable IDs for logical |
| 3562 | /// processors sharing this translation cache. |
| 3563 | /// |
| 3564 | UINT32 MaximumNum : 12; |
| 3565 | /// |
| 3566 | /// [Bits 31:26] Reserved. |
| 3567 | /// |
| 3568 | UINT32 Reserved2 : 6; |
| 3569 | } Bits; |
| 3570 | /// |
| 3571 | /// All bit fields as a 32-bit value |
| 3572 | /// |
| 3573 | UINT32 Uint32; |
| 3574 | } CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS_EDX; |
| 3575 | |
| 3576 | /// |
| 3577 | /// @{ Define value for CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS_EDX.TranslationCacheType |
| 3578 | /// |
| 3579 | #define CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS_TRANSLATION_CACHE_TYPE_INVALID 0x00 |
| 3580 | #define CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS_TRANSLATION_CACHE_TYPE_DATA_TLB 0x01 |
| 3581 | #define CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS_TRANSLATION_CACHE_TYPE_INSTRUCTION_TLB 0x02 |
| 3582 | #define CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS_TRANSLATION_CACHE_TYPE_UNIFIED_TLB 0x03 |
| 3583 | /// |
| 3584 | /// @} |
| 3585 | /// |
| 3586 | |
| 3587 | /** |
| 3588 | CPUID Hybrid Information Enumeration Leaf |
| 3589 | |
| 3590 | @param EAX CPUID_HYBRID_INFORMATION (0x1A) |
| 3591 | @param ECX CPUID_HYBRID_INFORMATION_MAIN_LEAF (0x00). |
| 3592 | |
| 3593 | @retval EAX Enumerates the native model ID and core type described |
| 3594 | by the type CPUID_NATIVE_MODEL_ID_AND_CORE_TYPE_EAX |
| 3595 | @retval EBX Reserved. |
| 3596 | @retval ECX Reserved. |
| 3597 | @retval EDX Reserved. |
| 3598 | |
| 3599 | <b>Example usage</b> |
| 3600 | @code |
| 3601 | CPUID_NATIVE_MODEL_ID_AND_CORE_TYPE_EAX Eax; |
| 3602 | |
| 3603 | AsmCpuidEx ( |
| 3604 | CPUID_HYBRID_INFORMATION, |
| 3605 | CPUID_HYBRID_INFORMATION_MAIN_LEAF, |
| 3606 | &Eax, NULL, NULL, NULL |
| 3607 | ); |
| 3608 | @endcode |
| 3609 | |
| 3610 | **/ |
| 3611 | #define CPUID_HYBRID_INFORMATION 0x1A |
| 3612 | |
| 3613 | /// |
| 3614 | /// CPUID Hybrid Information Enumeration main leaf |
| 3615 | /// |
| 3616 | #define CPUID_HYBRID_INFORMATION_MAIN_LEAF 0x00 |
| 3617 | |
| 3618 | /** |
| 3619 | CPUID Hybrid Information EAX for CPUID leaf #CPUID_HYBRID_INFORMATION, |
| 3620 | main leaf #CPUID_HYBRID_INFORMATION_MAIN_LEAF. |
| 3621 | **/ |
| 3622 | typedef union { |
| 3623 | /// |
| 3624 | /// Individual bit fields |
| 3625 | /// |
| 3626 | struct { |
| 3627 | /// |
| 3628 | /// [Bit 23:0] Native model ID of the core. |
| 3629 | /// |
| 3630 | /// The core-type and native mode ID can be used to uniquely identify |
| 3631 | /// the microarchitecture of the core.This native model ID is not unique |
| 3632 | /// across core types, and not related to the model ID reported in CPUID |
| 3633 | /// leaf 01H, and does not identify the SOC. |
| 3634 | /// |
| 3635 | UINT32 NativeModelId : 24; |
| 3636 | /// |
| 3637 | /// [Bit 31:24] Core type |
| 3638 | /// |
| 3639 | UINT32 CoreType : 8; |
| 3640 | } Bits; |
| 3641 | /// |
| 3642 | /// All bit fields as a 32-bit value |
| 3643 | /// |
| 3644 | UINT32 Uint32; |
| 3645 | } CPUID_NATIVE_MODEL_ID_AND_CORE_TYPE_EAX; |
| 3646 | |
| 3647 | /// |
| 3648 | /// @{ Define value for CPUID_NATIVE_MODEL_ID_AND_CORE_TYPE_EAX.CoreType |
| 3649 | /// |
| 3650 | #define CPUID_CORE_TYPE_INTEL_ATOM 0x20 |
| 3651 | #define CPUID_CORE_TYPE_INTEL_CORE 0x40 |
| 3652 | /// |
| 3653 | /// @} |
| 3654 | /// |
| 3655 | |
| 3656 | /** |
| 3657 | CPUID V2 Extended Topology Enumeration Leaf |
| 3658 | |
| 3659 | @note |
| 3660 | CPUID leaf 1FH is a preferred superset to leaf 0BH. Intel recommends first checking |
| 3661 | for the existence of Leaf 1FH and using this if available. |
| 3662 | Most of Leaf 1FH output depends on the initial value in ECX. The EDX output of leaf |
| 3663 | 1FH is always valid and does not vary with input value in ECX. Output value in ECX[7:0] |
| 3664 | always equals input value in ECX[7:0]. Sub-leaf index 0 enumerates SMT level. Each |
| 3665 | subsequent higher sub-leaf index enumerates a higher-level topological entity in |
| 3666 | hierarchical order. For sub-leaves that return an invalid level-type of 0 in ECX[15:8]; |
| 3667 | EAX and EBX will return 0. If an input value n in ECX returns the invalid level-type of |
| 3668 | 0 in ECX[15:8], other input values with ECX > n also return 0 in ECX[15:8]. |
| 3669 | |
| 3670 | Software should use this field (EAX[4:0]) to enumerate processor topology of the system. |
| 3671 | Software must not use EBX[15:0] to enumerate processor topology of the system. This value |
| 3672 | in this field (EBX[15:0]) is only intended for display/diagnostic purposes. The actual |
| 3673 | number of logical processors available to BIOS/OS/Applications may be different from the |
| 3674 | value of EBX[15:0], depending on software and platform hardware configurations. |
| 3675 | |
| 3676 | @param EAX CPUID_V2_EXTENDED_TOPOLOGY (0x1F) |
| 3677 | @param ECX Level number |
| 3678 | |
| 3679 | **/ |
| 3680 | #define CPUID_V2_EXTENDED_TOPOLOGY 0x1F |
| 3681 | |
| 3682 | /// |
| 3683 | /// @{ Define value for CPUID_EXTENDED_TOPOLOGY_ECX.LevelType |
| 3684 | /// The value of the "level type" field is not related to level numbers in |
| 3685 | /// any way, higher "level type" values do not mean higher levels. |
| 3686 | /// |
| 3687 | #define CPUID_V2_EXTENDED_TOPOLOGY_LEVEL_TYPE_MODULE 0x03 |
| 3688 | #define CPUID_V2_EXTENDED_TOPOLOGY_LEVEL_TYPE_TILE 0x04 |
| 3689 | #define CPUID_V2_EXTENDED_TOPOLOGY_LEVEL_TYPE_DIE 0x05 |
| 3690 | /// |
| 3691 | /// @} |
| 3692 | /// |
| 3693 | |
| 3694 | /** |
| 3695 | CPUID Guest TD Run Time Environment Enumeration Leaf |
| 3696 | |
| 3697 | @note |
| 3698 | Guest software can be designed to run either as a TD, as a legacy virtual machine, |
| 3699 | or directly on the CPU, based on enumeration of its run-time environment. |
| 3700 | CPUID leaf 21H emulation is done by the Intel TDX module. Sub-leaf 0 returns the values |
| 3701 | shown below. Other sub-leaves return 0 in EAX/EBX/ECX/EDX. |
| 3702 | EAX: 0x00000000 |
| 3703 | EBX: 0x65746E49 "Inte" |
| 3704 | ECX: 0x20202020 " " |
| 3705 | EDX: 0x5844546C "lTDX" |
| 3706 | |
| 3707 | @param EAX CPUID_GUESTTD_RUNTIME_ENVIRONMENT (0x21) |
| 3708 | @param ECX Level number |
| 3709 | |
| 3710 | **/ |
| 3711 | #define CPUID_GUESTTD_RUNTIME_ENVIRONMENT 0x21 |
| 3712 | |
| 3713 | /// |
| 3714 | /// @{ CPUID Guest TD signature values returned by Intel processors |
| 3715 | /// |
| 3716 | #define CPUID_GUESTTD_SIGNATURE_GENUINE_INTEL_EBX SIGNATURE_32 ('I', 'n', 't', 'e') |
| 3717 | #define CPUID_GUESTTD_SIGNATURE_GENUINE_INTEL_ECX SIGNATURE_32 (' ', ' ', ' ', ' ') |
| 3718 | #define CPUID_GUESTTD_SIGNATURE_GENUINE_INTEL_EDX SIGNATURE_32 ('l', 'T', 'D', 'X') |
| 3719 | /// |
| 3720 | /// @} |
| 3721 | /// |
| 3722 | |
| 3723 | /** |
| 3724 | CPUID Extended Function |
| 3725 | |
| 3726 | @param EAX CPUID_EXTENDED_FUNCTION (0x80000000) |
| 3727 | |
| 3728 | @retval EAX Maximum Input Value for Extended Function CPUID Information. |
| 3729 | @retval EBX Reserved. |
| 3730 | @retval ECX Reserved. |
| 3731 | @retval EDX Reserved. |
| 3732 | |
| 3733 | <b>Example usage</b> |
| 3734 | @code |
| 3735 | UINT32 Eax; |
| 3736 | |
| 3737 | AsmCpuid (CPUID_EXTENDED_FUNCTION, &Eax, NULL, NULL, NULL); |
| 3738 | @endcode |
| 3739 | **/ |
| 3740 | #define CPUID_EXTENDED_FUNCTION 0x80000000 |
| 3741 | |
| 3742 | /** |
| 3743 | CPUID Extended Processor Signature and Feature Bits |
| 3744 | |
| 3745 | @param EAX CPUID_EXTENDED_CPU_SIG (0x80000001) |
| 3746 | |
| 3747 | @retval EAX CPUID_EXTENDED_CPU_SIG. |
| 3748 | @retval EBX Reserved. |
| 3749 | @retval ECX Extended Processor Signature and Feature Bits information |
| 3750 | described by the type CPUID_EXTENDED_CPU_SIG_ECX. |
| 3751 | @retval EDX Extended Processor Signature and Feature Bits information |
| 3752 | described by the type CPUID_EXTENDED_CPU_SIG_EDX. |
| 3753 | |
| 3754 | <b>Example usage</b> |
| 3755 | @code |
| 3756 | UINT32 Eax; |
| 3757 | CPUID_EXTENDED_CPU_SIG_ECX Ecx; |
| 3758 | CPUID_EXTENDED_CPU_SIG_EDX Edx; |
| 3759 | |
| 3760 | AsmCpuid (CPUID_EXTENDED_CPU_SIG, &Eax, NULL, &Ecx.Uint32, &Edx.Uint32); |
| 3761 | @endcode |
| 3762 | **/ |
| 3763 | #define CPUID_EXTENDED_CPU_SIG 0x80000001 |
| 3764 | |
| 3765 | /** |
| 3766 | CPUID Extended Processor Signature and Feature Bits ECX for CPUID leaf |
| 3767 | #CPUID_EXTENDED_CPU_SIG. |
| 3768 | **/ |
| 3769 | typedef union { |
| 3770 | /// |
| 3771 | /// Individual bit fields |
| 3772 | /// |
| 3773 | struct { |
| 3774 | /// |
| 3775 | /// [Bit 0] LAHF/SAHF available in 64-bit mode. |
| 3776 | /// |
| 3777 | UINT32 LAHF_SAHF : 1; |
| 3778 | UINT32 Reserved1 : 4; |
| 3779 | /// |
| 3780 | /// [Bit 5] LZCNT. |
| 3781 | /// |
| 3782 | UINT32 LZCNT : 1; |
| 3783 | UINT32 Reserved2 : 2; |
| 3784 | /// |
| 3785 | /// [Bit 8] PREFETCHW. |
| 3786 | /// |
| 3787 | UINT32 PREFETCHW : 1; |
| 3788 | UINT32 Reserved3 : 23; |
| 3789 | } Bits; |
| 3790 | /// |
| 3791 | /// All bit fields as a 32-bit value |
| 3792 | /// |
| 3793 | UINT32 Uint32; |
| 3794 | } CPUID_EXTENDED_CPU_SIG_ECX; |
| 3795 | |
| 3796 | /** |
| 3797 | CPUID Extended Processor Signature and Feature Bits EDX for CPUID leaf |
| 3798 | #CPUID_EXTENDED_CPU_SIG. |
| 3799 | **/ |
| 3800 | typedef union { |
| 3801 | /// |
| 3802 | /// Individual bit fields |
| 3803 | /// |
| 3804 | struct { |
| 3805 | UINT32 Reserved1 : 11; |
| 3806 | /// |
| 3807 | /// [Bit 11] SYSCALL/SYSRET available in 64-bit mode. |
| 3808 | /// |
| 3809 | UINT32 SYSCALL_SYSRET : 1; |
| 3810 | UINT32 Reserved2 : 8; |
| 3811 | /// |
| 3812 | /// [Bit 20] Execute Disable Bit available. |
| 3813 | /// |
| 3814 | UINT32 NX : 1; |
| 3815 | UINT32 Reserved3 : 5; |
| 3816 | /// |
| 3817 | /// [Bit 26] 1-GByte pages are available if 1. |
| 3818 | /// |
| 3819 | UINT32 Page1GB : 1; |
| 3820 | /// |
| 3821 | /// [Bit 27] RDTSCP and IA32_TSC_AUX are available if 1. |
| 3822 | /// |
| 3823 | UINT32 RDTSCP : 1; |
| 3824 | UINT32 Reserved4 : 1; |
| 3825 | /// |
| 3826 | /// [Bit 29] Intel(R) 64 Architecture available if 1. |
| 3827 | /// |
| 3828 | UINT32 LM : 1; |
| 3829 | UINT32 Reserved5 : 2; |
| 3830 | } Bits; |
| 3831 | /// |
| 3832 | /// All bit fields as a 32-bit value |
| 3833 | /// |
| 3834 | UINT32 Uint32; |
| 3835 | } CPUID_EXTENDED_CPU_SIG_EDX; |
| 3836 | |
| 3837 | /** |
| 3838 | CPUID Processor Brand String |
| 3839 | |
| 3840 | @param EAX CPUID_BRAND_STRING1 (0x80000002) |
| 3841 | |
| 3842 | @retval EAX Processor Brand String in type CPUID_BRAND_STRING_DATA. |
| 3843 | @retval EBX Processor Brand String Continued in type CPUID_BRAND_STRING_DATA. |
| 3844 | @retval ECX Processor Brand String Continued in type CPUID_BRAND_STRING_DATA. |
| 3845 | @retval EDX Processor Brand String Continued in type CPUID_BRAND_STRING_DATA. |
| 3846 | |
| 3847 | <b>Example usage</b> |
| 3848 | @code |
| 3849 | CPUID_BRAND_STRING_DATA Eax; |
| 3850 | CPUID_BRAND_STRING_DATA Ebx; |
| 3851 | CPUID_BRAND_STRING_DATA Ecx; |
| 3852 | CPUID_BRAND_STRING_DATA Edx; |
| 3853 | |
| 3854 | AsmCpuid (CPUID_BRAND_STRING1, &Eax.Uint32, &Ebx.Uint32, &Ecx.Uint32, &Edx.Uint32); |
| 3855 | @endcode |
| 3856 | **/ |
| 3857 | #define CPUID_BRAND_STRING1 0x80000002 |
| 3858 | |
| 3859 | /** |
| 3860 | CPUID Processor Brand String for CPUID leafs #CPUID_BRAND_STRING1, |
| 3861 | #CPUID_BRAND_STRING2, and #CPUID_BRAND_STRING3. |
| 3862 | **/ |
| 3863 | typedef union { |
| 3864 | /// |
| 3865 | /// 4 ASCII characters of Processor Brand String |
| 3866 | /// |
| 3867 | CHAR8 BrandString[4]; |
| 3868 | /// |
| 3869 | /// All fields as a 32-bit value |
| 3870 | /// |
| 3871 | UINT32 Uint32; |
| 3872 | } CPUID_BRAND_STRING_DATA; |
| 3873 | |
| 3874 | /** |
| 3875 | CPUID Processor Brand String |
| 3876 | |
| 3877 | @param EAX CPUID_BRAND_STRING2 (0x80000003) |
| 3878 | |
| 3879 | @retval EAX Processor Brand String Continued in type CPUID_BRAND_STRING_DATA. |
| 3880 | @retval EBX Processor Brand String Continued in type CPUID_BRAND_STRING_DATA. |
| 3881 | @retval ECX Processor Brand String Continued in type CPUID_BRAND_STRING_DATA. |
| 3882 | @retval EDX Processor Brand String Continued in type CPUID_BRAND_STRING_DATA. |
| 3883 | |
| 3884 | <b>Example usage</b> |
| 3885 | @code |
| 3886 | CPUID_BRAND_STRING_DATA Eax; |
| 3887 | CPUID_BRAND_STRING_DATA Ebx; |
| 3888 | CPUID_BRAND_STRING_DATA Ecx; |
| 3889 | CPUID_BRAND_STRING_DATA Edx; |
| 3890 | |
| 3891 | AsmCpuid (CPUID_BRAND_STRING2, &Eax.Uint32, &Ebx.Uint32, &Ecx.Uint32, &Edx.Uint32); |
| 3892 | @endcode |
| 3893 | **/ |
| 3894 | #define CPUID_BRAND_STRING2 0x80000003 |
| 3895 | |
| 3896 | /** |
| 3897 | CPUID Processor Brand String |
| 3898 | |
| 3899 | @param EAX CPUID_BRAND_STRING3 (0x80000004) |
| 3900 | |
| 3901 | @retval EAX Processor Brand String Continued in type CPUID_BRAND_STRING_DATA. |
| 3902 | @retval EBX Processor Brand String Continued in type CPUID_BRAND_STRING_DATA. |
| 3903 | @retval ECX Processor Brand String Continued in type CPUID_BRAND_STRING_DATA. |
| 3904 | @retval EDX Processor Brand String Continued in type CPUID_BRAND_STRING_DATA. |
| 3905 | |
| 3906 | <b>Example usage</b> |
| 3907 | @code |
| 3908 | CPUID_BRAND_STRING_DATA Eax; |
| 3909 | CPUID_BRAND_STRING_DATA Ebx; |
| 3910 | CPUID_BRAND_STRING_DATA Ecx; |
| 3911 | CPUID_BRAND_STRING_DATA Edx; |
| 3912 | |
| 3913 | AsmCpuid (CPUID_BRAND_STRING3, &Eax.Uint32, &Ebx.Uint32, &Ecx.Uint32, &Edx.Uint32); |
| 3914 | @endcode |
| 3915 | **/ |
| 3916 | #define CPUID_BRAND_STRING3 0x80000004 |
| 3917 | |
| 3918 | /** |
| 3919 | CPUID Extended Cache information |
| 3920 | |
| 3921 | @param EAX CPUID_EXTENDED_CACHE_INFO (0x80000006) |
| 3922 | |
| 3923 | @retval EAX Reserved. |
| 3924 | @retval EBX Reserved. |
| 3925 | @retval ECX Extended cache information described by the type |
| 3926 | CPUID_EXTENDED_CACHE_INFO_ECX. |
| 3927 | @retval EDX Reserved. |
| 3928 | |
| 3929 | <b>Example usage</b> |
| 3930 | @code |
| 3931 | CPUID_EXTENDED_CACHE_INFO_ECX Ecx; |
| 3932 | |
| 3933 | AsmCpuid (CPUID_EXTENDED_CACHE_INFO, NULL, NULL, &Ecx.Uint32, NULL); |
| 3934 | @endcode |
| 3935 | **/ |
| 3936 | #define CPUID_EXTENDED_CACHE_INFO 0x80000006 |
| 3937 | |
| 3938 | /** |
| 3939 | CPUID Extended Cache information ECX for CPUID leaf #CPUID_EXTENDED_CACHE_INFO. |
| 3940 | **/ |
| 3941 | typedef union { |
| 3942 | /// |
| 3943 | /// Individual bit fields |
| 3944 | /// |
| 3945 | struct { |
| 3946 | /// |
| 3947 | /// [Bits 7:0] Cache line size in bytes. |
| 3948 | /// |
| 3949 | UINT32 CacheLineSize : 8; |
| 3950 | UINT32 Reserved : 4; |
| 3951 | /// |
| 3952 | /// [Bits 15:12] L2 Associativity field. Supported values are in the range |
| 3953 | /// #CPUID_EXTENDED_CACHE_INFO_ECX_L2_ASSOCIATIVITY_DISABLED to |
| 3954 | /// #CPUID_EXTENDED_CACHE_INFO_ECX_L2_ASSOCIATIVITY_FULL |
| 3955 | /// |
| 3956 | UINT32 L2Associativity : 4; |
| 3957 | /// |
| 3958 | /// [Bits 31:16] Cache size in 1K units. |
| 3959 | /// |
| 3960 | UINT32 CacheSize : 16; |
| 3961 | } Bits; |
| 3962 | /// |
| 3963 | /// All bit fields as a 32-bit value |
| 3964 | /// |
| 3965 | UINT32 Uint32; |
| 3966 | } CPUID_EXTENDED_CACHE_INFO_ECX; |
| 3967 | |
| 3968 | /// |
| 3969 | /// @{ Define value for bit field CPUID_EXTENDED_CACHE_INFO_ECX.L2Associativity |
| 3970 | /// |
| 3971 | #define CPUID_EXTENDED_CACHE_INFO_ECX_L2_ASSOCIATIVITY_DISABLED 0x00 |
| 3972 | #define CPUID_EXTENDED_CACHE_INFO_ECX_L2_ASSOCIATIVITY_DIRECT_MAPPED 0x01 |
| 3973 | #define CPUID_EXTENDED_CACHE_INFO_ECX_L2_ASSOCIATIVITY_2_WAY 0x02 |
| 3974 | #define CPUID_EXTENDED_CACHE_INFO_ECX_L2_ASSOCIATIVITY_4_WAY 0x04 |
| 3975 | #define CPUID_EXTENDED_CACHE_INFO_ECX_L2_ASSOCIATIVITY_8_WAY 0x06 |
| 3976 | #define CPUID_EXTENDED_CACHE_INFO_ECX_L2_ASSOCIATIVITY_16_WAY 0x08 |
| 3977 | #define CPUID_EXTENDED_CACHE_INFO_ECX_L2_ASSOCIATIVITY_32_WAY 0x0A |
| 3978 | #define CPUID_EXTENDED_CACHE_INFO_ECX_L2_ASSOCIATIVITY_48_WAY 0x0B |
| 3979 | #define CPUID_EXTENDED_CACHE_INFO_ECX_L2_ASSOCIATIVITY_64_WAY 0x0C |
| 3980 | #define CPUID_EXTENDED_CACHE_INFO_ECX_L2_ASSOCIATIVITY_96_WAY 0x0D |
| 3981 | #define CPUID_EXTENDED_CACHE_INFO_ECX_L2_ASSOCIATIVITY_128_WAY 0x0E |
| 3982 | #define CPUID_EXTENDED_CACHE_INFO_ECX_L2_ASSOCIATIVITY_FULL 0x0F |
| 3983 | /// |
| 3984 | /// @} |
| 3985 | /// |
| 3986 | |
| 3987 | /** |
| 3988 | CPUID Extended Time Stamp Counter information |
| 3989 | |
| 3990 | @param EAX CPUID_EXTENDED_TIME_STAMP_COUNTER (0x80000007) |
| 3991 | |
| 3992 | @retval EAX Reserved. |
| 3993 | @retval EBX Reserved. |
| 3994 | @retval ECX Reserved. |
| 3995 | @retval EDX Extended time stamp counter (TSC) information described by the |
| 3996 | type CPUID_EXTENDED_TIME_STAMP_COUNTER_EDX. |
| 3997 | |
| 3998 | <b>Example usage</b> |
| 3999 | @code |
| 4000 | CPUID_EXTENDED_TIME_STAMP_COUNTER_EDX Edx; |
| 4001 | |
| 4002 | AsmCpuid (CPUID_EXTENDED_TIME_STAMP_COUNTER, NULL, NULL, NULL, &Edx.Uint32); |
| 4003 | @endcode |
| 4004 | **/ |
| 4005 | #define CPUID_EXTENDED_TIME_STAMP_COUNTER 0x80000007 |
| 4006 | |
| 4007 | /** |
| 4008 | CPUID Extended Time Stamp Counter information EDX for CPUID leaf |
| 4009 | #CPUID_EXTENDED_TIME_STAMP_COUNTER. |
| 4010 | **/ |
| 4011 | typedef union { |
| 4012 | /// |
| 4013 | /// Individual bit fields |
| 4014 | /// |
| 4015 | struct { |
| 4016 | UINT32 Reserved1 : 8; |
| 4017 | /// |
| 4018 | /// [Bit 8] Invariant TSC available if 1. |
| 4019 | /// |
| 4020 | UINT32 InvariantTsc : 1; |
| 4021 | UINT32 Reserved2 : 23; |
| 4022 | } Bits; |
| 4023 | /// |
| 4024 | /// All bit fields as a 32-bit value |
| 4025 | /// |
| 4026 | UINT32 Uint32; |
| 4027 | } CPUID_EXTENDED_TIME_STAMP_COUNTER_EDX; |
| 4028 | |
| 4029 | /** |
| 4030 | CPUID Linear Physical Address Size |
| 4031 | |
| 4032 | @param EAX CPUID_VIR_PHY_ADDRESS_SIZE (0x80000008) |
| 4033 | |
| 4034 | @retval EAX Linear/Physical Address Size described by the type |
| 4035 | CPUID_VIR_PHY_ADDRESS_SIZE_EAX. |
| 4036 | @retval EBX Reserved. |
| 4037 | @retval ECX Reserved. |
| 4038 | @retval EDX Reserved. |
| 4039 | |
| 4040 | <b>Example usage</b> |
| 4041 | @code |
| 4042 | CPUID_VIR_PHY_ADDRESS_SIZE_EAX Eax; |
| 4043 | |
| 4044 | AsmCpuid (CPUID_VIR_PHY_ADDRESS_SIZE, &Eax.Uint32, NULL, NULL, NULL); |
| 4045 | @endcode |
| 4046 | **/ |
| 4047 | #define CPUID_VIR_PHY_ADDRESS_SIZE 0x80000008 |
| 4048 | |
| 4049 | /** |
| 4050 | CPUID Linear Physical Address Size EAX for CPUID leaf |
| 4051 | #CPUID_VIR_PHY_ADDRESS_SIZE. |
| 4052 | **/ |
| 4053 | typedef union { |
| 4054 | /// |
| 4055 | /// Individual bit fields |
| 4056 | /// |
| 4057 | struct { |
| 4058 | /// |
| 4059 | /// [Bits 7:0] Number of physical address bits. |
| 4060 | /// |
| 4061 | /// @note |
| 4062 | /// If CPUID.80000008H:EAX[7:0] is supported, the maximum physical address |
| 4063 | /// number supported should come from this field. |
| 4064 | /// |
| 4065 | UINT32 PhysicalAddressBits : 8; |
| 4066 | /// |
| 4067 | /// [Bits 15:8] Number of linear address bits. |
| 4068 | /// |
| 4069 | UINT32 LinearAddressBits : 8; |
| 4070 | UINT32 Reserved : 16; |
| 4071 | } Bits; |
| 4072 | /// |
| 4073 | /// All bit fields as a 32-bit value |
| 4074 | /// |
| 4075 | UINT32 Uint32; |
| 4076 | } CPUID_VIR_PHY_ADDRESS_SIZE_EAX; |
| 4077 | |
| 4078 | #endif |