Rework _CPU_FEATURES structure

This commit is contained in:
Pedro Valadés 2023-11-27 22:04:31 +01:00
parent 323c173abe
commit 289b1bdebc
No known key found for this signature in database
GPG Key ID: 25780ED196EFD8F5
2 changed files with 165 additions and 144 deletions

View File

@ -111,7 +111,7 @@
#define X86_EFLAGS_ID_MASK 0x00200000 #define X86_EFLAGS_ID_MASK 0x00200000
/* CPUID vendor names */ /* CPUID vendor names */
#define CPUID_VENDOR_NAME_AMD "AuthenticAMD" #define CPUID_VENDOR_NAME_AMD "AuthenticAMD"
#define CPUID_VENDOR_NAME_INTEL "GenuineIntel" #define CPUID_VENDOR_NAME_INTEL "GenuineIntel"
/* CPU vendor enumeration list */ /* CPU vendor enumeration list */
@ -190,81 +190,89 @@ typedef enum _CPUID_FEATURES
} CPUID_FEATURES, *PCPUID_FEATURES; } CPUID_FEATURES, *PCPUID_FEATURES;
/* CPU features, as reported by CPUID instruction */ /* CPU features, as reported by CPUID instruction */
typedef struct _CPU_FEATURES { typedef union _CPU_FEATURES
union { {
struct { UINT64 Value;
BOOLEAN SSE3 : 1; union
BOOLEAN PCLMUL : 1; {
BOOLEAN DTES64 : 1; UINT32 Ecx;
BOOLEAN MONITOR : 1; UINT32 ExtendedFeatures;
BOOLEAN DS_CPL : 1; struct
BOOLEAN VMX : 1; {
BOOLEAN SMX : 1; BYTE SSE3 : 1;
BOOLEAN EST : 1; BYTE PCLMUL : 1;
BOOLEAN TM2 : 1; BYTE DTES64 : 1;
BOOLEAN SSSE3 : 1; BYTE MONITOR : 1;
BOOLEAN CID : 1; BYTE DS_CPL : 1;
BOOLEAN SDBG : 1; BYTE VMX : 1;
BOOLEAN FMA : 1; BYTE SMX : 1;
BOOLEAN CX16 : 1; BYTE EST : 1;
BOOLEAN XTPR : 1; BYTE TM2 : 1;
BOOLEAN PDCM : 1; BYTE SSSE3 : 1;
BOOLEAN Reserved1 : 1; // Bit 16 is reserved BYTE CID : 1;
BOOLEAN PCID : 1; BYTE SDBG : 1;
BOOLEAN DCA : 1; BYTE FMA : 1;
BOOLEAN SSE4_1 : 1; BYTE CX16 : 1;
BOOLEAN SSE4_2 : 1; BYTE XTPR : 1;
BOOLEAN X2APIC : 1; BYTE PDCM : 1;
BOOLEAN MOVBE : 1; BYTE Reserved4 : 1; // Bit 16 is reserved
BOOLEAN POPCNT : 1; BYTE PCID : 1;
BOOLEAN TSC_DEADLINE : 1; BYTE DCA : 1;
BOOLEAN AES : 1; BYTE SSE4_1 : 1;
BOOLEAN XSAVE : 1; BYTE SSE4_2 : 1;
BOOLEAN OSXSAVE : 1; BYTE X2APIC : 1;
BOOLEAN AVX : 1; BYTE MOVBE : 1;
BOOLEAN F16C : 1; BYTE POPCNT : 1;
BOOLEAN RDRAND : 1; BYTE TSC_DEADLINE : 1;
BOOLEAN HYPERVISOR : 1; BYTE AES : 1;
BYTE XSAVE : 1;
BYTE OSXSAVE : 1;
BYTE AVX : 1;
BYTE F16C : 1;
BYTE RDRAND : 1;
BYTE HYPERVISOR : 1;
};
}; };
UINT32 ExtendedFeatures; union
}; {
union { UINT32 Edx;
struct { UINT32 Features;
BOOLEAN FPU : 1; struct
BOOLEAN VME : 1; {
BOOLEAN DE : 1; BYTE FPU : 1;
BOOLEAN PSE : 1; BYTE VME : 1;
BOOLEAN TSC : 1; BYTE DE : 1;
BOOLEAN MSR : 1; BYTE PSE : 1;
BOOLEAN PAE : 1; BYTE TSC : 1;
BOOLEAN MCE : 1; BYTE MSR : 1;
BOOLEAN CX8 : 1; BYTE PAE : 1;
BOOLEAN APIC : 1; BYTE MCE : 1;
BOOLEAN Reserved2 : 1; // Bit 10 is reserved BYTE CX8 : 1;
BOOLEAN SEP : 1; BYTE APIC : 1;
BOOLEAN MTRR : 1; BYTE Reserved1 : 1; // Bit 10 is reserved
BOOLEAN PGE : 1; BYTE SEP : 1;
BOOLEAN MCA : 1; BYTE MTRR : 1;
BOOLEAN CMOV : 1; BYTE PGE : 1;
BOOLEAN PAT : 1; BYTE MCA : 1;
BOOLEAN PSE36 : 1; BYTE CMOV : 1;
BOOLEAN PSN : 1; BYTE PAT : 1;
BOOLEAN CLFLUSH : 1; BYTE PSE36 : 1;
BOOLEAN Reserved3 : 1; // Bit 20 is reserved BYTE PSN : 1;
BOOLEAN DS : 1; BYTE CLFLUSH : 1;
BOOLEAN ACPI : 1; BYTE Reserved2 : 1; // Bit 20 is reserved
BOOLEAN MMX : 1; BYTE DS : 1;
BOOLEAN FXSR : 1; BYTE ACPI : 1;
BOOLEAN SSE : 1; BYTE MMX : 1;
BOOLEAN SSE2 : 1; BYTE FXSR : 1;
BOOLEAN SS : 1; BYTE SSE : 1;
BOOLEAN HTT : 1; BYTE SSE2 : 1;
BOOLEAN TM : 1; BYTE SS : 1;
BOOLEAN Reserved4 : 1; // Bit 30 is reserved BYTE HTT : 1;
BOOLEAN PBE : 1; BYTE TM : 1;
BYTE Reserved3 : 1; // Bit 30 is reserved
BYTE PBE : 1;
};
}; };
UINT64 Features;
};
} CPU_FEATURES, *PCPU_FEATURES; } CPU_FEATURES, *PCPU_FEATURES;
/* CPUID requests */ /* CPUID requests */

View File

@ -62,7 +62,7 @@
#define SEGMENT_GS 0x65 #define SEGMENT_GS 0x65
/* CPUID vendor names */ /* CPUID vendor names */
#define CPUID_VENDOR_NAME_AMD "AuthenticAMD" #define CPUID_VENDOR_NAME_AMD "AuthenticAMD"
#define CPUID_VENDOR_NAME_INTEL "GenuineIntel" #define CPUID_VENDOR_NAME_INTEL "GenuineIntel"
/* CPU vendor enumeration list */ /* CPU vendor enumeration list */
@ -141,76 +141,89 @@ typedef enum _CPUID_FEATURES
} CPUID_FEATURES, *PCPUID_FEATURES; } CPUID_FEATURES, *PCPUID_FEATURES;
/* CPU features, as reported by CPUID instruction */ /* CPU features, as reported by CPUID instruction */
typedef struct _CPU_FEATURES { typedef union _CPU_FEATURES
union { {
struct { UINT64 Value;
BOOLEAN SSE3 : 1; union
BOOLEAN PCLMUL : 1; {
BOOLEAN DTES64 : 1; UINT32 Ecx;
BOOLEAN MONITOR : 1; UINT32 ExtendedFeatures;
BOOLEAN DS_CPL : 1; struct
BOOLEAN VMX : 1; {
BOOLEAN SMX : 1; BYTE SSE3 : 1;
BOOLEAN EST : 1; BYTE PCLMUL : 1;
BOOLEAN TM2 : 1; BYTE DTES64 : 1;
BOOLEAN SSSE3 : 1; BYTE MONITOR : 1;
BOOLEAN CID : 1; BYTE DS_CPL : 1;
BOOLEAN SDBG : 1; BYTE VMX : 1;
BOOLEAN FMA : 1; BYTE SMX : 1;
BOOLEAN CX16 : 1; BYTE EST : 1;
BOOLEAN XTPR : 1; BYTE TM2 : 1;
BOOLEAN PDCM : 1; BYTE SSSE3 : 1;
BOOLEAN Reserved1 : 1; // Bit 16 is reserved BYTE CID : 1;
BOOLEAN PCID : 1; BYTE SDBG : 1;
BOOLEAN DCA : 1; BYTE FMA : 1;
BOOLEAN SSE4_1 : 1; BYTE CX16 : 1;
BOOLEAN SSE4_2 : 1; BYTE XTPR : 1;
BOOLEAN X2APIC : 1; BYTE PDCM : 1;
BOOLEAN MOVBE : 1; BYTE Reserved1 : 1; // Bit 16 is reserved
BOOLEAN POPCNT : 1; BYTE PCID : 1;
BOOLEAN TSC_DEADLINE : 1; BYTE DCA : 1;
BOOLEAN AES : 1; BYTE SSE4_1 : 1;
BOOLEAN XSAVE : 1; BYTE SSE4_2 : 1;
BOOLEAN OSXSAVE : 1; BYTE X2APIC : 1;
BOOLEAN AVX : 1; BYTE MOVBE : 1;
BOOLEAN F16C : 1; BYTE POPCNT : 1;
BOOLEAN RDRAND : 1; BYTE TSC_DEADLINE : 1;
BOOLEAN HYPERVISOR : 1; BYTE AES : 1;
BOOLEAN FPU : 1; BYTE XSAVE : 1;
BOOLEAN VME : 1; BYTE OSXSAVE : 1;
BOOLEAN DE : 1; BYTE AVX : 1;
BOOLEAN PSE : 1; BYTE F16C : 1;
BOOLEAN TSC : 1; BYTE RDRAND : 1;
BOOLEAN MSR : 1; BYTE HYPERVISOR : 1;
BOOLEAN PAE : 1; };
BOOLEAN MCE : 1; };
BOOLEAN CX8 : 1; union
BOOLEAN APIC : 1; {
BOOLEAN Reserved2 : 1; // Bit 10 is reserved UINT32 Edx;
BOOLEAN SEP : 1; UINT32 Features;
BOOLEAN MTRR : 1; struct
BOOLEAN PGE : 1; {
BOOLEAN MCA : 1; BYTE FPU : 1;
BOOLEAN CMOV : 1; BYTE VME : 1;
BOOLEAN PAT : 1; BYTE DE : 1;
BOOLEAN PSE36 : 1; BYTE PSE : 1;
BOOLEAN PSN : 1; BYTE TSC : 1;
BOOLEAN CLFLUSH : 1; BYTE MSR : 1;
BOOLEAN Reserved3 : 1; // Bit 20 is reserved BYTE PAE : 1;
BOOLEAN DS : 1; BYTE MCE : 1;
BOOLEAN ACPI : 1; BYTE CX8 : 1;
BOOLEAN MMX : 1; BYTE APIC : 1;
BOOLEAN FXSR : 1; BYTE Reserved2 : 1; // Bit 10 is reserved
BOOLEAN SSE : 1; BYTE SEP : 1;
BOOLEAN SSE2 : 1; BYTE MTRR : 1;
BOOLEAN SS : 1; BYTE PGE : 1;
BOOLEAN HTT : 1; BYTE MCA : 1;
BOOLEAN TM : 1; BYTE CMOV : 1;
BOOLEAN Reserved4 : 1; // Bit 30 is reserved BYTE PAT : 1;
BOOLEAN PBE : 1; BYTE PSE36 : 1;
BYTE PSN : 1;
BYTE CLFLUSH : 1;
BYTE Reserved3 : 1; // Bit 20 is reserved
BYTE DS : 1;
BYTE ACPI : 1;
BYTE MMX : 1;
BYTE FXSR : 1;
BYTE SSE : 1;
BYTE SSE2 : 1;
BYTE SS : 1;
BYTE HTT : 1;
BYTE TM : 1;
BYTE Reserved4 : 1; // Bit 30 is reserved
BYTE PBE : 1;
};
}; };
UINT64 AsUINT64;
};
} CPU_FEATURES, *PCPU_FEATURES; } CPU_FEATURES, *PCPU_FEATURES;
/* CPUID requests */ /* CPUID requests */