From 92dc0bb23c4b8e847484cfded8dcc5146b5f5d3e Mon Sep 17 00:00:00 2001 From: Laszlo Ersek Date: Thu, 6 Aug 2015 10:14:03 +0000 Subject: [PATCH] OvmfPkg: SmbiosPlatformDxe: eliminate duplicate entry point validation 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 Cc: Wei Huang Cc: Jordan Justen Cc: Gabriel L. Somlo Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Laszlo Ersek Reviewed-by: Jordan Justen git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18180 6f19259b-4bc3-4df7-8a09-765794883524 --- .../SmbiosVersionLib/DetectSmbiosVersionLib.c | 14 +++++++++ .../DetectSmbiosVersionLib.inf | 1 + OvmfPkg/SmbiosPlatformDxe/Qemu.c | 30 ++++++------------- .../SmbiosPlatformDxe/SmbiosPlatformDxe.inf | 4 +++ 4 files changed, 28 insertions(+), 21 deletions(-) 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