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