diff options
author | Laszlo Ersek <lersek@redhat.com> | 2015-08-06 10:14:03 +0000 |
---|---|---|
committer | lersek <lersek@Edk2> | 2015-08-06 10:14:03 +0000 |
commit | 92dc0bb23c4b8e847484cfded8dcc5146b5f5d3e (patch) | |
tree | ea0488215ac352ec4e434dbce8a68d8eba6cff1a | |
parent | f52af4899fcbd3238f7b720d3f2ef68a3dbd202b (diff) | |
download | edk2-92dc0bb23c4b8e847484cfded8dcc5146b5f5d3e.tar.gz edk2-92dc0bb23c4b8e847484cfded8dcc5146b5f5d3e.tar.bz2 edk2-92dc0bb23c4b8e847484cfded8dcc5146b5f5d3e.zip |
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
-rw-r--r-- | OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.c | 14 | ||||
-rw-r--r-- | OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.inf | 1 | ||||
-rw-r--r-- | OvmfPkg/SmbiosPlatformDxe/Qemu.c | 30 | ||||
-rw-r--r-- | OvmfPkg/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 <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) {
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
|