/** @file
GetCpuInfo.h -- Header for GetCpuInfo
Copyright (c) HR650X BIOS Decompilation Project
**/
#ifndef __GETCPUINFO_H__
#define __GETCPUINFO_H__
#include "../uefi_headers/Uefi.h"
//
// Function Prototypes
//
EFI_STATUS
EFIAPI
GetCpuInfoEntryPoint(
VOID
);
EFI_STATUS
EFIAPI
CpuInfoDriverEntry(
VOID
);
EFI_STATUS
EFIAPI
CpuInfoCollection(
VOID
);
EFI_STATUS
EFIAPI
CpuInfoDisplayForm(
VOID
);
EFI_STATUS
EFIAPI
CpuInfoDelayMicro(
VOID
);
EFI_STATUS
EFIAPI
GetPlatformLanguage(
VOID
);
EFI_STATUS
EFIAPI
CpuIdEx(
VOID
);
EFI_STATUS
EFIAPI
AsmReadMsr64(
VOID
);
EFI_STATUS
EFIAPI
AsmWriteMsr64(
VOID
);
EFI_STATUS
EFIAPI
CpuInfoReadAll(
VOID
);
EFI_STATUS
EFIAPI
CpuInfoLocatePcdProtocol(
VOID
);
EFI_STATUS
EFIAPI
CpuInfoGetProcessorCountFromHob(
VOID
);
EFI_STATUS
EFIAPI
CpuInfoFreeAllBuffers(
VOID
);
EFI_STATUS
EFIAPI
HiiFreeOpCodeHandle(
VOID
);
EFI_STATUS
EFIAPI
VARIABLES (.data section, 0x3D30 - 0x3DF0)(
VOID
);
EFI_STATUS
EFIAPI
gImageHandle; ///< 0x3D40(
VOID
);
EFI_STATUS
EFIAPI
DEFINITIONS (.rdata section)(
VOID
);
EFI_STATUS
EFIAPI
GUIDs are defined externally in the PE/COFF .rdata section:(
VOID
);
EFI_STATUS
EFIAPI
= EFI_CPU_ARCH_PROTOCOL_GUID(
VOID
);
EFI_STATUS
EFIAPI
= gEfiRuntimeServicesTableGuid(
VOID
);
EFI_STATUS
EFIAPI
= HII package list GUID for VFR(
VOID
);
EFI_STATUS
EFIAPI
= gEfiPcdProtocolGuid(
VOID
);
EFI_STATUS
EFIAPI
= PackageListGuid for HII string packages(
VOID
);
EFI_STATUS
EFIAPI
= gEfiHiiStringProtocolGuid(
VOID
);
EFI_STATUS
EFIAPI
= gEfiHiiConfigRoutingProtocolGuid(
VOID
);
EFI_STATUS
EFIAPI
= gEfiHiiPackageListProtocolGuid(
VOID
);
EFI_STATUS
EFIAPI
= gEfiHiiDatabaseProtocolGuid(
VOID
);
EFI_STATUS
EFIAPI
= gEfiHobListGuid(
VOID
);
EFI_STATUS
EFIAPI
= gEfiHiiConfigAccessProtocolGuid(
VOID
);
EFI_STATUS
EFIAPI
= CPU Info formset GUID(
VOID
);
EFI_STATUS
EFIAPI
= CPU Info form GUID (VFR binary data)(
VOID
);
EFI_STATUS
EFIAPI
DECLARATIONS(
VOID
);
EFI_STATUS
EFIAPI
EFIAPI(
VOID
);
EFI_STATUS
EFIAPI
/ MSR / I/O HELPERS (inlined wrappers)(
VOID
);
EFI_STATUS
EFIAPI
ENTRY POINT(
VOID
);
EFI_STATUS
EFIAPI
the actual driver entry(
VOID
);
EFI_STATUS
EFIAPI
CpuInfoDriverEntry (ImageHandle, SystemTable);(
VOID
);
EFI_STATUS
EFIAPI
1: Save UEFI handles(
VOID
);
EFI_STATUS
EFIAPI
= ImageHandle;(
VOID
);
EFI_STATUS
EFIAPI
2: Initialize HOB list(
VOID
);
EFI_STATUS
EFIAPI
();(
VOID
);
EFI_STATUS
EFIAPI
3: Get PCD for PCI Express base address (lazy init via PCD protocol)(
VOID
);
EFI_STATUS
EFIAPI
4: Locate HII protocols(
VOID
);
EFI_STATUS
EFIAPI
= gBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, &gHiiDatabase);(
VOID
);
EFI_STATUS
EFIAPI
5: Check and enable platform language via PCI config(
VOID
);
EFI_STATUS
EFIAPI
= 1024068; // Offset 0xF4244 from PciExpressBaseAddress(
VOID
);
EFI_STATUS
EFIAPI
to IO port to enable(
VOID
);
EFI_STATUS
EFIAPI
(PcdAddress - 4); // 0xF4240(
VOID
);
EFI_STATUS
EFIAPI
6: Read platform type from IO port 0x80(
VOID
);
EFI_STATUS
EFIAPI
= IoRead32 (IO_PORT_0x80);(
VOID
);
EFI_STATUS
EFIAPI
7: Wait for IO completion by polling port 0x508(
VOID
);
EFI_STATUS
EFIAPI
{(
VOID
);
EFI_STATUS
EFIAPI
delay via IO port read(
VOID
);
EFI_STATUS
EFIAPI
8: Return based on setup mode(
VOID
);
EFI_STATUS
EFIAPI
(SetupMode) {(
VOID
);
EFI_STATUS
EFIAPI
INFORMATION COLLECTION(
VOID
);
EFI_STATUS
EFIAPI
1: PCD enable check(
VOID
);
EFI_STATUS
EFIAPI
(!PcdGetBool (PcdCpuInfoDisplayEnable)) {(
VOID
);
EFI_STATUS
EFIAPI
2: Locate CPU Architecture Protocol(
VOID
);
EFI_STATUS
EFIAPI
= CpuInfoLocateCpuProtocol ();(
VOID
);
EFI_STATUS
EFIAPI
3: Get number of processors from HOB(
VOID
);
EFI_STATUS
EFIAPI
= CpuInfoGetProcessorCountFromHob ();(
VOID
);
EFI_STATUS
EFIAPI
4: Allocate per-processor string buffers(
VOID
);
EFI_STATUS
EFIAPI
= AllocateZeroPool (CPU_INFO_STRING_SIZE * ProcessorNumber);(
VOID
);
EFI_STATUS
EFIAPI
5: Build header string "Total CPU Number: %d\n"(
VOID
);
EFI_STATUS
EFIAPI
((
VOID
);
EFI_STATUS
EFIAPI
6: Initialize per-processor label strings(
VOID
);
EFI_STATUS
EFIAPI
(Index = 0; Index < ProcessorNumber; Index++) {(
VOID
);
EFI_STATUS
EFIAPI
7: Collect actual CPU data from all processors(
VOID
);
EFI_STATUS
EFIAPI
8: Register callback for form update(
VOID
);
EFI_STATUS
EFIAPI
9: Create and display HII form(
VOID
);
EFI_STATUS
EFIAPI
= CpuInfoRegisterPackageList ((
VOID
);
EFI_STATUS
EFIAPI
10: Free buffers(
VOID
);
EFI_STATUS
EFIAPI
width for number formatting(
VOID
);
EFI_STATUS
EFIAPI
(Buffer, 0, Index, 4);(
VOID
);
EFI_STATUS
EFIAPI
(CPUID_VERSION_INFO, &Eax, &Ebx, &Ecx, &Edx);(
VOID
);
EFI_STATUS
EFIAPI
(EAX[3:0])(
VOID
);
EFI_STATUS
EFIAPI
(EAX full, printed as hex)(
VOID
);
EFI_STATUS
EFIAPI
= AsmReadMsr64 (MSR_IA32_PLATFORM_ID);(
VOID
);
EFI_STATUS
EFIAPI
read MSR 0x8B[63:32].(
VOID
);
EFI_STATUS
EFIAPI
(MSR_IA32_BIOS_SIGN_ID, 0);(
VOID
);
EFI_STATUS
EFIAPI
(0xCE) byte 1 is the Maximum Efficiency Ratio.(
VOID
);
EFI_STATUS
EFIAPI
frequency = ratio * 100 MHz (bus frequency).(
VOID
);
EFI_STATUS
EFIAPI
= AsmReadMsr64 (MSR_PLATFORM_INFO);(
VOID
);
EFI_STATUS
EFIAPI
the MPERF (MSR 0xE7) and APERF (MSR 0xE8) ratio method:(
VOID
);
EFI_STATUS
EFIAPI
(gMaxTurboRatio == 0) {(
VOID
);
EFI_STATUS
EFIAPI
= (ratio * CoreFreq * 100) / 10000(
VOID
);
EFI_STATUS
EFIAPI
= DivU64xU64 (MultU64xU64 (AperfValue, 100), gMaxTurboRatio);(
VOID
);
EFI_STATUS
EFIAPI
MHz = (ratio * MaxEfficiencyRatio * 100) / 100(
VOID
);
EFI_STATUS
EFIAPI
= DivU64xU64 ((
VOID
);
EFI_STATUS
EFIAPI
and append(
VOID
);
EFI_STATUS
EFIAPI
(Buffer, 0, ActualFrequency / 100, 8);(
VOID
);
EFI_STATUS
EFIAPI
FUNCTIONS(
VOID
);
EFI_STATUS
EFIAPI
magic values represent GUID comparison data(
VOID
);
EFI_STATUS
EFIAPI
are precomputed from the CPU-info HOB GUID(
VOID
);
EFI_STATUS
EFIAPI
through HOBs looking for CPU info(
VOID
);
EFI_STATUS
EFIAPI
(GuidHob != NULL) {(
VOID
);
EFI_STATUS
EFIAPI
GUID to the expected CPU-info HOB GUID(
VOID
);
EFI_STATUS
EFIAPI
(CompareGuid (HobDataGuid, (EFI_GUID *)MagicCheck)) {(
VOID
);
/// extract processor count
EFI_STATUS
EFIAPI
CPU info HOB(
VOID
);
EFI_STATUS
EFIAPI
= *(UINT32 *)((UINT8 *)GuidHob + sizeof (EFI_HOB_GUID_TYPE));(
VOID
);
EFI_STATUS
EFIAPI
to next HOB(
VOID
);
EFI_STATUS
EFIAPI
= GetNextGuidHob ((
VOID
);
EFI_STATUS
EFIAPI
for previous I/O to complete by polling port 0x508(
VOID
);
EFI_STATUS
EFIAPI
(((AddressRemainder + (IoRead32 (IO_PORT_0x508) & 0xFFFFFF)(
VOID
);
EFI_STATUS
EFIAPI
via IO read(
VOID
);
EFI_STATUS
EFIAPI
first iteration, always use max remainder for remaining(
VOID
);
EFI_STATUS
EFIAPI
counts(
VOID
);
EFI_STATUS
EFIAPI
= 0x400000;(
VOID
);
EFI_STATUS
EFIAPI
= gRT->GetVariable ((
VOID
);
EFI_STATUS
EFIAPI
FORM DISPLAY(
VOID
);
EFI_STATUS
EFIAPI
op-code handles(
VOID
);
EFI_STATUS
EFIAPI
= HiiAllocateOpCodeHandle ();(
VOID
);
EFI_STATUS
EFIAPI
form header and end markers(
VOID
);
EFI_STATUS
EFIAPI
(StartOpCodeHandle, FORM_CPU_INFO_ID, 0);(
VOID
);
EFI_STATUS
EFIAPI
"Total CPU Number" header text(
VOID
);
EFI_STATUS
EFIAPI
per-processor data lines (7 fields each)(
VOID
);
EFI_STATUS
EFIAPI
(Index = 0; Index < gNumberOfProcessors; Index++) {(
VOID
);
EFI_STATUS
EFIAPI
the form via HII Database(
VOID
);
EFI_STATUS
EFIAPI
= ((EFI_HII_DATABASE_PROTOCOL *)gHiiDatabase)->UpdateForm ((
VOID
);
EFI_STATUS
EFIAPI
up(
VOID
);
EFI_STATUS
EFIAPI
(StartOpCodeHandle);(
VOID
);
EFI_STATUS
EFIAPI
total size of all packages(
VOID
);
EFI_STATUS
EFIAPI
= VA_ARG (Args, VOID *);(
VOID
);
EFI_STATUS
EFIAPI
the package list header(
VOID
);
EFI_STATUS
EFIAPI
(&PackageListHeader->PackageListGuid, PackageListGuid);(
VOID
);
EFI_STATUS
EFIAPI
with HII Database(
VOID
);
EFI_STATUS
EFIAPI
= ((EFI_HII_PACKAGE_LIST_PROTOCOL *)gHiiPackageList)->NewPackageList ((
VOID
);
#endif /* __GETCPUINFO_H__ */