119
119
CPUIDLEVEL(FALSE, A, 0xA) \
120
120
CPUIDLEVEL(TRUE, D, 0xD) \
121
121
CPUIDLEVEL(FALSE,400, 0x40000000) \
122
CPUIDLEVEL(FALSE,401, 0x40000001) \
123
CPUIDLEVEL(FALSE,402, 0x40000002) \
124
CPUIDLEVEL(FALSE,403, 0x40000003) \
125
CPUIDLEVEL(FALSE,404, 0x40000004) \
122
126
CPUIDLEVEL(FALSE,410, 0x40000010) \
123
127
CPUIDLEVEL(FALSE, 80, 0x80000000) \
124
128
CPUIDLEVEL(TRUE, 81, 0x80000001) \
364
368
FIELD( 4, 0, EBX, INTEL, 22, 10, LEAF4_CACHE_WAYS, NA, FALSE) \
365
369
FIELD( 4, 0, ECX, INTEL, 0, 32, LEAF4_CACHE_SETS, NA, FALSE) \
366
370
FLAG( 4, 0, EDX, INTEL, 0, 1, LEAF4_CACHE_WBINVD_NOT_GUARANTEED, NA, FALSE) \
367
FLAG( 4, 0, EDX, INTEL, 1, 1, LEAF4_CACHE_IS_INCLUSIVE, NA, FALSE)
371
FLAG( 4, 0, EDX, INTEL, 1, 1, LEAF4_CACHE_IS_INCLUSIVE, NA, FALSE) \
372
FLAG( 4, 0, EDX, INTEL, 2, 1, LEAF4_CACHE_COMPLEX_INDEXING, NA, FALSE)
369
374
/* LEVEL, SUB-LEVEL, REG, VENDOR, POS, SIZE, NAME, MON SUPP, CPL3 */
370
375
#define CPUID_FIELD_DATA_LEVEL_5 \
390
395
/* LEVEL, SUB-LEVEL, REG, VENDOR, POS, SIZE, NAME, MON SUPP, CPL3 */
391
396
#define CPUID_FIELD_DATA_LEVEL_7 \
392
397
FLAG( 7, 0, EBX, INTEL, 0, 1, FSGSBASE, YES, FALSE) \
393
FLAG( 7, 0, EBX, AMD, 3, 1, BMI1, YES, TRUE ) \
398
FLAG( 7, 0, EBX, COMMON, 3, 1, BMI1, YES, TRUE ) \
399
FLAG( 7, 0, EBX, INTEL, 4, 1, HLE, YES, TRUE) \
400
FLAG( 7, 0, EBX, INTEL, 5, 1, AVX2, YES, TRUE) \
394
401
FLAG( 7, 0, EBX, INTEL, 7, 1, SMEP, YES, FALSE) \
402
FLAG( 7, 0, EBX, INTEL, 8, 1, BMI2, YES, TRUE) \
395
403
FLAG( 7, 0, EBX, INTEL, 9, 1, ENFSTRG, YES, FALSE) \
396
FLAG( 7, 0, EBX, INTEL, 10, 1, INVPCID, NO, FALSE)
404
FLAG( 7, 0, EBX, INTEL, 10, 1, INVPCID, NO, FALSE) \
405
FLAG( 7, 0, EBX, INTEL, 11, 1, RTM, NO, TRUE)
398
407
/* LEVEL, SUB-LEVEL, REG, VENDOR, POS, SIZE, NAME, MON SUPP, CPL3 */
399
408
#define CPUID_FIELD_DATA_LEVEL_A \
480
489
FLAG( 81, 0, ECX, AMD, 2, 1, SVM, YES, FALSE) \
481
490
FLAG( 81, 0, ECX, AMD, 3, 1, EXTAPICSPC, YES, FALSE) \
482
491
FLAG( 81, 0, ECX, AMD, 4, 1, CR8AVAIL, YES, FALSE) \
483
FLAG( 81, 0, ECX, AMD, 5, 1, ABM, YES, TRUE) \
492
FLAG( 81, 0, ECX, COMMON, 5, 1, ABM, YES, TRUE) \
484
493
FLAG( 81, 0, ECX, AMD, 6, 1, SSE4A, YES, TRUE) \
485
494
FLAG( 81, 0, ECX, AMD, 7, 1, MISALIGNED_SSE, YES, TRUE) \
486
495
FLAG( 81, 0, ECX, AMD, 8, 1, 3DNPREFETCH, YES, TRUE) \
863
872
#define CPUID_SET(eaxIn, reg, flag, dataPtr) \
865
ASSERT_ON_COMPILE((uint32)eaxIn == (uint32)CPUID_INTERNAL_EAXIN_##flag && \
866
CPUID_REG_##reg == (CpuidReg)CPUID_INTERNAL_REG_##flag); \
875
(uint32)eaxIn == (uint32)CPUID_INTERNAL_EAXIN_##flag && \
876
CPUID_REG_##reg == (CpuidReg)CPUID_INTERNAL_REG_##flag); \
867
877
*(dataPtr) |= CPUID_INTERNAL_MASK_##flag; \
870
880
#define CPUID_CLEAR(eaxIn, reg, flag, dataPtr) \
872
ASSERT_ON_COMPILE((uint32)eaxIn == (uint32)CPUID_INTERNAL_EAXIN_##flag && \
873
CPUID_REG_##reg == (CpuidReg)CPUID_INTERNAL_REG_##flag); \
883
(uint32)eaxIn == (uint32)CPUID_INTERNAL_EAXIN_##flag && \
884
CPUID_REG_##reg == (CpuidReg)CPUID_INTERNAL_REG_##flag); \
874
885
*(dataPtr) &= ~CPUID_INTERNAL_MASK_##flag; \
879
890
uint32 _v = val; \
880
891
uint32 *_d = dataPtr; \
881
ASSERT_ON_COMPILE((uint32)eaxIn == (uint32)CPUID_INTERNAL_EAXIN_##field && \
882
CPUID_REG_##reg == (CpuidReg)CPUID_INTERNAL_REG_##field); \
893
(uint32)eaxIn == (uint32)CPUID_INTERNAL_EAXIN_##field && \
894
CPUID_REG_##reg == (CpuidReg)CPUID_INTERNAL_REG_##field); \
883
895
*_d = (*_d & ~CPUID_INTERNAL_MASK_##field) | \
884
896
(_v << CPUID_INTERNAL_SHIFT_##field); \
885
897
ASSERT(_v == (*_d & CPUID_INTERNAL_MASK_##field) >> \
886
898
CPUID_INTERNAL_SHIFT_##field); \
901
#define CPUID_SETTO_SAFE(eaxIn, reg, field, dataPtr, val) \
904
(CPUID_INTERNAL_MASK_##field >> CPUID_INTERNAL_SHIFT_##field); \
905
uint32 *_d = dataPtr; \
907
(uint32)eaxIn == (uint32)CPUID_INTERNAL_EAXIN_##field && \
908
CPUID_REG_##reg == (CpuidReg)CPUID_INTERNAL_REG_##field); \
909
*_d = (*_d & ~CPUID_INTERNAL_MASK_##field) | \
910
(_v << CPUID_INTERNAL_SHIFT_##field); \
891
915
* Definitions of various fields' values and more complicated