u-boot/lib/efi_loader/efi_smbios.c
Simon Glass 06ef8089f8 efi: Correct smbios-table installation
At present this code allocates memory when writing the tables and
then unnecessarily adds another memory map when installing it.

Adjust the code to allocate the tables using the normal U-Boot
mechanism. This avoids doing an EFI memory allocation early in
U-Boot, which may use memory that would be overwritten by a
'load' command, for example.

Signed-off-by: Simon Glass <sjg@chromium.org>
2024-01-07 13:45:07 -07:00

80 lines
1.6 KiB
C

// SPDX-License-Identifier: GPL-2.0+
/*
* EFI application tables support
*
* Copyright (c) 2016 Alexander Graf
*/
#define LOG_CATEGORY LOGC_EFI
#include <efi_loader.h>
#include <log.h>
#include <malloc.h>
#include <mapmem.h>
#include <smbios.h>
#include <linux/sizes.h>
const efi_guid_t smbios3_guid = SMBIOS3_TABLE_GUID;
enum {
TABLE_SIZE = SZ_4K,
};
/*
* Install the SMBIOS table as a configuration table.
*
* Return: status code
*/
efi_status_t efi_smbios_register(void)
{
ulong addr;
efi_status_t ret;
void *buf;
addr = gd_smbios_start();
if (!addr) {
log_err("No SMBIOS tables to install\n");
return EFI_NOT_FOUND;
}
/* Mark space used for tables */
ret = efi_add_memory_map(addr, TABLE_SIZE, EFI_RUNTIME_SERVICES_DATA);
if (ret)
return ret;
log_debug("EFI using SMBIOS tables at %lx\n", addr);
/* Install SMBIOS information as configuration table */
buf = map_sysmem(addr, 0);
ret = efi_install_configuration_table(&smbios3_guid, buf);
unmap_sysmem(buf);
return ret;
}
static int install_smbios_table(void)
{
ulong addr;
void *buf;
if (!IS_ENABLED(CONFIG_GENERATE_SMBIOS_TABLE) || IS_ENABLED(CONFIG_X86))
return 0;
/* Align the table to a 4KB boundary to keep EFI happy */
buf = memalign(SZ_4K, TABLE_SIZE);
if (!buf)
return log_msg_ret("mem", -ENOMEM);
addr = map_to_sysmem(buf);
if (!write_smbios_table(addr)) {
log_err("Failed to write SMBIOS table\n");
return log_msg_ret("smbios", -EINVAL);
}
/* Make a note of where we put it */
log_debug("SMBIOS tables written to %lx\n", addr);
gd->arch.smbios_start = addr;
return 0;
}
EVENT_SPY_SIMPLE(EVT_LAST_STAGE_INIT, install_smbios_table);