On 4/25/19 12:43 PM, Laszlo Ersek wrote: > On UEFI systems, the SMBIOS entry point (a.k.a. anchor) structures are > found similarly to the ACPI RSD PTR table(s): by scanning the > ConfigurationTable array in the EFI system table for well-known GUIDs. > > Locate the SMBIOS 2.1 (32-bit) and 3.0 (64-bit) anchors in the > BiosTablesTest UEFI application, and report the addresses in new fields > appended to the BIOS_TABLES_TEST structure. > > Cc: "Philippe Mathieu-Daudé" <phi...@redhat.com> > Cc: Igor Mammedov <imamm...@redhat.com> > Launchpad: https://bugs.launchpad.net/qemu/+bug/1821884 > Signed-off-by: Laszlo Ersek <ler...@redhat.com> > --- > tests/uefi-test-tools/UefiTestToolsPkg/Include/Guid/BiosTablesTest.h | > 25 +++++++++++++++----- > tests/uefi-test-tools/UefiTestToolsPkg/BiosTablesTest/BiosTablesTest.inf | > 2 ++ > tests/uefi-test-tools/UefiTestToolsPkg/BiosTablesTest/BiosTablesTest.c | > 23 ++++++++++++++---- > 3 files changed, 40 insertions(+), 10 deletions(-) > > diff --git > a/tests/uefi-test-tools/UefiTestToolsPkg/Include/Guid/BiosTablesTest.h > b/tests/uefi-test-tools/UefiTestToolsPkg/Include/Guid/BiosTablesTest.h > index 0b72c61254af..7a74c121d596 100644 > --- a/tests/uefi-test-tools/UefiTestToolsPkg/Include/Guid/BiosTablesTest.h > +++ b/tests/uefi-test-tools/UefiTestToolsPkg/Include/Guid/BiosTablesTest.h > @@ -1,13 +1,14 @@ > /** @file > - Expose the address(es) of the ACPI RSD PTR table(s) in a MB-aligned > structure > - to the hypervisor. > + Expose the address(es) of the ACPI RSD PTR table(s) and the SMBIOS entry > + point(s) in a MB-aligned structure to the hypervisor. > > The hypervisor locates the MB-aligned structure based on the signature GUID > - that is at offset 0 in the structure. Once the RSD PTR address(es) are > - retrieved, the hypervisor may perform various ACPI checks. > + that is at offset 0 in the structure. Once the RSD PTR and SMBIOS anchor > + address(es) are retrieved, the hypervisor may perform various ACPI and > SMBIOS > + checks. > > - This feature is a development aid, for supporting ACPI table unit tests in > - hypervisors. Do not enable in production builds. > + This feature is a development aid, for supporting ACPI and SMBIOS table > unit > + tests in hypervisors. Do not enable in production builds. > > Copyright (C) 2019, Red Hat, Inc. > > @@ -61,6 +62,18 @@ typedef struct { > // > EFI_PHYSICAL_ADDRESS Rsdp10; > EFI_PHYSICAL_ADDRESS Rsdp20; > + // > + // The Smbios21 and Smbios30 fields may be read when the signature GUID > + // matches. Smbios21 is the guest-physical address of the SMBIOS 2.1 > (32-bit) > + // Entry Point Structure from the SMBIOS v3.2.0 specification, in 8-byte > + // little endian representation. Smbios30 is the guest-physical address of > + // the SMBIOS 3.0 (64-bit) Entry Point Structure from the same > specification, > + // in the same representation. Each of these fields may be zero > + // (independently of the other) if the UEFI System Table does not provide > the > + // corresponding UEFI Configuration Table. > + // > + EFI_PHYSICAL_ADDRESS Smbios21; > + EFI_PHYSICAL_ADDRESS Smbios30; > } BIOS_TABLES_TEST; > #pragma pack () > > diff --git > a/tests/uefi-test-tools/UefiTestToolsPkg/BiosTablesTest/BiosTablesTest.inf > b/tests/uefi-test-tools/UefiTestToolsPkg/BiosTablesTest/BiosTablesTest.inf > index 924d8a80d00b..708bc1e7982b 100644 > --- a/tests/uefi-test-tools/UefiTestToolsPkg/BiosTablesTest/BiosTablesTest.inf > +++ b/tests/uefi-test-tools/UefiTestToolsPkg/BiosTablesTest/BiosTablesTest.inf > @@ -35,6 +35,8 @@ > gBiosTablesTestGuid > gEfiAcpi10TableGuid > gEfiAcpi20TableGuid > + gEfiSmbios3TableGuid > + gEfiSmbiosTableGuid > > [Packages] > MdePkg/MdePkg.dec > diff --git > a/tests/uefi-test-tools/UefiTestToolsPkg/BiosTablesTest/BiosTablesTest.c > b/tests/uefi-test-tools/UefiTestToolsPkg/BiosTablesTest/BiosTablesTest.c > index b208e17fb00f..75891e68ec20 100644 > --- a/tests/uefi-test-tools/UefiTestToolsPkg/BiosTablesTest/BiosTablesTest.c > +++ b/tests/uefi-test-tools/UefiTestToolsPkg/BiosTablesTest/BiosTablesTest.c > @@ -14,6 +14,7 @@ > > #include <Guid/Acpi.h> > #include <Guid/BiosTablesTest.h> > +#include <Guid/SmBios.h> > #include <Library/BaseLib.h> > #include <Library/BaseMemoryLib.h> > #include <Library/MemoryAllocationLib.h> > @@ -55,6 +56,8 @@ BiosTablesTestMain ( > volatile BIOS_TABLES_TEST *BiosTablesTest; > CONST VOID *Rsdp10; > CONST VOID *Rsdp20; > + CONST VOID *Smbios21; > + CONST VOID *Smbios30; > CONST EFI_CONFIGURATION_TABLE *ConfigTable; > CONST EFI_CONFIGURATION_TABLE *ConfigTablesEnd; > volatile EFI_GUID *InverseSignature; > @@ -77,31 +80,43 @@ BiosTablesTestMain ( > } > > // > - // Locate both gEfiAcpi10TableGuid and gEfiAcpi20TableGuid config tables in > - // one go. > + // Locate all the gEfiAcpi10TableGuid, gEfiAcpi20TableGuid, > + // gEfiSmbiosTableGuid, gEfiSmbios3TableGuid config tables in one go. > // > Rsdp10 = NULL; > Rsdp20 = NULL; > + Smbios21 = NULL; > + Smbios30 = NULL; > ConfigTable = gST->ConfigurationTable; > ConfigTablesEnd = gST->ConfigurationTable + gST->NumberOfTableEntries; > - while ((Rsdp10 == NULL || Rsdp20 == NULL) && ConfigTable < > ConfigTablesEnd) { > + while ((Rsdp10 == NULL || Rsdp20 == NULL || > + Smbios21 == NULL || Smbios30 == NULL) && > + ConfigTable < ConfigTablesEnd) { > if (CompareGuid (&ConfigTable->VendorGuid, &gEfiAcpi10TableGuid)) { > Rsdp10 = ConfigTable->VendorTable; > } else if (CompareGuid (&ConfigTable->VendorGuid, &gEfiAcpi20TableGuid)) > { > Rsdp20 = ConfigTable->VendorTable; > + } else if (CompareGuid (&ConfigTable->VendorGuid, &gEfiSmbiosTableGuid)) > { > + Smbios21 = ConfigTable->VendorTable; > + } else if (CompareGuid (&ConfigTable->VendorGuid, > &gEfiSmbios3TableGuid)) { > + Smbios30 = ConfigTable->VendorTable; > } > ++ConfigTable; > } > > AsciiPrint ("%a: BiosTablesTest=%p Rsdp10=%p Rsdp20=%p\n", > gEfiCallerBaseName, Pages, Rsdp10, Rsdp20); > + AsciiPrint ("%a: Smbios21=%p Smbios30=%p\n", gEfiCallerBaseName, Smbios21, > + Smbios30); > > // > - // Store the RSD PTR address(es) first, then the signature second. > + // Store the config table addresses first, then the signature second. > // > BiosTablesTest = Pages; > BiosTablesTest->Rsdp10 = (UINTN)Rsdp10; > BiosTablesTest->Rsdp20 = (UINTN)Rsdp20; > + BiosTablesTest->Smbios21 = (UINTN)Smbios21; > + BiosTablesTest->Smbios30 = (UINTN)Smbios30; > > MemoryFence(); > >
Reviewed-by: Philippe Mathieu-Daudé <phi...@redhat.com>