Message ID | 20190425104326.12835-2-lersek@redhat.com |
---|---|
State | New |
Headers | show |
Series | tests/uefi-test-tools: report the SMBIOS entry point structures | expand |
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é" <philmd@redhat.com> > Cc: Igor Mammedov <imammedo@redhat.com> > Launchpad: https://bugs.launchpad.net/qemu/+bug/1821884 > Signed-off-by: Laszlo Ersek <lersek@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é <philmd@redhat.com>
On Thu, 25 Apr 2019 12:43:25 +0200 Laszlo Ersek <lersek@redhat.com> 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é" <philmd@redhat.com> > Cc: Igor Mammedov <imammedo@redhat.com> > Launchpad: https://bugs.launchpad.net/qemu/+bug/1821884 > Signed-off-by: Laszlo Ersek <lersek@redhat.com> Reviewed-by: Igor Mammedov <imammedo@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(); >
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();
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é" <philmd@redhat.com> Cc: Igor Mammedov <imammedo@redhat.com> Launchpad: https://bugs.launchpad.net/qemu/+bug/1821884 Signed-off-by: Laszlo Ersek <lersek@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(-)