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:
Jose Marinho 2021-12-23 14:51:07 +00:00 committed by Heinrich Schuchardt
parent 2b7a6e013f
commit 6b92c17352
7 changed files with 90 additions and 0 deletions

View File

@ -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;

View File

@ -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.

View File

@ -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

View File

@ -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)

View 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;
}

View File

@ -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)

View File

@ -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",