if (!memcmp(bootefi_device_path[0].str, "N\0e\0t", 6))
                loaded_image_info.device_handle = nethandle;
 #endif
+#ifdef CONFIG_GENERATE_SMBIOS_TABLE
+       efi_smbios_register();
+#endif
 
        /* Initialize EFI runtime services */
        efi_reset_system_init();
 
        EFI_GUID(0xb1b621d5, 0xf19c, 0x41a5, \
                 0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0)
 
+#define SMBIOS_TABLE_GUID \
+       EFI_GUID(0xeb9d2d31, 0x2d88, 0x11d3,  \
+                0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
+
 struct efi_configuration_table
 {
        efi_guid_t guid;
 
 int efi_gop_register(void);
 /* Called by bootefi to make the network interface available */
 int efi_net_register(void **handle);
+/* Called by bootefi to make SMBIOS tables available */
+void efi_smbios_register(void);
 
 /* Called by networking code to memorize the dhcp ack package */
 void efi_net_set_dhcp_ack(void *pkt, int len);
 
 #define BIOS_CHARACTERISTICS_SELECTABLE_BOOT   (1 << 16)
 
 #define BIOS_CHARACTERISTICS_EXT1_ACPI         (1 << 0)
+#define BIOS_CHARACTERISTICS_EXT1_UEFI         (1 << 3)
 #define BIOS_CHARACTERISTICS_EXT2_TARGET       (1 << 2)
 
 struct __packed smbios_type0 {
 
          variable.
 
 menu "System tables"
-       depends on !EFI && !SYS_COREBOOT
+       depends on (!EFI && !SYS_COREBOOT) || (ARM && EFI_LOADER)
 
 config GENERATE_SMBIOS_TABLE
        bool "Generate an SMBIOS (System Management BIOS) table"
        default y
-       depends on X86
+       depends on X86 || EFI_LOADER
        help
          The System Management BIOS (SMBIOS) specification addresses how
          motherboard and system vendors present management information about
 
 obj-$(CONFIG_LCD) += efi_gop.o
 obj-$(CONFIG_PARTITIONS) += efi_disk.o
 obj-$(CONFIG_NET) += efi_net.o
+obj-$(CONFIG_GENERATE_SMBIOS_TABLE) += efi_smbios.o
 
--- /dev/null
+/*
+ *  EFI application tables support
+ *
+ *  Copyright (c) 2016 Alexander Graf
+ *
+ *  SPDX-License-Identifier:     GPL-2.0+
+ */
+
+#include <common.h>
+#include <efi_loader.h>
+#include <inttypes.h>
+#include <smbios.h>
+
+static const efi_guid_t smbios_guid = SMBIOS_TABLE_GUID;
+
+void efi_smbios_register(void)
+{
+       /* Map within the low 32 bits, to allow for 32bit SMBIOS tables */
+       uint64_t dmi = 0xffffffff;
+       /* Reserve 4kb for SMBIOS */
+       uint64_t pages = 1;
+       int memtype = EFI_RUNTIME_SERVICES_DATA;
+
+       if (efi_allocate_pages(1, memtype, pages, &dmi) != EFI_SUCCESS)
+               return;
+
+       /* Generate SMBIOS tables */
+       write_smbios_table(dmi);
+
+       /* And expose them to our EFI payload */
+       efi_install_configuration_table(&smbios_guid, (void*)(uintptr_t)dmi);
+}
 
        t->vendor = smbios_add_string(t->eos, "U-Boot");
        t->bios_ver = smbios_add_string(t->eos, PLAIN_VERSION);
        t->bios_release_date = smbios_add_string(t->eos, U_BOOT_DMI_DATE);
+#ifdef CONFIG_ROM_SIZE
        t->bios_rom_size = (CONFIG_ROM_SIZE / 65536) - 1;
+#endif
        t->bios_characteristics = BIOS_CHARACTERISTICS_PCI_SUPPORTED |
                                  BIOS_CHARACTERISTICS_SELECTABLE_BOOT |
                                  BIOS_CHARACTERISTICS_UPGRADEABLE;
 #ifdef CONFIG_GENERATE_ACPI_TABLE
        t->bios_characteristics_ext1 = BIOS_CHARACTERISTICS_EXT1_ACPI;
+#endif
+#ifdef CONFIG_EFI_LOADER
+       t->bios_characteristics_ext1 |= BIOS_CHARACTERISTICS_EXT1_UEFI;
 #endif
        t->bios_characteristics_ext2 = BIOS_CHARACTERISTICS_EXT2_TARGET;
+
        t->bios_major_release = 0xff;
        t->bios_minor_release = 0xff;
        t->ec_major_release = 0xff;