Gather information from SMBIOS table rather than getting it from the EFI SMBIOS protocol for coreboot builds.
Signed-off-by: Matt DeVillier <matt.devill...@gmail.com> Signed-off-by: Sean Rhodes <sean@starlabs.systems> --- MdeModulePkg/Application/UiApp/FrontPage.c | 196 ++++++++++++++++++++- MdeModulePkg/Application/UiApp/UiApp.inf | 2 + MdeModulePkg/MdeModulePkg.dec | 2 + UefiPayloadPkg/UefiPayloadPkg.dsc | 6 + 4 files changed, 205 insertions(+), 1 deletion(-) diff --git a/MdeModulePkg/Application/UiApp/FrontPage.c b/MdeModulePkg/Application/UiApp/FrontPage.c index cc9569e225..1a7182c4dc 100644 --- a/MdeModulePkg/Application/UiApp/FrontPage.c +++ b/MdeModulePkg/Application/UiApp/FrontPage.c @@ -293,7 +293,11 @@ InitializeFrontPage ( // // Updata Front Page banner strings // - UpdateFrontPageBannerStrings (); + if (FixedPcdGetBool (PcdCoreboot)) { + DirectUpdateFrontPageBannerStrings (); + } else { + UpdateFrontPageBannerStrings (); + } // // Update front page menus. @@ -496,6 +500,55 @@ 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; +} + /** Update the banner information for the Front Page based on Smbios information. @@ -662,6 +715,147 @@ UpdateFrontPageBannerStrings ( FreePool (NewString); } +/** + + Update the banner information for the Front Page based on table. + +**/ +VOID +DirectUpdateFrontPageBannerStrings ( + VOID + ) +{ + CHAR16 *MemoryStr; + EFI_STATUS Status; + EFI_STRING_ID TokenToUpdate; + EFI_PHYSICAL_ADDRESS *Table; + SMBIOS_TABLE_ENTRY_POINT *EntryPoint; + SMBIOS_STRUCTURE_POINTER SmbiosTable; + UINT64 InstalledMemory; + + InstalledMemory = 0; + + // + // Update Front Page strings + // + 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) { + CHAR16 *FwVersion; + CHAR16 *FwDate; + CHAR16 *TmpBuffer; + UINT8 VersionIdx; + UINT8 DateIdx; + + TmpBuffer = AllocateZeroPool (0x60); + + VersionIdx = SmbiosTable.Type0->BiosVersion; + DateIdx = SmbiosTable.Type0->BiosReleaseDate; + + GetOptionalStringByIndex ((CHAR8 *)((UINT8 *)SmbiosTable.Raw + SmbiosTable.Hdr->Length), VersionIdx, &FwVersion); + GetOptionalStringByIndex ((CHAR8 *)((UINT8 *)SmbiosTable.Raw + SmbiosTable.Hdr->Length), DateIdx, &FwDate); + + StrCatS (TmpBuffer, 0x60 / sizeof (CHAR16), L"FW: "); + StrCatS (TmpBuffer, 0x60 / sizeof (CHAR16), FwVersion); + StrCatS (TmpBuffer, 0x60 / sizeof (CHAR16), L" "); + StrCatS (TmpBuffer, 0x60 / sizeof (CHAR16), FwDate); + + TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_BIOS_VERSION); + HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, TmpBuffer, NULL); + + FreePool (FwVersion); + FreePool (FwDate); + FreePool (TmpBuffer); + } + + SmbiosTable = GetSmbiosTableFromType (EntryPoint, SMBIOS_TYPE_SYSTEM_INFORMATION, 0); + + if (SmbiosTable.Raw != NULL) { + CHAR16 *ProductName; + CHAR16 *Manufacturer; + CHAR16 *DeviceName; + CHAR16 *TmpBuffer; + UINT8 ProductIdx; + UINT8 ManIdx; + + TmpBuffer = AllocateZeroPool (0x60); + DeviceName = AllocateZeroPool (0x60); + + ProductIdx = SmbiosTable.Type1->ProductName; + ManIdx = SmbiosTable.Type1->Manufacturer; + + 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 { + InstalledMemory += RShiftU64 ( + SmbiosTable.Type19->ExtendedEndingAddress - + SmbiosTable.Type19->ExtendedStartingAddress + 1, + 20 + ); + } + + // 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); + } + } +} + /** This function will change video resolution and text mode according to defined setup mode or defined boot mode diff --git a/MdeModulePkg/Application/UiApp/UiApp.inf b/MdeModulePkg/Application/UiApp/UiApp.inf index 3b9e048851..21979c5a55 100644 --- a/MdeModulePkg/Application/UiApp/UiApp.inf +++ b/MdeModulePkg/Application/UiApp/UiApp.inf @@ -58,6 +58,7 @@ [Guids] gEfiIfrTianoGuid ## CONSUMES ## GUID (Extended IFR Guid Opcode) gEfiIfrFrontPageGuid ## CONSUMES ## GUID + gEfiSmbiosTableGuid ## CONSUMES ## GUID [Protocols] gEfiSmbiosProtocolGuid ## CONSUMES @@ -77,6 +78,7 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoVerticalResolution ## CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString ## CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdCoreboot ## CONSUMES [UserExtensions.TianoCore."ExtraFiles"] UiAppExtra.uni diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec index 463e889e9a..e8565cf542 100644 --- a/MdeModulePkg/MdeModulePkg.dec +++ b/MdeModulePkg/MdeModulePkg.dec @@ -1076,6 +1076,8 @@ # FALSE - UEFI Stack Guard will be disabled.<BR> # @Prompt Enable UEFI Stack Guard. gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard|FALSE|BOOLEAN|0x30001055 + # Build Type + gEfiMdeModulePkgTokenSpaceGuid.PcdCoreboot|FALSE|BOOLEAN|0x00000027 [PcdsFixedAtBuild, PcdsPatchableInModule] ## Dynamic type PCD can be registered callback function for Pcd setting action. diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayloadPkg.dsc index 1ce96a51c1..636ab31b64 100644 --- a/UefiPayloadPkg/UefiPayloadPkg.dsc +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc @@ -399,6 +399,12 @@ gEfiMdePkgTokenSpaceGuid.PcdPerformanceLibraryPropertyMask | 0x1 !endif +!if $(BOOTLOADER) == "COREBOOT" + gEfiMdeModulePkgTokenSpaceGuid.PcdCoreboot|TRUE +!else + gEfiMdeModulePkgTokenSpaceGuid.PcdCoreboot|FALSE +!endif + [PcdsPatchableInModule.X64] gPcAtChipsetPkgTokenSpaceGuid.PcdRtcIndexRegister|$(RTC_INDEX_REGISTER) gPcAtChipsetPkgTokenSpaceGuid.PcdRtcTargetRegister|$(RTC_TARGET_REGISTER) -- 2.32.0 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#86272): https://edk2.groups.io/g/devel/message/86272 Mute This Topic: https://groups.io/mt/88828789/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-