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 <ard.biesheuvel@linaro.org>
Cc: Wei Huang <wei@redhat.com>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Gabriel L. Somlo <somlo@cmu.edu>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18180 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Laszlo Ersek 2015-08-06 10:14:03 +00:00 committed by lersek
parent f52af4899f
commit 92dc0bb23c
4 changed files with 28 additions and 21 deletions

View File

@ -40,6 +40,15 @@ DetectSmbiosVersion (
QEMU_SMBIOS_ANCHOR QemuAnchor; QEMU_SMBIOS_ANCHOR QemuAnchor;
UINT16 SmbiosVersion; 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 ( if (RETURN_ERROR (QemuFwCfgFindFile (
"etc/smbios/smbios-anchor", &Anchor, &AnchorSize)) || "etc/smbios/smbios-anchor", &Anchor, &AnchorSize)) ||
RETURN_ERROR (QemuFwCfgFindFile ( RETURN_ERROR (QemuFwCfgFindFile (
@ -72,5 +81,10 @@ DetectSmbiosVersion (
SmbiosVersion)); SmbiosVersion));
PcdSet16 (PcdSmbiosVersion, SmbiosVersion); PcdSet16 (PcdSmbiosVersion, SmbiosVersion);
//
// SMBIOS platform drivers can now fetch and install
// "etc/smbios/smbios-tables" from QEMU.
//
PcdSetBool (PcdQemuSmbiosValidated, TRUE);
return RETURN_SUCCESS; return RETURN_SUCCESS;
} }

View File

@ -49,3 +49,4 @@
[Pcd] [Pcd]
gEfiMdeModulePkgTokenSpaceGuid.PcdSmbiosVersion gEfiMdeModulePkgTokenSpaceGuid.PcdSmbiosVersion
gUefiOvmfPkgTokenSpaceGuid.PcdQemuSmbiosValidated

View File

@ -15,6 +15,7 @@
#include "SmbiosPlatformDxe.h" #include "SmbiosPlatformDxe.h"
#include <Library/QemuFwCfgLib.h> #include <Library/QemuFwCfgLib.h>
#include <Library/MemoryAllocationLib.h> #include <Library/MemoryAllocationLib.h>
#include <Library/PcdLib.h>
/** /**
Locates and extracts the QEMU SMBIOS data if present in fw_cfg Locates and extracts the QEMU SMBIOS data if present in fw_cfg
@ -27,32 +28,19 @@ GetQemuSmbiosTables (
VOID VOID
) )
{ {
SMBIOS_TABLE_ENTRY_POINT QemuAnchor; EFI_STATUS Status;
FIRMWARE_CONFIG_ITEM Anchor, Tables; FIRMWARE_CONFIG_ITEM Tables;
UINTN AnchorSize, TablesSize; UINTN TablesSize;
UINT8 *QemuTables; UINT8 *QemuTables;
if (EFI_ERROR (QemuFwCfgFindFile ( if (!PcdGetBool (PcdQemuSmbiosValidated)) {
"etc/smbios/smbios-anchor", &Anchor, &AnchorSize)) ||
EFI_ERROR (QemuFwCfgFindFile (
"etc/smbios/smbios-tables", &Tables, &TablesSize)) ||
AnchorSize != sizeof (QemuAnchor) ||
TablesSize == 0) {
return NULL; return NULL;
} }
// Status = QemuFwCfgFindFile ("etc/smbios/smbios-tables", &Tables,
// We copy the entry point structure to perform some additional checks, &TablesSize);
// but discard it upon return. ASSERT_EFI_ERROR (Status);
// ASSERT (TablesSize > 0);
QemuFwCfgSelectItem (Anchor);
QemuFwCfgReadBytes (AnchorSize, &QemuAnchor);
if (AsciiStrnCmp ((CHAR8 *)QemuAnchor.AnchorString, "_SM_", 4) ||
AsciiStrnCmp ((CHAR8 *)QemuAnchor.IntermediateAnchorString, "_DMI_", 5) ||
TablesSize != QemuAnchor.TableLength) {
return NULL;
}
QemuTables = AllocatePool (TablesSize); QemuTables = AllocatePool (TablesSize);
if (QemuTables == NULL) { if (QemuTables == NULL) {

View File

@ -53,6 +53,10 @@
HobLib HobLib
QemuFwCfgLib QemuFwCfgLib
MemoryAllocationLib MemoryAllocationLib
PcdLib
[Pcd]
gUefiOvmfPkgTokenSpaceGuid.PcdQemuSmbiosValidated
[Protocols] [Protocols]
gEfiSmbiosProtocolGuid # PROTOCOL ALWAYS_CONSUMED gEfiSmbiosProtocolGuid # PROTOCOL ALWAYS_CONSUMED