mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 16:22:58 +00:00
[NTOS:KE] Use bitfield structure for x86 CPU signature in EAX register
This makes code a lot more readable. CORE-17974
This commit is contained in:
parent
cc82bc14e2
commit
00b3e4bc68
2 changed files with 42 additions and 16 deletions
|
@ -35,6 +35,21 @@ static const CHAR CmpIntelID[] = "GenuineIntel";
|
||||||
static const CHAR CmpAmdID[] = "AuthenticAMD";
|
static const CHAR CmpAmdID[] = "AuthenticAMD";
|
||||||
static const CHAR CmpCentaurID[] = "CentaurHauls";
|
static const CHAR CmpCentaurID[] = "CentaurHauls";
|
||||||
|
|
||||||
|
typedef union _CPU_SIGNATURE
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
ULONG Step : 4;
|
||||||
|
ULONG Model : 4;
|
||||||
|
ULONG Family : 4;
|
||||||
|
ULONG Unused : 4;
|
||||||
|
ULONG ExtendedModel : 4;
|
||||||
|
ULONG ExtendedFamily : 8;
|
||||||
|
ULONG Unused2 : 4;
|
||||||
|
};
|
||||||
|
ULONG AsULONG;
|
||||||
|
} CPU_SIGNATURE;
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
ULONG
|
ULONG
|
||||||
|
@ -82,6 +97,7 @@ NTAPI
|
||||||
KiSetProcessorType(VOID)
|
KiSetProcessorType(VOID)
|
||||||
{
|
{
|
||||||
CPU_INFO CpuInfo;
|
CPU_INFO CpuInfo;
|
||||||
|
CPU_SIGNATURE CpuSignature;
|
||||||
ULONG Stepping, Type;
|
ULONG Stepping, Type;
|
||||||
|
|
||||||
/* Do CPUID 1 now */
|
/* Do CPUID 1 now */
|
||||||
|
@ -89,17 +105,14 @@ KiSetProcessorType(VOID)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get the Stepping and Type. The stepping contains both the
|
* Get the Stepping and Type. The stepping contains both the
|
||||||
* Model and the Step, while the Type contains the returned Type.
|
* Model and the Step, while the Type contains the returned Family.
|
||||||
* We ignore the family.
|
|
||||||
*
|
*
|
||||||
* For the stepping, we convert this: zzzzzzxy into this: x0y
|
* For the stepping, we convert this: zzzzzzxy into this: x0y
|
||||||
*/
|
*/
|
||||||
Stepping = CpuInfo.Eax & 0xF0;
|
CpuSignature.AsULONG = CpuInfo.Eax;
|
||||||
Stepping <<= 4;
|
Stepping = CpuSignature.Model;
|
||||||
Stepping += (CpuInfo.Eax & 0xFF);
|
Stepping = (Stepping << 8) | CpuSignature.Step;
|
||||||
Stepping &= 0xF0F;
|
Type = CpuSignature.Family;
|
||||||
Type = CpuInfo.Eax & 0xF00;
|
|
||||||
Type >>= 8;
|
|
||||||
|
|
||||||
/* Save them in the PRCB */
|
/* Save them in the PRCB */
|
||||||
KeGetCurrentPrcb()->CpuID = TRUE;
|
KeGetCurrentPrcb()->CpuID = TRUE;
|
||||||
|
|
|
@ -60,6 +60,21 @@ static const CHAR CmpTransmetaID[] = "GenuineTMx86";
|
||||||
static const CHAR CmpCentaurID[] = "CentaurHauls";
|
static const CHAR CmpCentaurID[] = "CentaurHauls";
|
||||||
static const CHAR CmpRiseID[] = "RiseRiseRise";
|
static const CHAR CmpRiseID[] = "RiseRiseRise";
|
||||||
|
|
||||||
|
typedef union _CPU_SIGNATURE
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
ULONG Step : 4;
|
||||||
|
ULONG Model : 4;
|
||||||
|
ULONG Family : 4;
|
||||||
|
ULONG Unused : 4;
|
||||||
|
ULONG ExtendedModel : 4;
|
||||||
|
ULONG ExtendedFamily : 8;
|
||||||
|
ULONG Unused2 : 4;
|
||||||
|
};
|
||||||
|
ULONG AsULONG;
|
||||||
|
} CPU_SIGNATURE;
|
||||||
|
|
||||||
/* SUPPORT ROUTINES FOR MSVC COMPATIBILITY ***********************************/
|
/* SUPPORT ROUTINES FOR MSVC COMPATIBILITY ***********************************/
|
||||||
|
|
||||||
/* NSC/Cyrix CPU configuration register index */
|
/* NSC/Cyrix CPU configuration register index */
|
||||||
|
@ -143,6 +158,7 @@ NTAPI
|
||||||
KiSetProcessorType(VOID)
|
KiSetProcessorType(VOID)
|
||||||
{
|
{
|
||||||
CPU_INFO CpuInfo;
|
CPU_INFO CpuInfo;
|
||||||
|
CPU_SIGNATURE CpuSignature;
|
||||||
ULONG Stepping, Type;
|
ULONG Stepping, Type;
|
||||||
|
|
||||||
/* Do CPUID 1 now */
|
/* Do CPUID 1 now */
|
||||||
|
@ -150,17 +166,14 @@ KiSetProcessorType(VOID)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get the Stepping and Type. The stepping contains both the
|
* Get the Stepping and Type. The stepping contains both the
|
||||||
* Model and the Step, while the Type contains the returned Type.
|
* Model and the Step, while the Type contains the returned Family.
|
||||||
* We ignore the family.
|
|
||||||
*
|
*
|
||||||
* For the stepping, we convert this: zzzzzzxy into this: x0y
|
* For the stepping, we convert this: zzzzzzxy into this: x0y
|
||||||
*/
|
*/
|
||||||
Stepping = CpuInfo.Eax & 0xF0;
|
CpuSignature.AsULONG = CpuInfo.Eax;
|
||||||
Stepping <<= 4;
|
Stepping = CpuSignature.Model;
|
||||||
Stepping += (CpuInfo.Eax & 0xFF);
|
Stepping = (Stepping << 8) | CpuSignature.Step;
|
||||||
Stepping &= 0xF0F;
|
Type = CpuSignature.Family;
|
||||||
Type = CpuInfo.Eax & 0xF00;
|
|
||||||
Type >>= 8;
|
|
||||||
|
|
||||||
/* Save them in the PRCB */
|
/* Save them in the PRCB */
|
||||||
KeGetCurrentPrcb()->CpuID = TRUE;
|
KeGetCurrentPrcb()->CpuID = TRUE;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue