At this point all platforms that use OvmfPkg/SmbiosPlatformDxe in edk2,
namely ArmVirtQemu.dsc and OvmfPkg*.dsc, have been migrated to
SmbiosVersionLib. Therefore SmbiosPlatformDxe itself can forego verifying
QEMU's SMBIOS entry point; if SmbiosVersionLib's validation was
successful, it should just rely on that.

(Note that SmbiosPlatformDxe has a depex on EFI_SMBIOS_PROTOCOL, installed
by SmbiosDxe, containing SmbiosVersionLib, therefore the set/get order of
PcdQemuSmbiosValidated is ensured.)

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>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <ler...@redhat.com>
---
 OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.inf |  1 +
 OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf             |  4 +++
 OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.c   | 14 +++++++++
 OvmfPkg/SmbiosPlatformDxe/Qemu.c                            | 30 
++++++--------------
 4 files changed, 28 insertions(+), 21 deletions(-)

diff --git a/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.inf 
b/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.inf
index 14c25c9..8487e73 100644
--- a/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.inf
+++ b/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.inf
@@ -49,3 +49,4 @@ [LibraryClasses]
 
 [Pcd]
   gEfiMdeModulePkgTokenSpaceGuid.PcdSmbiosVersion
+  gUefiOvmfPkgTokenSpaceGuid.PcdQemuSmbiosValidated
diff --git a/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf 
b/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf
index 6935397..c8fa3bb 100644
--- a/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf
+++ b/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf
@@ -57,6 +57,10 @@ [LibraryClasses]
   HobLib
   QemuFwCfgLib
   MemoryAllocationLib
+  PcdLib
+
+[Pcd]
+  gUefiOvmfPkgTokenSpaceGuid.PcdQemuSmbiosValidated
 
 [Protocols]
   gEfiSmbiosProtocolGuid                      # PROTOCOL ALWAYS_CONSUMED
diff --git a/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.c 
b/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.c
index 0efe020..9d5e337 100644
--- a/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.c
+++ b/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.c
@@ -40,6 +40,15 @@ DetectSmbiosVersion (
   QEMU_SMBIOS_ANCHOR   QemuAnchor;
   UINT16               SmbiosVersion;
 
+  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 (
@@ -72,5 +81,10 @@ DetectSmbiosVersion (
     SmbiosVersion));
   PcdSet16 (PcdSmbiosVersion, SmbiosVersion);
 
+  //
+  // SMBIOS platform drivers can now fetch and install
+  // "etc/smbios/smbios-tables" from QEMU.
+  //
+  PcdSetBool (PcdQemuSmbiosValidated, TRUE);
   return RETURN_SUCCESS;
 }
diff --git a/OvmfPkg/SmbiosPlatformDxe/Qemu.c b/OvmfPkg/SmbiosPlatformDxe/Qemu.c
index f7ace4f..9466b95 100644
--- a/OvmfPkg/SmbiosPlatformDxe/Qemu.c
+++ b/OvmfPkg/SmbiosPlatformDxe/Qemu.c
@@ -15,6 +15,7 @@
 #include "SmbiosPlatformDxe.h"
 #include <Library/QemuFwCfgLib.h>
 #include <Library/MemoryAllocationLib.h>
+#include <Library/PcdLib.h>
 
 /**
   Locates and extracts the QEMU SMBIOS data if present in fw_cfg
@@ -27,32 +28,19 @@ GetQemuSmbiosTables (
   VOID
   )
 {
-  SMBIOS_TABLE_ENTRY_POINT QemuAnchor;
-  FIRMWARE_CONFIG_ITEM     Anchor, Tables;
-  UINTN                    AnchorSize, TablesSize;
+  EFI_STATUS               Status;
+  FIRMWARE_CONFIG_ITEM     Tables;
+  UINTN                    TablesSize;
   UINT8                    *QemuTables;
 
-  if (EFI_ERROR (QemuFwCfgFindFile (
-                   "etc/smbios/smbios-anchor", &Anchor, &AnchorSize)) ||
-      EFI_ERROR (QemuFwCfgFindFile (
-                   "etc/smbios/smbios-tables", &Tables, &TablesSize)) ||
-      AnchorSize != sizeof (QemuAnchor) ||
-      TablesSize == 0) {
+  if (!PcdGetBool (PcdQemuSmbiosValidated)) {
     return NULL;
   }
 
-  //
-  // We copy the entry point structure to perform some additional checks,
-  // but discard it upon return.
-  //
-  QemuFwCfgSelectItem (Anchor);
-  QemuFwCfgReadBytes (AnchorSize, &QemuAnchor);
-
-  if (AsciiStrnCmp ((CHAR8 *)QemuAnchor.AnchorString, "_SM_", 4) ||
-      AsciiStrnCmp ((CHAR8 *)QemuAnchor.IntermediateAnchorString, "_DMI_", 5) 
||
-      TablesSize != QemuAnchor.TableLength) {
-    return NULL;
-  }
+  Status = QemuFwCfgFindFile ("etc/smbios/smbios-tables", &Tables,
+             &TablesSize);
+  ASSERT_EFI_ERROR (Status);
+  ASSERT (TablesSize > 0);
 
   QemuTables = AllocatePool (TablesSize);
   if (QemuTables == NULL) {
-- 
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