Introduce a minimal library instance for fetching and validating the SMBIOS entry point structure exposed by QEMU over fw_cfg. This library is meant to be hooked into MdeModulePkg/Universal/SmbiosDxe by platform DSC files, so that the library can set the PCD(s) that SmbiosDxe consumes at the right moment.
At the moment only SMBIOS 2.x entry points are recognized. 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> Suggested-by: Jordan Justen <jordan.l.jus...@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Laszlo Ersek <ler...@redhat.com> --- OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.inf | 51 +++++++++++++ OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.c | 76 ++++++++++++++++++++ 2 files changed, 127 insertions(+) diff --git a/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.inf b/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.inf new file mode 100644 index 0000000..14c25c9 --- /dev/null +++ b/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.inf @@ -0,0 +1,51 @@ +## @file +# +# A hook-in library for MdeModulePkg/Universal/SmbiosDxe, in order to set +# gEfiMdeModulePkgTokenSpaceGuid.PcdSmbiosVersion (and possibly other PCDs) +# just before SmbiosDxe consumes them. +# +# Copyright (C) 2013, 2015, Red Hat, Inc. +# Copyright (c) 2008 - 2012, Intel Corporation. All rights reserved.<BR> +# +# This program and the accompanying materials are licensed and made available +# under the terms and conditions of the BSD License which accompanies this +# distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT +# WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = DetectSmbiosVersionLib + FILE_GUID = 6c633bb2-ae33-49ae-9f89-b5aa999fe3ae + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = SmbiosVersionLib|DXE_DRIVER + CONSTRUCTOR = DetectSmbiosVersion + +# +# The following information is for reference only and not required by the build +# tools. +# +# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 +# + +[Sources] + DetectSmbiosVersionLib.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + OvmfPkg/OvmfPkg.dec + +[LibraryClasses] + BaseMemoryLib + DebugLib + PcdLib + QemuFwCfgLib + +[Pcd] + gEfiMdeModulePkgTokenSpaceGuid.PcdSmbiosVersion diff --git a/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.c b/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.c new file mode 100644 index 0000000..0efe020 --- /dev/null +++ b/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.c @@ -0,0 +1,76 @@ +/** @file + + A hook-in library for MdeModulePkg/Universal/SmbiosDxe, in order to set + gEfiMdeModulePkgTokenSpaceGuid.PcdSmbiosVersion (and possibly other PCDs) + just before SmbiosDxe consumes them. + + Copyright (C) 2013, 2015, Red Hat, Inc. + Copyright (c) 2008 - 2012, Intel Corporation. All rights reserved.<BR> + + This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License which accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT + WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#include <IndustryStandard/SmBios.h> + +#include <Base.h> +#include <Library/BaseMemoryLib.h> +#include <Library/DebugLib.h> +#include <Library/PcdLib.h> +#include <Library/QemuFwCfgLib.h> + +typedef union { + SMBIOS_TABLE_ENTRY_POINT V2; +} QEMU_SMBIOS_ANCHOR; + +RETURN_STATUS +EFIAPI +DetectSmbiosVersion ( + VOID + ) +{ + FIRMWARE_CONFIG_ITEM Anchor, Tables; + UINTN AnchorSize, TablesSize; + QEMU_SMBIOS_ANCHOR QemuAnchor; + UINT16 SmbiosVersion; + + if (RETURN_ERROR (QemuFwCfgFindFile ( + "etc/smbios/smbios-anchor", &Anchor, &AnchorSize)) || + RETURN_ERROR (QemuFwCfgFindFile ( + "etc/smbios/smbios-tables", &Tables, &TablesSize)) || + TablesSize == 0) { + return RETURN_SUCCESS; + } + + QemuFwCfgSelectItem (Anchor); + + switch (AnchorSize) { + case sizeof QemuAnchor.V2: + QemuFwCfgReadBytes (AnchorSize, &QemuAnchor); + + if (QemuAnchor.V2.MajorVersion != 2 || + QemuAnchor.V2.TableLength != TablesSize || + CompareMem (QemuAnchor.V2.AnchorString, "_SM_", 4) != 0 || + CompareMem (QemuAnchor.V2.IntermediateAnchorString, "_DMI_", 5) != 0) { + return RETURN_SUCCESS; + } + SmbiosVersion = (UINT16)(QemuAnchor.V2.MajorVersion << 8 | + QemuAnchor.V2.MinorVersion); + break; + + default: + return RETURN_SUCCESS; + } + + DEBUG ((EFI_D_INFO, "%a: SMBIOS version from QEMU: 0x%04x\n", __FUNCTION__, + SmbiosVersion)); + PcdSet16 (PcdSmbiosVersion, SmbiosVersion); + + return RETURN_SUCCESS; +} -- 1.8.3.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel