Generated mechanically with:
find OvmfPkg -type f -exec sed -i -e 's/EFI_D_/DEBUG_/g' {} \;
Signed-off-by: Rebecca Cran <rebecca@bsdio.com>
Cc: Philippe Mathieu-Daude <philmd@redhat.com>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Ard Biesheuvel <ard.biesheuvel@arm.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Message-Id: <20200429215327.606467-1-rebecca@bsdio.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
		
	
		
			
				
	
	
		
			106 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			3.1 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>
 | 
						|
 | 
						|
  SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#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;
 | 
						|
  SMBIOS_TABLE_3_0_ENTRY_POINT V3;
 | 
						|
} QEMU_SMBIOS_ANCHOR;
 | 
						|
 | 
						|
RETURN_STATUS
 | 
						|
EFIAPI
 | 
						|
DetectSmbiosVersion (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
  FIRMWARE_CONFIG_ITEM Anchor, Tables;
 | 
						|
  UINTN                AnchorSize, TablesSize;
 | 
						|
  QEMU_SMBIOS_ANCHOR   QemuAnchor;
 | 
						|
  UINT16               SmbiosVersion;
 | 
						|
  RETURN_STATUS        PcdStatus;
 | 
						|
 | 
						|
  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 (
 | 
						|
                      "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;
 | 
						|
 | 
						|
  case sizeof QemuAnchor.V3:
 | 
						|
    QemuFwCfgReadBytes (AnchorSize, &QemuAnchor);
 | 
						|
 | 
						|
    if (QemuAnchor.V3.MajorVersion != 3 ||
 | 
						|
        QemuAnchor.V3.TableMaximumSize != TablesSize ||
 | 
						|
        CompareMem (QemuAnchor.V3.AnchorString, "_SM3_", 5) != 0) {
 | 
						|
      return RETURN_SUCCESS;
 | 
						|
    }
 | 
						|
    SmbiosVersion = (UINT16)(QemuAnchor.V3.MajorVersion << 8 |
 | 
						|
                             QemuAnchor.V3.MinorVersion);
 | 
						|
 | 
						|
    DEBUG ((DEBUG_INFO, "%a: SMBIOS 3.x DocRev from QEMU: 0x%02x\n",
 | 
						|
      __FUNCTION__, QemuAnchor.V3.DocRev));
 | 
						|
    PcdStatus = PcdSet8S (PcdSmbiosDocRev, QemuAnchor.V3.DocRev);
 | 
						|
    ASSERT_RETURN_ERROR (PcdStatus);
 | 
						|
    break;
 | 
						|
 | 
						|
  default:
 | 
						|
    return RETURN_SUCCESS;
 | 
						|
  }
 | 
						|
 | 
						|
  DEBUG ((DEBUG_INFO, "%a: SMBIOS version from QEMU: 0x%04x\n", __FUNCTION__,
 | 
						|
    SmbiosVersion));
 | 
						|
  PcdStatus = PcdSet16S (PcdSmbiosVersion, SmbiosVersion);
 | 
						|
  ASSERT_RETURN_ERROR (PcdStatus);
 | 
						|
 | 
						|
  //
 | 
						|
  // SMBIOS platform drivers can now fetch and install
 | 
						|
  // "etc/smbios/smbios-tables" from QEMU.
 | 
						|
  //
 | 
						|
  PcdStatus = PcdSetBoolS (PcdQemuSmbiosValidated, TRUE);
 | 
						|
  ASSERT_RETURN_ERROR (PcdStatus);
 | 
						|
  return RETURN_SUCCESS;
 | 
						|
}
 |