public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: Giri P Mudusuru <giri.p.mudusuru@intel.com>
To: edk2-devel@lists.01.org
Cc: Jiewen Yao <jiewen.yao@intel.com>,
	Star Zeng <star.zeng@intel.com>,
	Michael Kinney <michael.d.kinney@intel.com>
Subject: [PATCH] IntelSiliconPkg: Add DxeSmbiosDataHobLib
Date: Sun, 13 Nov 2016 23:26:53 -0800	[thread overview]
Message-ID: <32baa8ac1e6c73081e0e66ae9aeaffca8e709873.1479108165.git.giri.p.mudusuru@intel.com> (raw)

Added NULL Library constructor DxeSmbiosDataHobLib which adds SMBIOS
records from gIntelSmbiosDataHobGuid HOB to SMBIOS table using
SMBIOS protocol.

Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Star Zeng <star.zeng@intel.com>
Cc: Michael Kinney <michael.d.kinney@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Giri P Mudusuru <giri.p.mudusuru@intel.com>
---
 .../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 0000000..8d513e0
--- /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.<BR>
+
+  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 <IndustryStandard/SmBios.h>
+#include <Library/UefiLib.h>
+#include <Library/BaseLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/DebugLib.h>
+#include <Library/HobLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Protocol/Smbios.h>
+
+/**
+
+  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 0000000..afac26f
--- /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.<BR>
+#
+# 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
+
-- 
2.9.0.windows.1



             reply	other threads:[~2016-11-14  7:27 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-11-14  7:26 Giri P Mudusuru [this message]
2016-11-17  8:46 ` [PATCH] IntelSiliconPkg: Add DxeSmbiosDataHobLib Yao, Jiewen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=32baa8ac1e6c73081e0e66ae9aeaffca8e709873.1479108165.git.giri.p.mudusuru@intel.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox