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
 | 
					VOID
 | 
				
			||||||
UpdateFrontPageBannerStrings (
 | 
					UpdateFrontPageStrings (
 | 
				
			||||||
  VOID
 | 
					  VOID
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -286,9 +286,9 @@ InitializeFrontPage (
 | 
				
			|||||||
  ASSERT (gFrontPagePrivate.HiiHandle != NULL);
 | 
					  ASSERT (gFrontPagePrivate.HiiHandle != NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
  //Updata Front Page banner strings
 | 
					  //Updata Front Page strings
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
  UpdateFrontPageBannerStrings ();
 | 
					  UpdateFrontPageStrings ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
  // Update front page menus.
 | 
					  // 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
 | 
					VOID
 | 
				
			||||||
UpdateFrontPageBannerStrings (
 | 
					UpdateFrontPageStrings (
 | 
				
			||||||
  VOID
 | 
					  VOID
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINT8                             StrIndex;
 | 
					  UINT8                             StrIndex;
 | 
				
			||||||
 | 
					  UINT8                             Str2Index;
 | 
				
			||||||
  CHAR16                            *NewString;
 | 
					  CHAR16                            *NewString;
 | 
				
			||||||
  CHAR16                            *FirmwareVersionString;
 | 
					  CHAR16                            *NewString2;
 | 
				
			||||||
 | 
					  CHAR16                            *NewString3;
 | 
				
			||||||
  EFI_STATUS                        Status;
 | 
					  EFI_STATUS                        Status;
 | 
				
			||||||
  EFI_SMBIOS_HANDLE                 SmbiosHandle;
 | 
					  EFI_STRING_ID                     TokenToUpdate;
 | 
				
			||||||
  EFI_SMBIOS_PROTOCOL               *Smbios;
 | 
					  EFI_PHYSICAL_ADDRESS              *Table;
 | 
				
			||||||
  SMBIOS_TABLE_TYPE0                *Type0Record;
 | 
					  SMBIOS_TABLE_ENTRY_POINT          *EntryPoint;
 | 
				
			||||||
  SMBIOS_TABLE_TYPE1                *Type1Record;
 | 
					  SMBIOS_STRUCTURE_POINTER          SmbiosTable;
 | 
				
			||||||
  EFI_SMBIOS_TABLE_HEADER           *Record;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  //
 | 
					  Status = EfiGetSystemConfigurationTable (&gEfiSmbiosTableGuid, (VOID **)  &Table);
 | 
				
			||||||
  // Update Front Page banner strings base on SmBios Table.
 | 
					  if (EFI_ERROR (Status) || Table == NULL) {
 | 
				
			||||||
  //
 | 
					      return;
 | 
				
			||||||
  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);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return;
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
 | 
					  EntryPoint = (SMBIOS_TABLE_ENTRY_POINT*)Table;
 | 
				
			||||||
  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);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
      FirmwareVersionString = (CHAR16 *) PcdGetPtr (PcdFirmwareVersionString);
 | 
					  SmbiosTable = GetSmbiosTableFromType (EntryPoint, EFI_SMBIOS_TYPE_BIOS_INFORMATION , 0);
 | 
				
			||||||
      if (*FirmwareVersionString != 0x0000 ) {
 | 
					  if (SmbiosTable.Raw != NULL) {
 | 
				
			||||||
        FreePool (NewString);
 | 
					    NewString2 = AllocateZeroPool (0xC0);
 | 
				
			||||||
        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);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (Record->Type == SMBIOS_TYPE_SYSTEM_INFORMATION) {
 | 
					    StrIndex = SmbiosTable.Type0->BiosVersion;
 | 
				
			||||||
      Type1Record = (SMBIOS_TABLE_TYPE1 *) Record;
 | 
					    GetOptionalStringByIndex ((CHAR8*)((UINT8*)SmbiosTable.Raw + SmbiosTable.Hdr->Length), StrIndex, &NewString);
 | 
				
			||||||
      StrIndex = Type1Record->ProductName;
 | 
					    StrCatS (NewString2, 0x80 / sizeof (CHAR16), L"Version: ");
 | 
				
			||||||
      GetOptionalStringByIndex ((CHAR8*)((UINT8*)Type1Record + Type1Record->Hdr.Length), StrIndex, &NewString);
 | 
					    StrCatS (NewString2, 0x80 / sizeof (CHAR16), NewString);
 | 
				
			||||||
      HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_COMPUTER_MODEL), NewString, NULL);
 | 
					    TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_BIOS_VERSION);
 | 
				
			||||||
      FreePool (NewString);
 | 
					    HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString2, NULL);
 | 
				
			||||||
    }
 | 
					    FreePool (NewString);
 | 
				
			||||||
 | 
					    FreePool (NewString2);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Status = Smbios->GetNext (Smbios, &SmbiosHandle, NULL, &Record, NULL);
 | 
					  SmbiosTable = GetSmbiosTableFromType (EntryPoint, SMBIOS_TYPE_SYSTEM_INFORMATION , 0);
 | 
				
			||||||
 | 
					  if (SmbiosTable.Raw != NULL) {
 | 
				
			||||||
 | 
					    NewString3 = AllocateZeroPool (0x60);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    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]
 | 
					[Guids]
 | 
				
			||||||
  gEfiIfrTianoGuid                              ## CONSUMES ## GUID (Extended IFR Guid Opcode)
 | 
					  gEfiIfrTianoGuid                              ## CONSUMES ## GUID (Extended IFR Guid Opcode)
 | 
				
			||||||
  gEfiIfrFrontPageGuid                          ## CONSUMES ## GUID
 | 
					  gEfiIfrFrontPageGuid                          ## CONSUMES ## GUID
 | 
				
			||||||
 | 
					  gEfiSmbiosTableGuid                           ## CONSUMES
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[Protocols]
 | 
					[Protocols]
 | 
				
			||||||
  gEfiSmbiosProtocolGuid                        ## CONSUMES
 | 
					  gEfiSmbiosProtocolGuid                        ## CONSUMES
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user