system76-edk2/OvmfPkg/Library/SmbiosVersionLib/DetectSmbiosVersionLib.c
Laszlo Ersek b265ed9284 OvmfPkg: SmbiosVersionLib: add "plugin" for detecting SMBIOS version
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.biesheuvel@linaro.org>
Cc: Wei Huang <wei@redhat.com>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Gabriel L. Somlo <somlo@cmu.edu>
Suggested-by: Jordan Justen <jordan.l.justen@intel.com>
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@18174 6f19259b-4bc3-4df7-8a09-765794883524
2015-08-06 10:13:37 +00:00

77 lines
2.3 KiB
C

/** @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;
}