From 0468303899bd1fa9a8a04e0dcf5de6e84beb0224 Mon Sep 17 00:00:00 2001 From: Giri P Mudusuru Date: Sun, 13 Nov 2016 23:06:26 -0800 Subject: IntelSiliconPkg: Add DxeSmbiosDataHobLib Added NULL Library constructor DxeSmbiosDataHobLib which adds SMBIOS records from gIntelSmbiosDataHobGuid HOB to SMBIOS table using SMBIOS protocol. Cc: Jiewen Yao Cc: Star Zeng Cc: Michael Kinney Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Giri P Mudusuru Reviewed-by: Jiewen Yao --- .../DxeSmbiosDataHobLib/DxeSmbiosDataHobLib.c | 193 +++++++++++++++++++++ .../DxeSmbiosDataHobLib/DxeSmbiosDataHobLib.inf | 44 +++++ 2 files changed, 237 insertions(+) create mode 100644 IntelSiliconPkg/Library/DxeSmbiosDataHobLib/DxeSmbiosDataHobLib.c create mode 100644 IntelSiliconPkg/Library/DxeSmbiosDataHobLib/DxeSmbiosDataHobLib.inf diff --git a/IntelSiliconPkg/Library/DxeSmbiosDataHobLib/DxeSmbiosDataHobLib.c b/IntelSiliconPkg/Library/DxeSmbiosDataHobLib/DxeSmbiosDataHobLib.c new file mode 100644 index 0000000000..8d513e0320 --- /dev/null +++ b/IntelSiliconPkg/Library/DxeSmbiosDataHobLib/DxeSmbiosDataHobLib.c @@ -0,0 +1,193 @@ +/** @file + Library to add SMBIOS data records from HOB to SMBIOS table. + + Copyright (c) 2016, Intel Corporation. All rights reserved.
+ + This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License which accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + @par Specification Reference: + System Management BIOS (SMBIOS) Reference Specification v3.0.0 + dated 2015-Feb-12 (DSP0134) + http://www.dmtf.org/sites/default/files/standards/documents/DSP0134_3.0.0.pdf + +**/ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** + + Get the full size of SMBIOS structure including optional strings that follow the formatted structure. + @note: This function is copy from SmbiosDxe in MdeModulePkg. + + @param[in] This The EFI_SMBIOS_PROTOCOL instance. + @param[in] Head Pointer to the beginning of SMBIOS structure. + @param[out] Size The returned size. + @param[out] NumberOfStrings The returned number of optional strings that follow the formatted structure. + + @retval EFI_SUCCESS Size returned in Size. + @retval EFI_INVALID_PARAMETER Input SMBIOS structure mal-formed or Size is NULL. + +**/ +EFI_STATUS +EFIAPI +GetSmbiosStructureSize ( + IN CONST EFI_SMBIOS_PROTOCOL *This, + IN EFI_SMBIOS_TABLE_HEADER *Head, + OUT UINTN *Size, + OUT UINTN *NumberOfStrings + ) +{ + UINTN FullSize; + UINTN StrLen; + UINTN MaxLen; + INT8* CharInStr; + + if (Size == NULL || NumberOfStrings == NULL) { + return EFI_INVALID_PARAMETER; + } + + FullSize = Head->Length; + CharInStr = (INT8*)Head + Head->Length; + *Size = FullSize; + *NumberOfStrings = 0; + StrLen = 0; + + // + // look for the two consecutive zeros, check the string limit by the way. + // + while (*CharInStr != 0 || *(CharInStr+1) != 0) { + if (*CharInStr == 0) { + *Size += 1; + CharInStr++; + } + + if (This->MajorVersion < 2 || (This->MajorVersion == 2 && This->MinorVersion < 7)) { + MaxLen = SMBIOS_STRING_MAX_LENGTH; + } else if (This->MajorVersion < 3) { + // + // Reference SMBIOS 2.7, chapter 6.1.3, it will have no limit on the length of each individual text string. + // However, the length of the entire structure table (including all strings) must be reported + // in the Structure Table Length field of the SMBIOS Structure Table Entry Point, + // which is a WORD field limited to 65,535 bytes. + // + MaxLen = SMBIOS_TABLE_MAX_LENGTH; + } else { + // + // SMBIOS 3.0 defines the Structure table maximum size as DWORD field limited to 0xFFFFFFFF bytes. + // Locate the end of string as long as possible. + // + MaxLen = SMBIOS_3_0_TABLE_MAX_LENGTH; + } + + for (StrLen = 0 ; StrLen < MaxLen; StrLen++) { + if (*(CharInStr+StrLen) == 0) { + break; + } + } + + if (StrLen == MaxLen) { + return EFI_INVALID_PARAMETER; + } + + // + // forward the pointer + // + CharInStr += StrLen; + *Size += StrLen; + *NumberOfStrings += 1; + } + + // + // count ending two zeros. + // + *Size += 2; + return EFI_SUCCESS; +} + +/** + Adds SMBIOS records to tables + + @param[in] ImageHandle Image handle of this driver. + @param[in] SystemTable Global system service table. + + @retval EFI_UNSUPPORTED - Could not locate SMBIOS protocol + @retval EFI_OUT_OF_RESOURCES - Failed to allocate memory for SMBIOS HOB type. + @retval EFI_SUCCESS - Successfully added SMBIOS records based on HOB. +**/ +EFI_STATUS +EFIAPI +DxeSmbiosDataHobLibConstructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_PEI_HOB_POINTERS Hob; + EFI_SMBIOS_HANDLE SmbiosHandle; + EFI_SMBIOS_PROTOCOL *Smbios; + EFI_STATUS Status; + UINTN InstalledPayloadSize; + UINTN MaxPayloadSize; + UINT8 *RecordPtr; + UINT16 RecordCount; + UINTN StructureSize; + UINTN NumberOfStrings; + + RecordCount = 0; + + DEBUG ((DEBUG_INFO, "Adding SMBIOS records from HOB..\n")); + + Status = gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID **)&Smbios); + if (Smbios == NULL) { + DEBUG ((DEBUG_WARN, " Can't locate SMBIOS protocol\n")); + return EFI_UNSUPPORTED; + } + + /// + /// Get SMBIOS HOB data + /// + for (Hob.Raw = GetHobList (); !END_OF_HOB_LIST(Hob); Hob.Raw = GET_NEXT_HOB (Hob)) { + if ((GET_HOB_TYPE (Hob) == EFI_HOB_TYPE_GUID_EXTENSION) && (CompareGuid (&Hob.Guid->Name, &gIntelSmbiosDataHobGuid))) { + RecordPtr = (UINT8 *)Hob.Raw + sizeof (EFI_HOB_GUID_TYPE); + MaxPayloadSize = Hob.Guid->Header.HobLength - sizeof (EFI_HOB_GUID_TYPE); + + InstalledPayloadSize = 0; + do { + StructureSize = 0; + Status = GetSmbiosStructureSize (Smbios, (EFI_SMBIOS_TABLE_HEADER *)RecordPtr, &StructureSize, &NumberOfStrings); + if ((Status == EFI_SUCCESS) && (InstalledPayloadSize + StructureSize <= MaxPayloadSize)) { + InstalledPayloadSize += StructureSize; + + /// + /// Add generic SMBIOS HOB to SMBIOS table + /// + DEBUG ((DEBUG_VERBOSE, " Add SMBIOS record type: %x\n", ((EFI_SMBIOS_TABLE_HEADER *) RecordPtr)->Type)); + SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED; + Status = Smbios->Add (Smbios, NULL, &SmbiosHandle, (EFI_SMBIOS_TABLE_HEADER *) RecordPtr); + if (!EFI_ERROR (Status)) { + RecordPtr += StructureSize; + RecordCount++; + } + } else { + break; + } + } while (TRUE); + } + } + DEBUG ((DEBUG_INFO, " Found %d Records and added to SMBIOS table.\n", RecordCount)); + + return EFI_SUCCESS; +} + diff --git a/IntelSiliconPkg/Library/DxeSmbiosDataHobLib/DxeSmbiosDataHobLib.inf b/IntelSiliconPkg/Library/DxeSmbiosDataHobLib/DxeSmbiosDataHobLib.inf new file mode 100644 index 0000000000..afac26f61e --- /dev/null +++ b/IntelSiliconPkg/Library/DxeSmbiosDataHobLib/DxeSmbiosDataHobLib.inf @@ -0,0 +1,44 @@ +## @file +# Component INF file for the DxeSmbiosDataHob library. +# +# Copyright (c) 2016, Intel Corporation. All rights reserved.
+# +# This program and the accompanying materials are licensed and made available under +# the terms and conditions of the BSD License which accompanies this distribution. +# The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +## + +[Defines] +INF_VERSION = 0x00010017 +BASE_NAME = DxeSmbiosDataHobLib +FILE_GUID = AF55A9B6-2AE6-4B08-8CF7-750B7CBF49D7 +MODULE_TYPE = DXE_DRIVER +LIBRARY_CLASS = NULL|DXE_DRIVER +CONSTRUCTOR = DxeSmbiosDataHobLibConstructor + +[Packages] +MdePkg/MdePkg.dec +IntelSiliconPkg/IntelSiliconPkg.dec + +[Sources] +DxeSmbiosDataHobLib.c + +[LibraryClasses] +DebugLib +BaseMemoryLib +MemoryAllocationLib +BaseLib +HobLib +UefiLib + +[Guids] +gIntelSmbiosDataHobGuid ## CONSUMES + +[Depex] +gEfiSmbiosProtocolGuid + -- cgit v1.2.3