diff mbox series

[v2,5/6] efi: Use the correct GUID for the SMBIOS table

Message ID 20231015024511.3995580-6-sjg@chromium.org
State Superseded
Delegated to: Bin Meng
Headers show
Series smbios: Deal with tables beyond 4GB | expand

Commit Message

Simon Glass Oct. 15, 2023, 2:45 a.m. UTC
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.

Call unmap_system() to balance to the use of map_sysmem()

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2:
- Add a note about why unmap_system() is called

 include/efi_api.h           |  4 ++++
 lib/efi_loader/efi_smbios.c | 12 ++++++++++--
 2 files changed, 14 insertions(+), 2 deletions(-)

Comments

Heinrich Schuchardt Dec. 26, 2023, 12:38 p.m. UTC | #1
On 10/15/23 04:45, 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.
>
> Call unmap_system() to balance to the use of map_sysmem()
>
> Signed-off-by: Simon Glass <sjg@chromium.org>

Reviewed-by: Heinrich Schuchardt <xypron.glpk@gmx.de>

> ---
>
> Changes in v2:
> - Add a note about why unmap_system() is called
>
>   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 4ae4e4a7c236..80f38d78d877 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_smbios_start();
>   	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, 0);
> +	guid = !memcmp(buf, "_SM_", 4) ? &smbios_guid : &smbios3_guid;
> +	ret = efi_install_configuration_table(guid, buf);
> +	unmap_sysmem(buf);
> +
> +	return ret;
>   }
>
>   static int install_smbios_table(void)
diff mbox series

Patch

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 4ae4e4a7c236..80f38d78d877 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_smbios_start();
 	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, 0);
+	guid = !memcmp(buf, "_SM_", 4) ? &smbios_guid : &smbios3_guid;
+	ret = efi_install_configuration_table(guid, buf);
+	unmap_sysmem(buf);
+
+	return ret;
 }
 
 static int install_smbios_table(void)