diff --git a/sdk/xtdk/amd64/artypes.h b/sdk/xtdk/amd64/artypes.h index 61461a96..25e244d1 100644 --- a/sdk/xtdk/amd64/artypes.h +++ b/sdk/xtdk/amd64/artypes.h @@ -394,6 +394,13 @@ typedef struct _CPU_IDENTIFICATION USHORT Stepping; CPU_VENDOR Vendor; UCHAR VendorName[13]; + UINT32 StandardFeaturesEcx; + UINT32 StandardFeaturesEdx; + UINT32 ExtendedFeaturesEcx; + UINT32 ExtendedFeaturesEdx; + UINT32 Standard7FeaturesEbx; + UINT32 Standard7FeaturesEcx; + UINT32 Standard7FeaturesEdx; } CPU_IDENTIFICATION, *PCPU_IDENTIFICATION; /* CPUID registers */ diff --git a/sdk/xtdk/i686/artypes.h b/sdk/xtdk/i686/artypes.h index f3b5b733..9b307bd2 100644 --- a/sdk/xtdk/i686/artypes.h +++ b/sdk/xtdk/i686/artypes.h @@ -359,6 +359,10 @@ typedef struct _CPU_IDENTIFICATION USHORT Stepping; CPU_VENDOR Vendor; UCHAR VendorName[13]; + UINT32 StandardFeaturesEcx; + UINT32 StandardFeaturesEdx; + UINT32 ExtendedFeaturesEcx; + UINT32 ExtendedFeaturesEdx; } CPU_IDENTIFICATION, *PCPU_IDENTIFICATION; /* CPUID registers */ diff --git a/xtoskrnl/ar/amd64/procsup.cc b/xtoskrnl/ar/amd64/procsup.cc index 4656ab56..dc9f03ea 100644 --- a/xtoskrnl/ar/amd64/procsup.cc +++ b/xtoskrnl/ar/amd64/procsup.cc @@ -64,9 +64,6 @@ AR::ProcSup::IdentifyProcessor(VOID) CPUID_REGISTERS CpuRegisters; CPUID_SIGNATURE CpuSignature; - /* Not fully implemented yet */ - UNIMPLEMENTED; - /* Get current processor control block */ Prcb = KE::Processor::GetCurrentProcessorControlBlock(); @@ -122,7 +119,42 @@ AR::ProcSup::IdentifyProcessor(VOID) Prcb->CpuId.Vendor = CPU_VENDOR_UNKNOWN; } - /* TODO: Store a list of CPU features in processor control block */ + /* Get CPU standard features */ + RtlZeroMemory(&CpuRegisters, sizeof(CPUID_REGISTERS)); + CpuRegisters.Leaf = CPUID_GET_STANDARD1_FEATURES; + CpuFunc::CpuId(&CpuRegisters); + + /* Store CPU standard features in processor control block */ + Prcb->CpuId.StandardFeaturesEcx = CpuRegisters.Ecx; + Prcb->CpuId.StandardFeaturesEdx = CpuRegisters.Edx; + + /* Get CPU extended features */ + RtlZeroMemory(&CpuRegisters, sizeof(CPUID_REGISTERS)); + CpuRegisters.Leaf = 0x80000001; + CpuFunc::CpuId(&CpuRegisters); + + /* Store CPU extended features in processor control block */ + Prcb->CpuId.ExtendedFeaturesEcx = CpuRegisters.Ecx; + Prcb->CpuId.ExtendedFeaturesEdx = CpuRegisters.Edx; + + /* Get CPU leaf 7 features (subleaf 0) */ + RtlZeroMemory(&CpuRegisters, sizeof(CPUID_REGISTERS)); + CpuRegisters.Leaf = CPUID_GET_STANDARD7_FEATURES; + CpuRegisters.SubLeaf = 0; + CpuFunc::CpuId(&CpuRegisters); + + /* Store CPU leaf 7 features in processor control block */ + Prcb->CpuId.Standard7FeaturesEbx = CpuRegisters.Ebx; + Prcb->CpuId.Standard7FeaturesEcx = CpuRegisters.Ecx; + Prcb->CpuId.Standard7FeaturesEdx = CpuRegisters.Edx; + + /* Print CPU information */ + DebugPrint(L"CPU: Vendor %hs, Family 0x%X, Model 0x%X, Stepping 0x%X\n", + Prcb->CpuId.VendorName, + Prcb->CpuId.Family, + Prcb->CpuId.Model, + Prcb->CpuId.Stepping); + } /** diff --git a/xtoskrnl/ar/i686/procsup.cc b/xtoskrnl/ar/i686/procsup.cc index 5db6658b..d79d36cf 100644 --- a/xtoskrnl/ar/i686/procsup.cc +++ b/xtoskrnl/ar/i686/procsup.cc @@ -59,9 +59,6 @@ AR::ProcSup::IdentifyProcessor(VOID) CPUID_REGISTERS CpuRegisters; CPUID_SIGNATURE CpuSignature; - /* Not fully implemented yet */ - UNIMPLEMENTED; - /* Get current processor control block */ Prcb = KE::Processor::GetCurrentProcessorControlBlock(); @@ -117,7 +114,30 @@ AR::ProcSup::IdentifyProcessor(VOID) Prcb->CpuId.Vendor = CPU_VENDOR_UNKNOWN; } - /* TODO: Store a list of CPU features in processor control block */ + /* Get CPU standard features */ + RtlZeroMemory(&CpuRegisters, sizeof(CPUID_REGISTERS)); + CpuRegisters.Leaf = CPUID_GET_STANDARD1_FEATURES; + CpuFunc::CpuId(&CpuRegisters); + + /* Store CPU standard features in processor control block */ + Prcb->CpuId.StandardFeaturesEcx = CpuRegisters.Ecx; + Prcb->CpuId.StandardFeaturesEdx = CpuRegisters.Edx; + + /* Get CPU extended features */ + RtlZeroMemory(&CpuRegisters, sizeof(CPUID_REGISTERS)); + CpuRegisters.Leaf = 0x80000001; + CpuFunc::CpuId(&CpuRegisters); + + /* Store CPU extended features in processor control block */ + Prcb->CpuId.ExtendedFeaturesEcx = CpuRegisters.Ecx; + Prcb->CpuId.ExtendedFeaturesEdx = CpuRegisters.Edx; + + /* Print CPU information */ + DebugPrint(L"CPU: Vendor %hs, Family 0x%X, Model 0x%X, Stepping 0x%X\n", + Prcb->CpuId.VendorName, + Prcb->CpuId.Family, + Prcb->CpuId.Model, + Prcb->CpuId.Stepping); } /**