diff --git a/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.c b/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.c index 0efe020eea..9d5e337e1a 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/Library/SmbiosVersionLib/DetectSmbiosVersionLib.inf b/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.inf index 14c25c924e..8487e73e46 100644 --- a/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.inf +++ b/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.inf @@ -49,3 +49,4 @@ [Pcd] gEfiMdeModulePkgTokenSpaceGuid.PcdSmbiosVersion + gUefiOvmfPkgTokenSpaceGuid.PcdQemuSmbiosValidated diff --git a/OvmfPkg/SmbiosPlatformDxe/Qemu.c b/OvmfPkg/SmbiosPlatformDxe/Qemu.c index f7ace4f1de..9466b950fc 100644 --- a/OvmfPkg/SmbiosPlatformDxe/Qemu.c +++ b/OvmfPkg/SmbiosPlatformDxe/Qemu.c @@ -15,6 +15,7 @@ #include "SmbiosPlatformDxe.h" #include #include +#include /** 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) { diff --git a/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf b/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf index 3b90aac438..91815ecd6f 100644 --- a/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf +++ b/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf @@ -53,6 +53,10 @@ HobLib QemuFwCfgLib MemoryAllocationLib + PcdLib + +[Pcd] + gUefiOvmfPkgTokenSpaceGuid.PcdQemuSmbiosValidated [Protocols] gEfiSmbiosProtocolGuid # PROTOCOL ALWAYS_CONSUMED