Introduce a minimal library instance for fetching and validating the
SMBIOS entry point structure exposed by QEMU over fw_cfg. This library is
meant to be hooked into MdeModulePkg/Universal/SmbiosDxe by platform DSC
files, so that the library can set the PCD(s) that SmbiosDxe consumes at
the right moment.

At the moment only SMBIOS 2.x entry points are recognized.

Cc: Ard Biesheuvel <ard.biesheu...@linaro.org>
Cc: Wei Huang <w...@redhat.com>
Cc: Jordan Justen <jordan.l.jus...@intel.com>
Cc: Gabriel L. Somlo <so...@cmu.edu>
Suggested-by: Jordan Justen <jordan.l.jus...@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <ler...@redhat.com>
---
 OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.inf | 51 +++++++++++++
 OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.c   | 76 
++++++++++++++++++++
 2 files changed, 127 insertions(+)

diff --git a/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.inf 
b/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.inf
new file mode 100644
index 0000000..14c25c9
--- /dev/null
+++ b/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.inf
@@ -0,0 +1,51 @@
+## @file
+#
+# A hook-in library for MdeModulePkg/Universal/SmbiosDxe, in order to set
+# gEfiMdeModulePkgTokenSpaceGuid.PcdSmbiosVersion (and possibly other PCDs)
+# just before SmbiosDxe consumes them.
+#
+# Copyright (C) 2013, 2015, Red Hat, Inc.
+# Copyright (c) 2008 - 2012, 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                    = 0x00010005
+  BASE_NAME                      = DetectSmbiosVersionLib
+  FILE_GUID                      = 6c633bb2-ae33-49ae-9f89-b5aa999fe3ae
+  MODULE_TYPE                    = BASE
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = SmbiosVersionLib|DXE_DRIVER
+  CONSTRUCTOR                    = DetectSmbiosVersion
+
+#
+# The following information is for reference only and not required by the build
+# tools.
+#
+#  VALID_ARCHITECTURES           = IA32 X64 ARM AARCH64
+#
+
+[Sources]
+  DetectSmbiosVersionLib.c
+
+[Packages]
+  MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  OvmfPkg/OvmfPkg.dec
+
+[LibraryClasses]
+  BaseMemoryLib
+  DebugLib
+  PcdLib
+  QemuFwCfgLib
+
+[Pcd]
+  gEfiMdeModulePkgTokenSpaceGuid.PcdSmbiosVersion
diff --git a/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.c 
b/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.c
new file mode 100644
index 0000000..0efe020
--- /dev/null
+++ b/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.c
@@ -0,0 +1,76 @@
+/** @file
+
+  A hook-in library for MdeModulePkg/Universal/SmbiosDxe, in order to set
+  gEfiMdeModulePkgTokenSpaceGuid.PcdSmbiosVersion (and possibly other PCDs)
+  just before SmbiosDxe consumes them.
+
+  Copyright (C) 2013, 2015, Red Hat, Inc.
+  Copyright (c) 2008 - 2012, 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.
+
+**/
+
+#include <IndustryStandard/SmBios.h>
+
+#include <Base.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/PcdLib.h>
+#include <Library/QemuFwCfgLib.h>
+
+typedef union {
+  SMBIOS_TABLE_ENTRY_POINT     V2;
+} QEMU_SMBIOS_ANCHOR;
+
+RETURN_STATUS
+EFIAPI
+DetectSmbiosVersion (
+  VOID
+  )
+{
+  FIRMWARE_CONFIG_ITEM Anchor, Tables;
+  UINTN                AnchorSize, TablesSize;
+  QEMU_SMBIOS_ANCHOR   QemuAnchor;
+  UINT16               SmbiosVersion;
+
+  if (RETURN_ERROR (QemuFwCfgFindFile (
+                      "etc/smbios/smbios-anchor", &Anchor, &AnchorSize)) ||
+      RETURN_ERROR (QemuFwCfgFindFile (
+                      "etc/smbios/smbios-tables", &Tables, &TablesSize)) ||
+      TablesSize == 0) {
+    return RETURN_SUCCESS;
+  }
+
+  QemuFwCfgSelectItem (Anchor);
+
+  switch (AnchorSize) {
+  case sizeof QemuAnchor.V2:
+    QemuFwCfgReadBytes (AnchorSize, &QemuAnchor);
+
+    if (QemuAnchor.V2.MajorVersion != 2 ||
+        QemuAnchor.V2.TableLength != TablesSize ||
+        CompareMem (QemuAnchor.V2.AnchorString, "_SM_", 4) != 0 ||
+        CompareMem (QemuAnchor.V2.IntermediateAnchorString, "_DMI_", 5) != 0) {
+      return RETURN_SUCCESS;
+    }
+    SmbiosVersion = (UINT16)(QemuAnchor.V2.MajorVersion << 8 |
+                             QemuAnchor.V2.MinorVersion);
+    break;
+
+  default:
+    return RETURN_SUCCESS;
+  }
+
+  DEBUG ((EFI_D_INFO, "%a: SMBIOS version from QEMU: 0x%04x\n", __FUNCTION__,
+    SmbiosVersion));
+  PcdSet16 (PcdSmbiosVersion, SmbiosVersion);
+
+  return RETURN_SUCCESS;
+}
-- 
1.8.3.1


_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to