smbios: error handling for invalid addresses

SMBIOS tables only support 32bit addresses. If we don't have memory here
handle the error gracefully:

* on x86_64 fail to start U-Boot
* during UEFI booting ignore the missing table

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Reviewed-by: Simon Glass <sjg@chromium.org>
diff --git a/lib/efi_loader/efi_smbios.c b/lib/efi_loader/efi_smbios.c
index 719d3e8..2eb4cb1 100644
--- a/lib/efi_loader/efi_smbios.c
+++ b/lib/efi_loader/efi_smbios.c
@@ -5,6 +5,8 @@
  *  Copyright (c) 2016 Alexander Graf
  */
 
+#define LOG_CATEGORY LOGC_EFI
+
 #include <common.h>
 #include <efi_loader.h>
 #include <log.h>
@@ -43,14 +45,13 @@
 	 * Generate SMBIOS tables - we know that efi_allocate_pages() returns
 	 * a 4k-aligned address, so it is safe to assume that
 	 * write_smbios_table() will write the table at that address.
-	 *
-	 * Note that on sandbox, efi_allocate_pages() unfortunately returns a
-	 * pointer even though it uses a uint64_t type. Convert it.
 	 */
 	assert(!(dmi_addr & 0xf));
 	dmi = (void *)(uintptr_t)dmi_addr;
-	write_smbios_table(map_to_sysmem(dmi));
-
-	/* And expose them to our EFI payload */
-	return efi_install_configuration_table(&smbios_guid, dmi);
+	if (write_smbios_table(map_to_sysmem(dmi)))
+		/* Install SMBIOS information as configuration table */
+		return efi_install_configuration_table(&smbios_guid, dmi);
+	efi_free_pages(dmi_addr, 1);
+	log_err("Cannot create SMBIOS table\n");
+	return EFI_SUCCESS;
 }