[PATCH 4/5] efi: Use the correct GUID for the SMBIOS table

Heinrich Schuchardt xypron.glpk at gmx.de
Mon Oct 9 03:47:26 CEST 2023


On 10/8/23 23:36, Simon Glass wrote:
> EFI does not use the 'anchor string' to determine the SMBIOS table
> version, instead preferring to have two separate GUIDs. Use the correct
> one, depending on the table version.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
>
>   include/efi_api.h           |  4 ++++
>   lib/efi_loader/efi_smbios.c | 12 ++++++++++--
>   2 files changed, 14 insertions(+), 2 deletions(-)
>
> diff --git a/include/efi_api.h b/include/efi_api.h
> index 8f5ef5f680f3..1abac2ed7563 100644
> --- a/include/efi_api.h
> +++ b/include/efi_api.h
> @@ -430,6 +430,10 @@ struct efi_runtime_services {
>   	EFI_GUID(0xeb9d2d31, 0x2d88, 0x11d3,  \
>   		 0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
>
> +#define SMBIOS3_TABLE_GUID \
> +	EFI_GUID(0xf2fd1544, 0x9794, 0x4a2c, \
> +		 0x99, 0x2e, 0xe5, 0xbb, 0xcf, 0x20, 0xe3, 0x94)
> +
>   #define EFI_LOAD_FILE_PROTOCOL_GUID \
>   	EFI_GUID(0x56ec3091, 0x954c, 0x11d2, \
>   		 0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
> diff --git a/lib/efi_loader/efi_smbios.c b/lib/efi_loader/efi_smbios.c
> index 48446f654d9b..9ef736853d10 100644
> --- a/lib/efi_loader/efi_smbios.c
> +++ b/lib/efi_loader/efi_smbios.c
> @@ -15,6 +15,8 @@
>   #include <smbios.h>
>   #include <linux/sizes.h>
>
> +const efi_guid_t smbios3_guid = SMBIOS3_TABLE_GUID;
> +
>   enum {
>   	TABLE_SIZE	= SZ_4K,
>   };
> @@ -26,8 +28,10 @@ enum {
>    */
>   efi_status_t efi_smbios_register(void)
>   {
> +	const efi_guid_t *guid;
>   	ulong addr;
>   	efi_status_t ret;
> +	void *buf;
>
>   	addr = gd->arch.smbios_start;

Why did you define the macro gd_smbios_start() if it does not point to
the correct field and you don't use it? See
50834884a815 ("Record the position of the SMBIOS tables")

>   	if (!addr) {
> @@ -43,8 +47,12 @@ efi_status_t efi_smbios_register(void)
>   	log_debug("EFI using SMBIOS tables at %lx\n", addr);
>
>   	/* Install SMBIOS information as configuration table */
> -	return efi_install_configuration_table(&smbios_guid,
> -					       map_sysmem(addr, 0));
> +	buf = map_sysmem(addr, 10);

Where does this arbitrary value of 10 come from?

The second parameter can safely be set to 0 as the SMBIOS table is not
in PCIe mapped memory on the sandbox.

> +	guid = !memcmp(buf, "_SM_", 4) ? &smbios_guid : &smbios3_guid;
> +	ret = efi_install_configuration_table(guid, buf);
> +	unmap_sysmem(buf);

Even on the sandbox this is a NOP as this is not a PCIe address.

Best regards

Heinrich

> +
> +	return ret;
>   }
>
>   static int install_smbios_table(void)



More information about the U-Boot mailing list