mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-11-04 13:35:48 +01:00 
			
		
		
		
	__FUNCTION__ is a pre-standard extension that gcc and Visual C++ among others support, while __func__ was standardized in C99. Since it's more standard, replace __FUNCTION__ with __func__ throughout OvmfPkg. Signed-off-by: Rebecca Cran <rebecca@bsdio.com> Reviewed-by: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Ard Biesheuvel <ardb@kernel.org> Reviewed-by: Sunil V L <sunilvl@ventanamicro.com>
		
			
				
	
	
		
			129 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			3.4 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",
 | 
						|
        __func__,
 | 
						|
        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",
 | 
						|
    __func__,
 | 
						|
    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;
 | 
						|
}
 |