aboutsummaryrefslogtreecommitdiffstats
path: root/roms/edk2/OvmfPkg/Library/SmbiosVersionLib
diff options
context:
space:
mode:
authorAngelos Mouzakitis <a.mouzakitis@virtualopensystems.com>2023-10-10 14:33:42 +0000
committerAngelos Mouzakitis <a.mouzakitis@virtualopensystems.com>2023-10-10 14:33:42 +0000
commitaf1a266670d040d2f4083ff309d732d648afba2a (patch)
tree2fc46203448ddcc6f81546d379abfaeb323575e9 /roms/edk2/OvmfPkg/Library/SmbiosVersionLib
parente02cda008591317b1625707ff8e115a4841aa889 (diff)
Add submodule dependency filesHEADmaster
Change-Id: Iaf8d18082d3991dec7c0ebbea540f092188eb4ec
Diffstat (limited to 'roms/edk2/OvmfPkg/Library/SmbiosVersionLib')
-rw-r--r--roms/edk2/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.c105
-rw-r--r--roms/edk2/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.inf47
2 files changed, 152 insertions, 0 deletions
diff --git a/roms/edk2/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.c b/roms/edk2/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.c
new file mode 100644
index 000000000..4d2c23cfb
--- /dev/null
+++ b/roms/edk2/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.c
@@ -0,0 +1,105 @@
+/** @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>
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#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;
+ SMBIOS_TABLE_3_0_ENTRY_POINT V3;
+} QEMU_SMBIOS_ANCHOR;
+
+RETURN_STATUS
+EFIAPI
+DetectSmbiosVersion (
+ VOID
+ )
+{
+ FIRMWARE_CONFIG_ITEM Anchor, Tables;
+ UINTN AnchorSize, TablesSize;
+ QEMU_SMBIOS_ANCHOR QemuAnchor;
+ UINT16 SmbiosVersion;
+ RETURN_STATUS PcdStatus;
+
+ if (PcdGetBool (PcdQemuSmbiosValidated)) {
+ //
+ // Some other module, linked against this library, has already performed
+ // the task at hand. This should never happen, but it's easy to handle;
+ // just exit early.
+ //
+ return RETURN_SUCCESS;
+ }
+
+ 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;
+
+ case sizeof QemuAnchor.V3:
+ QemuFwCfgReadBytes (AnchorSize, &QemuAnchor);
+
+ if (QemuAnchor.V3.MajorVersion != 3 ||
+ QemuAnchor.V3.TableMaximumSize != TablesSize ||
+ CompareMem (QemuAnchor.V3.AnchorString, "_SM3_", 5) != 0) {
+ return RETURN_SUCCESS;
+ }
+ SmbiosVersion = (UINT16)(QemuAnchor.V3.MajorVersion << 8 |
+ QemuAnchor.V3.MinorVersion);
+
+ DEBUG ((DEBUG_INFO, "%a: SMBIOS 3.x DocRev from QEMU: 0x%02x\n",
+ __FUNCTION__, QemuAnchor.V3.DocRev));
+ PcdStatus = PcdSet8S (PcdSmbiosDocRev, QemuAnchor.V3.DocRev);
+ ASSERT_RETURN_ERROR (PcdStatus);
+ break;
+
+ default:
+ return RETURN_SUCCESS;
+ }
+
+ DEBUG ((DEBUG_INFO, "%a: SMBIOS version from QEMU: 0x%04x\n", __FUNCTION__,
+ SmbiosVersion));
+ PcdStatus = PcdSet16S (PcdSmbiosVersion, SmbiosVersion);
+ ASSERT_RETURN_ERROR (PcdStatus);
+
+ //
+ // SMBIOS platform drivers can now fetch and install
+ // "etc/smbios/smbios-tables" from QEMU.
+ //
+ PcdStatus = PcdSetBoolS (PcdQemuSmbiosValidated, TRUE);
+ ASSERT_RETURN_ERROR (PcdStatus);
+ return RETURN_SUCCESS;
+}
diff --git a/roms/edk2/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.inf b/roms/edk2/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.inf
new file mode 100644
index 000000000..8417498d9
--- /dev/null
+++ b/roms/edk2/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.inf
@@ -0,0 +1,47 @@
+## @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>
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+##
+
+[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
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSmbiosDocRev
+ gUefiOvmfPkgTokenSpaceGuid.PcdQemuSmbiosValidated