diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c b/IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c index 774a69cd04..7a54450c19 100644 --- a/IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c +++ b/IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c @@ -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 (