On Tue, May 13, 2014 at 3:13 PM, Gabriel L. Somlo <gso...@gmail.com> 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 (Xen) infrastructure to handle > final SMBIOS table creation. > > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Gabriel Somlo <so...@cmu.edu>
Can you sync this up with the address the patch is being sent from? > --- > OvmfPkg/SmbiosPlatformDxe/Qemu.c | 87 > +++++++++++++++++++++++++ > OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.c | 24 +++++-- > OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.h | 23 +++++++ > OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf | 3 + > 4 files changed, 132 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..f18e2c1 > --- /dev/null > +++ b/OvmfPkg/SmbiosPlatformDxe/Qemu.c > @@ -0,0 +1,87 @@ > +/** @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> > + > +// > +// fw_cfg file names for the SMBIOS entry point and tables > +// > +#define QEMU_ANCHOR "etc/smbios/smbios-anchor" > +#define QEMU_TABLES "etc/smbios/smbios-tables" Should we name these FWCFG_FILENAME_FOO and add them to OvmfPkg/Include/Library/QemuFwCfgLib.h? 'git grep etc OvmfPkg' shows some others that could be moved (separately) too. > + > +/** > + 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 AnchorSz, TablesSz; Sz => Size > + UINT8 *QemuTables; > + > + if (QemuFwCfgFindFile (QEMU_ANCHOR, &Anchor, &AnchorSz) != RETURN_SUCCESS > || EFI_ERROR (QemuFwCfgFindFile (QEMU_ANCHOR, &Anchor, &AnchorSz) > + QemuFwCfgFindFile (QEMU_TABLES, &Tables, &TablesSz) != RETURN_SUCCESS > || > + AnchorSz != sizeof (QemuAnchor) || > + TablesSz == 0) { > + return NULL; > + } > + > + // > + // We copy the entry point structure to perform some additional checks, > + // but discard it upon return. > + // > + QemuFwCfgSelectItem (Anchor); > + QemuFwCfgReadBytes (AnchorSz, &QemuAnchor); > + > + if (AsciiStrnCmp ((CHAR8 *)QemuAnchor.AnchorString, "_SM_", 4) || > + AsciiStrnCmp ((CHAR8 *)QemuAnchor.IntermediateAnchorString, "_DMI_", > 5) || > + TablesSz != QemuAnchor.TableLength) { > + return NULL; > + } > + > + QemuTables = AllocatePool (TablesSz); > + if (QemuTables == NULL) { > + return NULL; > + } > + > + QemuFwCfgSelectItem (Tables); > + QemuFwCfgReadBytes (TablesSz, QemuTables); > + > + return QemuTables; > +} > + > +/** > + Frees the dynamically allocated portion of the extracted QEMU SMBIOS data > + > + @param[in] QemuTables Address of QEMU SMBIOS data from > GetQemuSmbiosTables() > + > + It is the caller's responsibility to ensure QemuTables was allocated and > + returned from GetQemuSmbiosTables(). > + > + **/ > +VOID > +FreeQemuSmbiosTables ( > + IN UINT8 *QemuTables > + ) > +{ > + FreePool (QemuTables); > +} I don't think we need this function. -Jordan > diff --git a/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.c > b/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.c > index ac48fb7..9d3f515 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) { > + FreeQemuSmbiosTables (SmbiosTables); > + } > } > > return Status; > diff --git a/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.h > b/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.h > index bf99e43..8d37355 100644 > --- a/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.h > +++ b/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.h > @@ -40,6 +40,29 @@ GetXenSmbiosTables ( > > > /** > + Locates and extracts the QEMU SMBIOS table data if present in fw_cfg > + > + @return Address of extracted QEMU SMBIOS data > + > +**/ > +UINT8 * > +GetQemuSmbiosTables ( > + VOID > + ); > + > +/** > + Frees the dynamically allocated portion of the extracted QEMU SMBIOS data > + > + @param[in] QemuTables Address of QEMU SMBIOS data from > GetQemuSmbiosTables() > + > +**/ > +VOID > +FreeQemuSmbiosTables ( > + IN UINT8 *QemuTables > + ); > + > + > +/** > 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