On Thu, May 15, 2014 at 8:14 AM, Gabriel L. Somlo <so...@cmu.edu> wrote:
> Locate QEMU SMBIOS data in fw_cfg and install it via the
> SMBIOS protocol.
>
> Starting with qemu-2.1, on pc/x86 machines of type >= 2.1, full
> SMBIOS tables are generated and inserted into fw_cfg (i.e., no
> per-field patching of locally generated structures is required).
>
> Aside from new code to extract a SMBIOS blob from fw_cfg, this
> patch utilizes the pre-existing infrastructure (already used by
> Xen) to handle final SMBIOS table creation.
>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Gabriel Somlo <so...@cmu.edu>
> Reviewed-by: Laszlo Ersek <ler...@redhat.com>
> ---
>  OvmfPkg/SmbiosPlatformDxe/Qemu.c                | 66 
> +++++++++++++++++++++++++
>  OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.c   | 24 +++++++--
>  OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.h   | 13 +++++
>  OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf |  3 ++
>  4 files changed, 101 insertions(+), 5 deletions(-)
>  create mode 100644 OvmfPkg/SmbiosPlatformDxe/Qemu.c
>
> diff --git a/OvmfPkg/SmbiosPlatformDxe/Qemu.c 
> b/OvmfPkg/SmbiosPlatformDxe/Qemu.c
> new file mode 100644
> index 0000000..f7ace4f
> --- /dev/null
> +++ b/OvmfPkg/SmbiosPlatformDxe/Qemu.c
> @@ -0,0 +1,66 @@
> +/** @file
> +  Find and extract QEMU SMBIOS data from fw_cfg.
> +
> +  Copyright (C) 2014, Gabriel L. Somlo <so...@cmu.edu>
> +
> +  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 "SmbiosPlatformDxe.h"
> +#include <Library/QemuFwCfgLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +
> +/**
> +  Locates and extracts the QEMU SMBIOS data if present in fw_cfg
> +
> +  @return                 Address of extracted QEMU SMBIOS data
> +
> +**/
> +UINT8 *
> +GetQemuSmbiosTables (
> +  VOID
> +  )
> +{
> +  SMBIOS_TABLE_ENTRY_POINT QemuAnchor;
> +  FIRMWARE_CONFIG_ITEM     Anchor, Tables;
> +  UINTN                    AnchorSize, TablesSize;
> +  UINT8                    *QemuTables;
> +
> +  if (EFI_ERROR (QemuFwCfgFindFile (
> +                   "etc/smbios/smbios-anchor", &Anchor, &AnchorSize)) ||
> +      EFI_ERROR (QemuFwCfgFindFile (
> +                   "etc/smbios/smbios-tables", &Tables, &TablesSize)) ||

I still had the question from v1 of whether we should document the
known fw-cfg filenames with #defines in
OvmfPkg/Include/Library/QemuFwCfgLib.h.

But, series Reviewed-by: Jordan Justen <jordan.l.jus...@intel.com>

> +      AnchorSize != sizeof (QemuAnchor) ||
> +      TablesSize == 0) {
> +    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;
> +  }
> +
> +  QemuTables = AllocatePool (TablesSize);
> +  if (QemuTables == NULL) {
> +    return NULL;
> +  }
> +
> +  QemuFwCfgSelectItem (Tables);
> +  QemuFwCfgReadBytes (TablesSize, QemuTables);
> +
> +  return QemuTables;
> +}
> diff --git a/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.c 
> b/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.c
> index ac48fb7..626f7db 100644
> --- a/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.c
> +++ b/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.c
> @@ -84,20 +84,20 @@ SmbiosTableLength (
>    Install all structures from the given SMBIOS structures block
>
>    @param  Smbios               SMBIOS protocol
> -  @param  EntryPointStructure  SMBIOS entry point structures block
> +  @param  TableAddress         SMBIOS tables starting address
>
>  **/
>  EFI_STATUS
>  InstallAllStructures (
>    IN EFI_SMBIOS_PROTOCOL       *Smbios,
> -  IN SMBIOS_TABLE_ENTRY_POINT  *EntryPointStructure
> +  IN UINT8                     *TableAddress
>    )
>  {
>    EFI_STATUS                Status;
>    SMBIOS_STRUCTURE_POINTER  SmbiosTable;
>    EFI_SMBIOS_HANDLE         SmbiosHandle;
>
> -  SmbiosTable.Raw = (UINT8*)(UINTN) EntryPointStructure->TableAddress;
> +  SmbiosTable.Raw = TableAddress;
>    if (SmbiosTable.Raw == NULL) {
>      return EFI_INVALID_PARAMETER;
>    }
> @@ -145,6 +145,7 @@ SmbiosTablePublishEntry (
>    EFI_STATUS                Status;
>    EFI_SMBIOS_PROTOCOL       *Smbios;
>    SMBIOS_TABLE_ENTRY_POINT  *EntryPointStructure;
> +  UINT8                     *SmbiosTables;
>
>    //
>    // Find the SMBIOS protocol
> @@ -159,11 +160,24 @@ SmbiosTablePublishEntry (
>    }
>
>    //
> -  // Add Xen SMBIOS data if found
> +  // Add Xen or QEMU SMBIOS data if found
>    //
>    EntryPointStructure = GetXenSmbiosTables ();
>    if (EntryPointStructure != NULL) {
> -    Status = InstallAllStructures (Smbios, EntryPointStructure);
> +    SmbiosTables = (UINT8*)(UINTN)EntryPointStructure->TableAddress;
> +  } else {
> +    SmbiosTables = GetQemuSmbiosTables ();
> +  }
> +
> +  if (SmbiosTables != NULL) {
> +    Status = InstallAllStructures (Smbios, SmbiosTables);
> +
> +    //
> +    // Free SmbiosTables if allocated by Qemu (i.e., NOT by Xen):
> +    //
> +    if (EntryPointStructure == NULL) {
> +      FreePool (SmbiosTables);
> +    }
>    }
>
>    return Status;
> diff --git a/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.h 
> b/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.h
> index bf99e43..e2606e1 100644
> --- a/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.h
> +++ b/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.h
> @@ -25,6 +25,7 @@
>  #include <Library/BaseLib.h>
>  #include <Library/BaseMemoryLib.h>
>  #include <Library/UefiBootServicesTableLib.h>
> +#include <Library/MemoryAllocationLib.h>
>
>
>  /**
> @@ -40,6 +41,18 @@ GetXenSmbiosTables (
>
>
>  /**
> +  Locates and extracts the QEMU SMBIOS table data if present in fw_cfg
> +
> +  @return             Address of extracted QEMU SMBIOS data
> +
> +**/
> +UINT8 *
> +GetQemuSmbiosTables (
> +  VOID
> +  );
> +
> +
> +/**
>    Validates the SMBIOS entry point structure
>
>    @param  EntryPointStructure  SMBIOS entry point structure
> diff --git a/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf 
> b/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf
> index 7058284..6596392 100644
> --- a/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf
> +++ b/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf
> @@ -32,6 +32,7 @@
>    SmbiosPlatformDxe.h
>    SmbiosPlatformDxe.c
>    Xen.c
> +  Qemu.c
>
>  [Packages]
>    MdePkg/MdePkg.dec
> @@ -45,6 +46,8 @@
>    UefiDriverEntryPoint
>    DebugLib
>    HobLib
> +  QemuFwCfgLib
> +  MemoryAllocationLib
>
>  [Protocols]
>    gEfiSmbiosProtocolGuid                      # PROTOCOL ALWAYS_CONSUMED
> --
> 1.9.0
>

------------------------------------------------------------------------------
"Accelerate Dev Cycles with Automated Cross-Browser Testing - For FREE
Instantly run your Selenium tests across 300+ browser/OS combos.
Get unparalleled scalability from the best Selenium testing platform available
Simple to use. Nothing to install. Get started now for free."
http://p.sf.net/sfu/SauceLabs
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to