MdeModulePkg/Frontpage: get SMBIOS Data from table directly
rather than getting it from the EFI SMBIOS protocol Signed-off-by: Matt DeVillier <matt.devillier@gmail.com>
This commit is contained in:
committed by
Tim Crawford
parent
85f616be1b
commit
38a3b6f58d
@ -496,6 +496,43 @@ GetOptionalStringByIndex (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UINT16 SmbiosTableLength (SMBIOS_STRUCTURE_POINTER SmbiosTableN)
|
||||||
|
{
|
||||||
|
CHAR8 *AChar;
|
||||||
|
UINT16 Length;
|
||||||
|
|
||||||
|
AChar = (CHAR8 *)(SmbiosTableN.Raw + SmbiosTableN.Hdr->Length);
|
||||||
|
while ((*AChar != 0) || (*(AChar + 1) != 0)) {
|
||||||
|
AChar ++; //stop at 00 - first 0
|
||||||
|
}
|
||||||
|
Length = (UINT16)((UINTN)AChar - (UINTN)SmbiosTableN.Raw + 2); //length includes 00
|
||||||
|
return Length;
|
||||||
|
}
|
||||||
|
|
||||||
|
SMBIOS_STRUCTURE_POINTER GetSmbiosTableFromType (
|
||||||
|
SMBIOS_TABLE_ENTRY_POINT *SmbiosPoint, UINT8 SmbiosType, UINTN IndexTable)
|
||||||
|
{
|
||||||
|
SMBIOS_STRUCTURE_POINTER SmbiosTableN;
|
||||||
|
UINTN SmbiosTypeIndex;
|
||||||
|
|
||||||
|
SmbiosTypeIndex = 0;
|
||||||
|
SmbiosTableN.Raw = (UINT8 *)((UINTN)SmbiosPoint->TableAddress);
|
||||||
|
if (SmbiosTableN.Raw == NULL) {
|
||||||
|
return SmbiosTableN;
|
||||||
|
}
|
||||||
|
while ((SmbiosTypeIndex != IndexTable) || (SmbiosTableN.Hdr->Type != SmbiosType)) {
|
||||||
|
if (SmbiosTableN.Hdr->Type == SMBIOS_TYPE_END_OF_TABLE) {
|
||||||
|
SmbiosTableN.Raw = NULL;
|
||||||
|
return SmbiosTableN;
|
||||||
|
}
|
||||||
|
if (SmbiosTableN.Hdr->Type == SmbiosType) {
|
||||||
|
SmbiosTypeIndex++;
|
||||||
|
}
|
||||||
|
SmbiosTableN.Raw = (UINT8 *)(SmbiosTableN.Raw + SmbiosTableLength (SmbiosTableN));
|
||||||
|
}
|
||||||
|
return SmbiosTableN;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
||||||
Update the banner information for the Front Page based on Smbios information.
|
Update the banner information for the Front Page based on Smbios information.
|
||||||
@ -506,160 +543,130 @@ UpdateFrontPageBannerStrings (
|
|||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINT8 StrIndex;
|
CHAR16 *MemoryStr;
|
||||||
CHAR16 *NewString;
|
EFI_STATUS Status;
|
||||||
CHAR16 *FirmwareVersionString;
|
EFI_STRING_ID TokenToUpdate;
|
||||||
EFI_STATUS Status;
|
EFI_PHYSICAL_ADDRESS *Table;
|
||||||
EFI_SMBIOS_HANDLE SmbiosHandle;
|
SMBIOS_TABLE_ENTRY_POINT *EntryPoint;
|
||||||
EFI_SMBIOS_PROTOCOL *Smbios;
|
SMBIOS_STRUCTURE_POINTER SmbiosTable;
|
||||||
SMBIOS_TABLE_TYPE0 *Type0Record;
|
UINT64 InstalledMemory;
|
||||||
SMBIOS_TABLE_TYPE1 *Type1Record;
|
|
||||||
SMBIOS_TABLE_TYPE4 *Type4Record;
|
|
||||||
SMBIOS_TABLE_TYPE19 *Type19Record;
|
|
||||||
EFI_SMBIOS_TABLE_HEADER *Record;
|
|
||||||
UINT64 InstalledMemory;
|
|
||||||
BOOLEAN FoundCpu;
|
|
||||||
|
|
||||||
InstalledMemory = 0;
|
InstalledMemory = 0;
|
||||||
FoundCpu = 0;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Update default banner string.
|
// Update Front Page strings
|
||||||
//
|
//
|
||||||
NewString = HiiGetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_CUSTOMIZE_BANNER_LINE4_LEFT), NULL);
|
Status = EfiGetSystemConfigurationTable (&gEfiSmbiosTableGuid, (VOID **) &Table);
|
||||||
UiCustomizeFrontPageBanner (4, TRUE, &NewString);
|
if (EFI_ERROR (Status) || Table == NULL) {
|
||||||
HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_CUSTOMIZE_BANNER_LINE4_LEFT), NewString, NULL);
|
} else {
|
||||||
FreePool (NewString);
|
EntryPoint = (SMBIOS_TABLE_ENTRY_POINT*)Table;
|
||||||
|
|
||||||
NewString = HiiGetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_CUSTOMIZE_BANNER_LINE4_RIGHT), NULL);
|
SmbiosTable = GetSmbiosTableFromType (EntryPoint, EFI_SMBIOS_TYPE_BIOS_INFORMATION , 0);
|
||||||
UiCustomizeFrontPageBanner (4, FALSE, &NewString);
|
|
||||||
HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_CUSTOMIZE_BANNER_LINE4_RIGHT), NewString, NULL);
|
|
||||||
FreePool (NewString);
|
|
||||||
|
|
||||||
NewString = HiiGetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_CUSTOMIZE_BANNER_LINE5_LEFT), NULL);
|
if (SmbiosTable.Raw != NULL) {
|
||||||
UiCustomizeFrontPageBanner (5, TRUE, &NewString);
|
CHAR16 *FwVersion;
|
||||||
HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_CUSTOMIZE_BANNER_LINE5_LEFT), NewString, NULL);
|
CHAR16 *FwDate;
|
||||||
FreePool (NewString);
|
CHAR16 *TmpBuffer;
|
||||||
|
UINT8 VersionIdx;
|
||||||
|
UINT8 DateIdx;
|
||||||
|
|
||||||
NewString = HiiGetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_CUSTOMIZE_BANNER_LINE5_RIGHT), NULL);
|
TmpBuffer = AllocateZeroPool (0x60);
|
||||||
UiCustomizeFrontPageBanner (5, FALSE, &NewString);
|
|
||||||
HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_CUSTOMIZE_BANNER_LINE5_RIGHT), NewString, NULL);
|
|
||||||
FreePool (NewString);
|
|
||||||
|
|
||||||
//
|
VersionIdx = SmbiosTable.Type0->BiosVersion;
|
||||||
// Update Front Page banner strings base on SmBios Table.
|
DateIdx = SmbiosTable.Type0->BiosReleaseDate;
|
||||||
//
|
|
||||||
Status = gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID **)&Smbios);
|
|
||||||
if (EFI_ERROR (Status)) {
|
|
||||||
//
|
|
||||||
// Smbios protocol not found, get the default value.
|
|
||||||
//
|
|
||||||
NewString = HiiGetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_COMPUTER_MODEL), NULL);
|
|
||||||
UiCustomizeFrontPageBanner (1, TRUE, &NewString);
|
|
||||||
HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_COMPUTER_MODEL), NewString, NULL);
|
|
||||||
FreePool (NewString);
|
|
||||||
|
|
||||||
NewString = HiiGetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_CPU_MODEL), NULL);
|
GetOptionalStringByIndex ((CHAR8*)((UINT8*)SmbiosTable.Raw + SmbiosTable.Hdr->Length), VersionIdx, &FwVersion);
|
||||||
UiCustomizeFrontPageBanner (2, TRUE, &NewString);
|
GetOptionalStringByIndex ((CHAR8*)((UINT8*)SmbiosTable.Raw + SmbiosTable.Hdr->Length), DateIdx, &FwDate);
|
||||||
HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_CPU_MODEL), NewString, NULL);
|
|
||||||
FreePool (NewString);
|
|
||||||
|
|
||||||
NewString = HiiGetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_CPU_SPEED), NULL);
|
StrCatS (TmpBuffer, 0x60 / sizeof (CHAR16), L"FW: ");
|
||||||
UiCustomizeFrontPageBanner (2, FALSE, &NewString);
|
StrCatS (TmpBuffer, 0x60 / sizeof (CHAR16), FwVersion);
|
||||||
HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_CPU_SPEED), NewString, NULL);
|
StrCatS (TmpBuffer, 0x60 / sizeof (CHAR16), L" ");
|
||||||
FreePool (NewString);
|
StrCatS (TmpBuffer, 0x60 / sizeof (CHAR16), FwDate);
|
||||||
|
|
||||||
NewString = HiiGetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_BIOS_VERSION), NULL);
|
TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_BIOS_VERSION);
|
||||||
UiCustomizeFrontPageBanner (3, TRUE, &NewString);
|
HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, TmpBuffer, NULL);
|
||||||
HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_BIOS_VERSION), NewString, NULL);
|
|
||||||
FreePool (NewString);
|
|
||||||
|
|
||||||
NewString = HiiGetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_MEMORY_SIZE), NULL);
|
FreePool (FwVersion);
|
||||||
UiCustomizeFrontPageBanner (3, FALSE, &NewString);
|
FreePool (FwDate);
|
||||||
HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_MEMORY_SIZE), NewString, NULL);
|
FreePool (TmpBuffer);
|
||||||
FreePool (NewString);
|
}
|
||||||
|
|
||||||
return;
|
SmbiosTable = GetSmbiosTableFromType (EntryPoint, SMBIOS_TYPE_SYSTEM_INFORMATION , 0);
|
||||||
}
|
|
||||||
|
|
||||||
SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
|
if (SmbiosTable.Raw != NULL) {
|
||||||
Status = Smbios->GetNext (Smbios, &SmbiosHandle, NULL, &Record, NULL);
|
CHAR16 *ProductName;
|
||||||
while (!EFI_ERROR (Status)) {
|
CHAR16 *Manufacturer;
|
||||||
if (Record->Type == SMBIOS_TYPE_BIOS_INFORMATION) {
|
CHAR16 *DeviceName;
|
||||||
Type0Record = (SMBIOS_TABLE_TYPE0 *)Record;
|
CHAR16 *TmpBuffer;
|
||||||
StrIndex = Type0Record->BiosVersion;
|
UINT8 ProductIdx;
|
||||||
GetOptionalStringByIndex ((CHAR8 *)((UINT8 *)Type0Record + Type0Record->Hdr.Length), StrIndex, &NewString);
|
UINT8 ManIdx;
|
||||||
|
|
||||||
FirmwareVersionString = (CHAR16 *)PcdGetPtr (PcdFirmwareVersionString);
|
TmpBuffer = AllocateZeroPool (0x60);
|
||||||
if (*FirmwareVersionString != 0x0000 ) {
|
DeviceName = AllocateZeroPool (0x60);
|
||||||
FreePool (NewString);
|
|
||||||
NewString = (CHAR16 *)PcdGetPtr (PcdFirmwareVersionString);
|
ProductIdx = SmbiosTable.Type1->ProductName;
|
||||||
UiCustomizeFrontPageBanner (3, TRUE, &NewString);
|
ManIdx = SmbiosTable.Type1->Manufacturer;
|
||||||
HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_BIOS_VERSION), NewString, NULL);
|
|
||||||
|
GetOptionalStringByIndex ((CHAR8*)((UINT8*)SmbiosTable.Raw + SmbiosTable.Hdr->Length), ProductIdx, &ProductName);
|
||||||
|
GetOptionalStringByIndex ((CHAR8*)((UINT8*)SmbiosTable.Raw + SmbiosTable.Hdr->Length), ManIdx, &Manufacturer);
|
||||||
|
|
||||||
|
StrCatS (TmpBuffer, 0x60 / sizeof (CHAR16), Manufacturer);
|
||||||
|
StrCatS (TmpBuffer, 0x60 / sizeof (CHAR16), L" ");
|
||||||
|
StrCatS (TmpBuffer, 0x60 / sizeof (CHAR16), ProductName);
|
||||||
|
|
||||||
|
TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_COMPUTER_MODEL);
|
||||||
|
HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, TmpBuffer, NULL);
|
||||||
|
|
||||||
|
FreePool (ProductName);
|
||||||
|
FreePool (Manufacturer);
|
||||||
|
FreePool (DeviceName);
|
||||||
|
FreePool (TmpBuffer);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
SmbiosTable = GetSmbiosTableFromType (EntryPoint, SMBIOS_TYPE_PROCESSOR_INFORMATION , 0);
|
||||||
|
if (SmbiosTable.Raw != NULL) {
|
||||||
|
CHAR16 *ProcessorVersion;
|
||||||
|
CHAR16 *TmpBuffer;
|
||||||
|
UINT8 CpuIdx;
|
||||||
|
|
||||||
|
TmpBuffer = AllocateZeroPool (0x60);
|
||||||
|
|
||||||
|
CpuIdx = SmbiosTable.Type4->ProcessorVersion;
|
||||||
|
|
||||||
|
GetOptionalStringByIndex ((CHAR8*)((UINT8*)SmbiosTable.Raw + SmbiosTable.Hdr->Length), CpuIdx, &ProcessorVersion);
|
||||||
|
StrCatS (TmpBuffer, 0x60 / sizeof (CHAR16), ProcessorVersion);
|
||||||
|
|
||||||
|
// Trim leading spaces
|
||||||
|
while (TmpBuffer[0] == 0x20) {
|
||||||
|
TmpBuffer = &TmpBuffer[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_CPU_MODEL);
|
||||||
|
HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, TmpBuffer, NULL);
|
||||||
|
|
||||||
|
FreePool (ProcessorVersion);
|
||||||
|
FreePool (TmpBuffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
SmbiosTable = GetSmbiosTableFromType (EntryPoint, SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS , 0);
|
||||||
|
if (SmbiosTable.Raw != NULL) {
|
||||||
|
if (SmbiosTable.Type19->StartingAddress != 0xFFFFFFFF ) {
|
||||||
|
InstalledMemory += RShiftU64(SmbiosTable.Type19->EndingAddress -
|
||||||
|
SmbiosTable.Type19->StartingAddress + 1, 10);
|
||||||
} else {
|
} else {
|
||||||
UiCustomizeFrontPageBanner (3, TRUE, &NewString);
|
InstalledMemory += RShiftU64(SmbiosTable.Type19->ExtendedEndingAddress -
|
||||||
HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_BIOS_VERSION), NewString, NULL);
|
SmbiosTable.Type19->ExtendedStartingAddress + 1, 20);
|
||||||
FreePool (NewString);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// now update the total installed RAM size
|
||||||
|
ConvertMemorySizeToString ((UINT32)InstalledMemory, &MemoryStr );
|
||||||
|
TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_MEMORY_SIZE);
|
||||||
|
HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, MemoryStr, NULL);
|
||||||
|
|
||||||
|
FreePool (MemoryStr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Record->Type == SMBIOS_TYPE_SYSTEM_INFORMATION) {
|
|
||||||
Type1Record = (SMBIOS_TABLE_TYPE1 *)Record;
|
|
||||||
StrIndex = Type1Record->ProductName;
|
|
||||||
GetOptionalStringByIndex ((CHAR8 *)((UINT8 *)Type1Record + Type1Record->Hdr.Length), StrIndex, &NewString);
|
|
||||||
UiCustomizeFrontPageBanner (1, TRUE, &NewString);
|
|
||||||
HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_COMPUTER_MODEL), NewString, NULL);
|
|
||||||
FreePool (NewString);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((Record->Type == SMBIOS_TYPE_PROCESSOR_INFORMATION) && !FoundCpu) {
|
|
||||||
Type4Record = (SMBIOS_TABLE_TYPE4 *)Record;
|
|
||||||
//
|
|
||||||
// The information in the record should be only valid when the CPU Socket is populated.
|
|
||||||
//
|
|
||||||
if ((Type4Record->Status & SMBIOS_TYPE4_CPU_SOCKET_POPULATED) == SMBIOS_TYPE4_CPU_SOCKET_POPULATED) {
|
|
||||||
StrIndex = Type4Record->ProcessorVersion;
|
|
||||||
GetOptionalStringByIndex ((CHAR8 *)((UINT8 *)Type4Record + Type4Record->Hdr.Length), StrIndex, &NewString);
|
|
||||||
UiCustomizeFrontPageBanner (2, TRUE, &NewString);
|
|
||||||
HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_CPU_MODEL), NewString, NULL);
|
|
||||||
FreePool (NewString);
|
|
||||||
|
|
||||||
ConvertProcessorToString (Type4Record->CurrentSpeed, 6, &NewString);
|
|
||||||
UiCustomizeFrontPageBanner (2, FALSE, &NewString);
|
|
||||||
HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_CPU_SPEED), NewString, NULL);
|
|
||||||
FreePool (NewString);
|
|
||||||
|
|
||||||
FoundCpu = TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( Record->Type == SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS ) {
|
|
||||||
Type19Record = (SMBIOS_TABLE_TYPE19 *)Record;
|
|
||||||
if (Type19Record->StartingAddress != 0xFFFFFFFF ) {
|
|
||||||
InstalledMemory += RShiftU64 (
|
|
||||||
Type19Record->EndingAddress -
|
|
||||||
Type19Record->StartingAddress + 1,
|
|
||||||
10
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
InstalledMemory += RShiftU64 (
|
|
||||||
Type19Record->ExtendedEndingAddress -
|
|
||||||
Type19Record->ExtendedStartingAddress + 1,
|
|
||||||
20
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Status = Smbios->GetNext (Smbios, &SmbiosHandle, NULL, &Record, NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// Now update the total installed RAM size
|
|
||||||
//
|
|
||||||
ConvertMemorySizeToString ((UINT32)InstalledMemory, &NewString);
|
|
||||||
UiCustomizeFrontPageBanner (3, FALSE, &NewString);
|
|
||||||
HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_MEMORY_SIZE), NewString, NULL);
|
|
||||||
FreePool (NewString);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -58,6 +58,7 @@
|
|||||||
[Guids]
|
[Guids]
|
||||||
gEfiIfrTianoGuid ## CONSUMES ## GUID (Extended IFR Guid Opcode)
|
gEfiIfrTianoGuid ## CONSUMES ## GUID (Extended IFR Guid Opcode)
|
||||||
gEfiIfrFrontPageGuid ## CONSUMES ## GUID
|
gEfiIfrFrontPageGuid ## CONSUMES ## GUID
|
||||||
|
gEfiSmbiosTableGuid ## CONSUMES ## GUID
|
||||||
|
|
||||||
[Protocols]
|
[Protocols]
|
||||||
gEfiSmbiosProtocolGuid ## CONSUMES
|
gEfiSmbiosProtocolGuid ## CONSUMES
|
||||||
|
Reference in New Issue
Block a user