MdeModulePkg/UiApp: Fix reporting model/version
Use the SMBIOS table directly instead of the EFI SMBIOS protocol.
This commit is contained in:
@ -70,11 +70,11 @@ HII_VENDOR_DEVICE_PATH mFrontPageHiiVendorDevicePath = {
|
||||
};
|
||||
|
||||
/**
|
||||
Update the banner information for the Front Page based on Smbios information.
|
||||
Update the information for the Front Page based on Smbios information.
|
||||
|
||||
**/
|
||||
VOID
|
||||
UpdateFrontPageBannerStrings (
|
||||
UpdateFrontPageStrings (
|
||||
VOID
|
||||
);
|
||||
|
||||
@ -286,9 +286,9 @@ InitializeFrontPage (
|
||||
ASSERT (gFrontPagePrivate.HiiHandle != NULL);
|
||||
|
||||
//
|
||||
//Updata Front Page banner strings
|
||||
//Updata Front Page strings
|
||||
//
|
||||
UpdateFrontPageBannerStrings ();
|
||||
UpdateFrontPageStrings ();
|
||||
|
||||
//
|
||||
// Update front page menus.
|
||||
@ -487,73 +487,111 @@ GetOptionalStringByIndex (
|
||||
}
|
||||
|
||||
|
||||
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 information for the Front Page based on Smbios information.
|
||||
|
||||
**/
|
||||
VOID
|
||||
UpdateFrontPageBannerStrings (
|
||||
UpdateFrontPageStrings (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
UINT8 StrIndex;
|
||||
UINT8 Str2Index;
|
||||
CHAR16 *NewString;
|
||||
CHAR16 *FirmwareVersionString;
|
||||
CHAR16 *NewString2;
|
||||
CHAR16 *NewString3;
|
||||
EFI_STATUS Status;
|
||||
EFI_SMBIOS_HANDLE SmbiosHandle;
|
||||
EFI_SMBIOS_PROTOCOL *Smbios;
|
||||
SMBIOS_TABLE_TYPE0 *Type0Record;
|
||||
SMBIOS_TABLE_TYPE1 *Type1Record;
|
||||
EFI_SMBIOS_TABLE_HEADER *Record;
|
||||
|
||||
//
|
||||
// Update Front Page banner strings base on SmBios Table.
|
||||
//
|
||||
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);
|
||||
HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_COMPUTER_MODEL), NewString, NULL);
|
||||
FreePool (NewString);
|
||||
|
||||
NewString = HiiGetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_BIOS_VERSION), NULL);
|
||||
HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_BIOS_VERSION), NewString, NULL);
|
||||
FreePool (NewString);
|
||||
EFI_STRING_ID TokenToUpdate;
|
||||
EFI_PHYSICAL_ADDRESS *Table;
|
||||
SMBIOS_TABLE_ENTRY_POINT *EntryPoint;
|
||||
SMBIOS_STRUCTURE_POINTER SmbiosTable;
|
||||
|
||||
Status = EfiGetSystemConfigurationTable (&gEfiSmbiosTableGuid, (VOID **) &Table);
|
||||
if (EFI_ERROR (Status) || Table == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
|
||||
Status = Smbios->GetNext (Smbios, &SmbiosHandle, NULL, &Record, NULL);
|
||||
while (!EFI_ERROR(Status)) {
|
||||
if (Record->Type == SMBIOS_TYPE_BIOS_INFORMATION) {
|
||||
Type0Record = (SMBIOS_TABLE_TYPE0 *) Record;
|
||||
StrIndex = Type0Record->BiosVersion;
|
||||
GetOptionalStringByIndex ((CHAR8*)((UINT8*)Type0Record + Type0Record->Hdr.Length), StrIndex, &NewString);
|
||||
EntryPoint = (SMBIOS_TABLE_ENTRY_POINT*)Table;
|
||||
|
||||
FirmwareVersionString = (CHAR16 *) PcdGetPtr (PcdFirmwareVersionString);
|
||||
if (*FirmwareVersionString != 0x0000 ) {
|
||||
SmbiosTable = GetSmbiosTableFromType (EntryPoint, EFI_SMBIOS_TYPE_BIOS_INFORMATION , 0);
|
||||
if (SmbiosTable.Raw != NULL) {
|
||||
NewString2 = AllocateZeroPool (0xC0);
|
||||
|
||||
StrIndex = SmbiosTable.Type0->BiosVersion;
|
||||
GetOptionalStringByIndex ((CHAR8*)((UINT8*)SmbiosTable.Raw + SmbiosTable.Hdr->Length), StrIndex, &NewString);
|
||||
StrCatS (NewString2, 0x80 / sizeof (CHAR16), L"Version: ");
|
||||
StrCatS (NewString2, 0x80 / sizeof (CHAR16), NewString);
|
||||
TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_BIOS_VERSION);
|
||||
HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString2, NULL);
|
||||
FreePool (NewString);
|
||||
NewString = (CHAR16 *) PcdGetPtr (PcdFirmwareVersionString);
|
||||
HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_BIOS_VERSION), NewString, NULL);
|
||||
} else {
|
||||
HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_BIOS_VERSION), NewString, NULL);
|
||||
FreePool (NewString);
|
||||
}
|
||||
FreePool (NewString2);
|
||||
}
|
||||
|
||||
if (Record->Type == SMBIOS_TYPE_SYSTEM_INFORMATION) {
|
||||
Type1Record = (SMBIOS_TABLE_TYPE1 *) Record;
|
||||
StrIndex = Type1Record->ProductName;
|
||||
GetOptionalStringByIndex ((CHAR8*)((UINT8*)Type1Record + Type1Record->Hdr.Length), StrIndex, &NewString);
|
||||
HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_COMPUTER_MODEL), NewString, NULL);
|
||||
FreePool (NewString);
|
||||
}
|
||||
SmbiosTable = GetSmbiosTableFromType (EntryPoint, SMBIOS_TYPE_SYSTEM_INFORMATION , 0);
|
||||
if (SmbiosTable.Raw != NULL) {
|
||||
NewString3 = AllocateZeroPool (0x60);
|
||||
|
||||
Status = Smbios->GetNext (Smbios, &SmbiosHandle, NULL, &Record, NULL);
|
||||
StrIndex = SmbiosTable.Type1->ProductName;
|
||||
Str2Index = SmbiosTable.Type1->Manufacturer;
|
||||
GetOptionalStringByIndex ((CHAR8*)((UINT8*)SmbiosTable.Raw + SmbiosTable.Hdr->Length), StrIndex, &NewString);
|
||||
GetOptionalStringByIndex ((CHAR8*)((UINT8*)SmbiosTable.Raw + SmbiosTable.Hdr->Length), Str2Index, &NewString2);
|
||||
StrCatS (NewString3, 0x60 / sizeof (CHAR16), NewString2);
|
||||
StrCatS (NewString3, 0x60 / sizeof (CHAR16), L" ");
|
||||
StrCatS (NewString3, 0x60 / sizeof (CHAR16), NewString);
|
||||
TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_TITLE);
|
||||
HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString3, NULL);
|
||||
FreePool (NewString);
|
||||
|
||||
NewString3 = AllocateZeroPool (0x60);
|
||||
|
||||
StrIndex = SmbiosTable.Type1->Version;
|
||||
GetOptionalStringByIndex ((CHAR8*)((UINT8*)SmbiosTable.Raw + SmbiosTable.Hdr->Length), StrIndex, &NewString);
|
||||
StrCatS (NewString3, 0x60 / sizeof (CHAR16), L"Model: ");
|
||||
StrCatS (NewString3, 0x60 / sizeof (CHAR16), NewString);
|
||||
TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_COMPUTER_MODEL);
|
||||
HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString3, NULL);
|
||||
FreePool (NewString);
|
||||
FreePool (NewString2);
|
||||
FreePool (NewString3);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -58,6 +58,7 @@
|
||||
[Guids]
|
||||
gEfiIfrTianoGuid ## CONSUMES ## GUID (Extended IFR Guid Opcode)
|
||||
gEfiIfrFrontPageGuid ## CONSUMES ## GUID
|
||||
gEfiSmbiosTableGuid ## CONSUMES
|
||||
|
||||
[Protocols]
|
||||
gEfiSmbiosProtocolGuid ## CONSUMES
|
||||
|
Reference in New Issue
Block a user