Frontpage: get SMBIOS Data from table directly

rather than getting it from the EFI SMBIOS protocol
This commit is contained in:
CoolStar
2016-12-08 16:15:14 -08:00
committed by Matt DeVillier
parent 0286bfae44
commit bdd22050f6

View File

@ -688,6 +688,42 @@ GetOptionalStringByIndex (
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;
}
VOID
GetDeviceNameFromProduct (
@ -806,13 +842,9 @@ UpdateFrontPageStrings (
CHAR16 *NewString3;
EFI_STATUS Status;
EFI_STRING_ID TokenToUpdate;
EFI_SMBIOS_HANDLE SmbiosHandle;
EFI_SMBIOS_PROTOCOL *Smbios;
SMBIOS_TABLE_TYPE0 *Type0Record;
SMBIOS_TABLE_TYPE1 *Type1Record;
SMBIOS_TABLE_TYPE4 *Type4Record;
SMBIOS_TABLE_TYPE19 *Type19Record;
EFI_SMBIOS_TABLE_HEADER *Record;
EFI_PHYSICAL_ADDRESS *Table;
SMBIOS_TABLE_ENTRY_POINT *EntryPoint;
SMBIOS_STRUCTURE_POINTER SmbiosTable;
UINT64 InstalledMemory;
InstalledMemory = 0;
@ -820,83 +852,75 @@ UpdateFrontPageStrings (
//
// Update Front Page strings
//
Status = gBS->LocateProtocol (
&gEfiSmbiosProtocolGuid,
NULL,
(VOID **) &Smbios
);
if (!EFI_ERROR (Status)) {
SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
Status = Smbios->GetNext (Smbios, &SmbiosHandle, NULL, &Record, NULL);
while (!EFI_ERROR(Status)) {
Status = EfiGetSystemConfigurationTable (&gEfiSmbiosTableGuid, (VOID **) &Table);
if (EFI_ERROR (Status) || Table == NULL) {
} else {
EntryPoint = (SMBIOS_TABLE_ENTRY_POINT*)Table;
SmbiosTable = GetSmbiosTableFromType (EntryPoint, EFI_SMBIOS_TYPE_BIOS_INFORMATION , 0);
if (SmbiosTable.Raw == NULL) {
} else {
NewString3 = AllocateZeroPool (0x60);
if (Record->Type == EFI_SMBIOS_TYPE_BIOS_INFORMATION) {
Type0Record = (SMBIOS_TABLE_TYPE0 *) Record;
StrIndex = Type0Record->BiosVersion;
Str2Index = Type0Record->BiosReleaseDate;
GetOptionalStringByIndex ((CHAR8*)((UINT8*)Type0Record + Type0Record->Hdr.Length), StrIndex, &NewString);
GetOptionalStringByIndex ((CHAR8*)((UINT8*)Type0Record + Type0Record->Hdr.Length), Str2Index, &NewString2);
StrCatS (NewString3, 0x40 / sizeof (CHAR16), L"FW: ");
StrCatS (NewString3, 0x40 / sizeof (CHAR16), NewString2);
StrCatS (NewString3, 0x40 / sizeof (CHAR16), L"::");
StrCatS (NewString3, 0x40 / sizeof (CHAR16), NewString);
TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_BIOS_VERSION);
HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString3, NULL);
FreePool (NewString);
StrIndex = SmbiosTable.Type0->BiosVersion;
Str2Index = SmbiosTable.Type0->BiosReleaseDate;
GetOptionalStringByIndex ((CHAR8*)((UINT8*)SmbiosTable.Raw + SmbiosTable.Hdr->Length), StrIndex, &NewString);
GetOptionalStringByIndex ((CHAR8*)((UINT8*)SmbiosTable.Raw + SmbiosTable.Hdr->Length), Str2Index, &NewString2);
StrCatS (NewString3, 0x40 / sizeof (CHAR16), L"FW: ");
StrCatS (NewString3, 0x40 / sizeof (CHAR16), NewString);
StrCatS (NewString3, 0x40 / sizeof (CHAR16), L" ");
StrCatS (NewString3, 0x40 / sizeof (CHAR16), NewString2);
TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_BIOS_VERSION);
HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString3, NULL);
FreePool (NewString);
}
SmbiosTable = GetSmbiosTableFromType (EntryPoint, SMBIOS_TYPE_SYSTEM_INFORMATION , 0);
if (SmbiosTable.Raw == NULL) {
} else {
NewString3 = AllocateZeroPool (0x60);
StrIndex = SmbiosTable.Type1->ProductName;
Str2Index = SmbiosTable.Type1->Manufacturer;
GetOptionalStringByIndex ((CHAR8*)((UINT8*)SmbiosTable.Raw + SmbiosTable.Hdr->Length), StrIndex, &NewString);
NewString2 = AllocateZeroPool (0x60);
GetDeviceNameFromProduct(NewString, &NewString2);
StrCatS (NewString3, 0x60 / sizeof (CHAR16), NewString2);
StrCatS (NewString3, 0x60 / sizeof (CHAR16), L" (");
StrCatS (NewString3, 0x60 / sizeof (CHAR16), NewString);
StrCatS (NewString3, 0x60 / sizeof (CHAR16), L")");
TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_COMPUTER_MODEL);
HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString3, NULL);
FreePool (NewString);
}
SmbiosTable = GetSmbiosTableFromType (EntryPoint, SMBIOS_TYPE_PROCESSOR_INFORMATION , 0);
if (SmbiosTable.Raw == NULL) {
} else {
StrIndex = SmbiosTable.Type4->ProcessorVersion;
GetOptionalStringByIndex ((CHAR8*)((UINT8*)SmbiosTable.Raw + SmbiosTable.Hdr->Length), StrIndex, &NewString);
TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_CPU_MODEL);
HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);
FreePool (NewString);
}
SmbiosTable = GetSmbiosTableFromType (EntryPoint, SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS , 0);
if (SmbiosTable.Raw == NULL) {
} else {
if (SmbiosTable.Type19->StartingAddress != 0xFFFFFFFF ) {
InstalledMemory += RShiftU64(SmbiosTable.Type19->EndingAddress -
SmbiosTable.Type19->StartingAddress + 1, 10);
} else {
InstalledMemory += RShiftU64(SmbiosTable.Type19->ExtendedEndingAddress -
SmbiosTable.Type19->ExtendedStartingAddress + 1, 20);
}
if (Record->Type == SMBIOS_TYPE_SYSTEM_INFORMATION) {
Type1Record = (SMBIOS_TABLE_TYPE1 *) Record;
StrIndex = Type1Record->ProductName;
Str2Index = Type1Record->Manufacturer;
GetOptionalStringByIndex ((CHAR8*)((UINT8*)Type1Record + Type1Record->Hdr.Length), StrIndex, &NewString);
NewString2 = AllocateZeroPool (0x60);
GetDeviceNameFromProduct(NewString, &NewString2);
StrCatS (NewString3, 0x60 / sizeof (CHAR16), NewString2);
StrCatS (NewString3, 0x60 / sizeof (CHAR16), L" (");
StrCatS (NewString3, 0x60 / sizeof (CHAR16), NewString);
StrCatS (NewString3, 0x60 / sizeof (CHAR16), L")");
TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_COMPUTER_MODEL);
HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString3, NULL);
FreePool (NewString);
}
if (Record->Type == SMBIOS_TYPE_PROCESSOR_INFORMATION) {
Type4Record = (SMBIOS_TABLE_TYPE4 *) Record;
StrIndex = Type4Record->ProcessorVersion;
GetOptionalStringByIndex ((CHAR8*)((UINT8*)Type4Record + Type4Record->Hdr.Length), StrIndex, &NewString);
TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_CPU_MODEL);
HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);
FreePool (NewString);
}
// if (Record->Type == SMBIOS_TYPE_PROCESSOR_INFORMATION) {
// Type4Record = (SMBIOS_TABLE_TYPE4 *) Record;
// ConvertProcessorToString(Type4Record->CurrentSpeed, 6, &NewString);
// TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_CPU_SPEED);
// HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);
// FreePool (NewString);
// }
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);
}
// now update the total installed RAM size
ConvertMemorySizeToString ((UINT32)InstalledMemory, &NewString );
TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_MEMORY_SIZE);
HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);
FreePool (NewString);
}
Status = Smbios->GetNext (Smbios, &SmbiosHandle, NULL, &Record, NULL);
}
// now update the total installed RAM size
ConvertMemorySizeToString ((UINT32)InstalledMemory, &NewString );
TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_MEMORY_SIZE);
HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);
FreePool (NewString);
}
}
return ;
@ -911,7 +935,7 @@ UpdateFrontPageStrings (
@retval EFI_SUCCESS Event fired before Timeout expired.
@retval EFI_TIME_OUT Timout expired before Event fired..
**/
EFI_STATUS
WaitForSingleEvent (