efi: Create ECPT table
The ECPT table will be included in the UEFI specification 2.9+. The ECPT table was introduced in UEFI following the code-first path. The acceptance ticket can be viewed at: https://bugzilla.tianocore.org/show_bug.cgi?id=3591 The Conformance Profiles table is a UEFI configuration table that contains GUID of the UEFI profiles that the UEFI implementation conforms with. The ECPT table is created when CONFIG_EFI_ECPT=y. The config is set by default. Signed-off-by: Jose Marinho <jose.marinho@arm.com> Reviewed-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
This commit is contained in:
parent
2b7a6e013f
commit
6b92c17352
@ -226,6 +226,18 @@ enum efi_reset_type {
|
||||
EFI_GUID(0x6dcbd5ed, 0xe82d, 0x4c44, 0xbd, 0xa1, \
|
||||
0x71, 0x94, 0x19, 0x9a, 0xd9, 0x2a)
|
||||
|
||||
#define EFI_CONFORMANCE_PROFILES_TABLE_GUID \
|
||||
EFI_GUID(0x36122546, 0xf7ef, 0x4c8f, 0xbd, 0x9b, \
|
||||
0xeb, 0x85, 0x25, 0xb5, 0x0c, 0x0b)
|
||||
|
||||
#define EFI_CONFORMANCE_PROFILES_TABLE_VERSION 1
|
||||
|
||||
struct efi_conformance_profiles_table {
|
||||
u16 version;
|
||||
u16 number_of_profiles;
|
||||
efi_guid_t conformance_profiles[];
|
||||
} __packed;
|
||||
|
||||
struct efi_capsule_header {
|
||||
efi_guid_t capsule_guid;
|
||||
u32 header_size;
|
||||
|
@ -1052,6 +1052,13 @@ extern u8 num_image_type_guids;
|
||||
*/
|
||||
efi_status_t efi_esrt_register(void);
|
||||
|
||||
/**
|
||||
* efi_ecpt_register() - Install the ECPT system table.
|
||||
*
|
||||
* Return: status code
|
||||
*/
|
||||
efi_status_t efi_ecpt_register(void);
|
||||
|
||||
/**
|
||||
* efi_esrt_populate() - Populates the ESRT entries from the FMP instances
|
||||
* present in the system.
|
||||
|
@ -385,6 +385,12 @@ config EFI_ESRT
|
||||
help
|
||||
Enabling this option creates the ESRT UEFI system table.
|
||||
|
||||
config EFI_ECPT
|
||||
bool "Enable the UEFI ECPT generation"
|
||||
default y
|
||||
help
|
||||
Enabling this option created the ECPT UEFI table.
|
||||
|
||||
config EFI_RISCV_BOOT_PROTOCOL
|
||||
bool "RISCV_EFI_BOOT_PROTOCOL support"
|
||||
default y
|
||||
|
@ -76,6 +76,7 @@ obj-$(CONFIG_EFI_TCG2_PROTOCOL) += efi_tcg2.o
|
||||
obj-$(CONFIG_EFI_RISCV_BOOT_PROTOCOL) += efi_riscv.o
|
||||
obj-$(CONFIG_EFI_LOAD_FILE2_INITRD) += efi_load_initrd.o
|
||||
obj-$(CONFIG_EFI_SIGNATURE_SUPPORT) += efi_signature.o
|
||||
obj-$(CONFIG_EFI_ECPT) += efi_conformance.o
|
||||
|
||||
EFI_VAR_SEED_FILE := $(subst $\",,$(CONFIG_EFI_VAR_SEED_FILE))
|
||||
$(obj)/efi_var_seed.o: $(srctree)/$(EFI_VAR_SEED_FILE)
|
||||
|
54
lib/efi_loader/efi_conformance.c
Normal file
54
lib/efi_loader/efi_conformance.c
Normal file
@ -0,0 +1,54 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* EFI conformance profile table
|
||||
*
|
||||
* Copyright (C) 2022 Arm Ltd.
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <efi_loader.h>
|
||||
#include <log.h>
|
||||
#include <efi_api.h>
|
||||
#include <malloc.h>
|
||||
|
||||
static const efi_guid_t efi_ecpt_guid = EFI_CONFORMANCE_PROFILES_TABLE_GUID;
|
||||
|
||||
/**
|
||||
* efi_ecpt_register() - Install the ECPT system table.
|
||||
*
|
||||
* Return: status code
|
||||
*/
|
||||
efi_status_t efi_ecpt_register(void)
|
||||
{
|
||||
int num_entries = 0;
|
||||
struct efi_conformance_profiles_table *ecpt;
|
||||
efi_status_t ret;
|
||||
size_t ecpt_size;
|
||||
|
||||
ecpt_size = num_entries * sizeof(efi_guid_t)
|
||||
+ sizeof(struct efi_conformance_profiles_table);
|
||||
ret = efi_allocate_pool(EFI_BOOT_SERVICES_DATA, ecpt_size,
|
||||
(void **)&ecpt);
|
||||
|
||||
if (ret != EFI_SUCCESS) {
|
||||
log_err("Out of memory\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
ecpt->version = EFI_CONFORMANCE_PROFILES_TABLE_VERSION;
|
||||
ecpt->number_of_profiles = num_entries;
|
||||
|
||||
/* Install the ECPT in the system configuration table. */
|
||||
ret = efi_install_configuration_table(&efi_ecpt_guid, (void *)ecpt);
|
||||
if (ret != EFI_SUCCESS) {
|
||||
log_err("Failed to install ECPT\n");
|
||||
efi_free_pool(ecpt);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
log_debug("ECPT created\n");
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
@ -274,6 +274,12 @@ efi_status_t efi_init_obj_list(void)
|
||||
if (ret != EFI_SUCCESS)
|
||||
goto out;
|
||||
|
||||
if (IS_ENABLED(CONFIG_EFI_ECPT)) {
|
||||
ret = efi_ecpt_register();
|
||||
if (ret != EFI_SUCCESS)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (IS_ENABLED(CONFIG_EFI_ESRT)) {
|
||||
ret = efi_esrt_register();
|
||||
if (ret != EFI_SUCCESS)
|
||||
|
@ -220,6 +220,10 @@ static const struct {
|
||||
"TCG2 Final Events Table",
|
||||
EFI_TCG2_FINAL_EVENTS_TABLE_GUID,
|
||||
},
|
||||
{
|
||||
"EFI Conformance Profiles Table",
|
||||
EFI_CONFORMANCE_PROFILES_TABLE_GUID,
|
||||
},
|
||||
#ifdef CONFIG_EFI_RISCV_BOOT_PROTOCOL
|
||||
{
|
||||
"RISC-V Boot",
|
||||
|
Loading…
Reference in New Issue
Block a user