[RFC RESEND 2/2] efi: Add fake FMP instance to test ESRT creation

Heinrich Schuchardt xypron.glpk at gmx.de
Thu Jan 28 16:02:25 CET 2021


On 28.01.21 14:29, Jose Marinho wrote:
> The intent of this commit is to exercise the ESRT creation -- introduced
> in the previous commit.
>
> The fake FMP overrides the symbol arch_efi_load_capsule_drivers().
> The fake FMP only implements the get_image_info FMP method.
> This get_image_info returns an image descriptor with a single image.
>
> Signed-off-by: Jose Marinho <jose.marinho at arm.com>
> CC: Heinrich Schuchardt <xypron.glpk at gmx.de>
> CC: Sughosh Ganu <sughosh.ganu at linaro.org>
> CC: AKASHI Takahiro <takahiro.akashi at linaro.org>
> CC: Andre Przywara <andre.przywara at arm.com>
> CC: Alexander Graf <agraf at csgraf.de>
> CC: nd at arm.com
> ---
>  lib/efi_loader/Makefile       |   1 +
>  lib/efi_loader/efi_fake_fmp.c | 172 ++++++++++++++++++++++++++++++++++
>  2 files changed, 173 insertions(+)
>  create mode 100644 lib/efi_loader/efi_fake_fmp.c

Hello Jose,

this patch is not yet clear to me.

Why do we need a fake fmp protocol? The driver that is in
lib/efi_loader/efi_firmware.c and is installed if
CONFIG_EFI_CAPSULE_ON_DISK=y already provides an FMP protocol. That
should be enough to trigger the ESRT installation.

I am missing an actual test in the series.

Best regards

Heinrich

>
> diff --git a/lib/efi_loader/Makefile b/lib/efi_loader/Makefile
> index dec791b310..8888ea193d 100644
> --- a/lib/efi_loader/Makefile
> +++ b/lib/efi_loader/Makefile
> @@ -53,6 +53,7 @@ obj-$(CONFIG_EFI_VARIABLES_PRESEED) += efi_var_seed.o
>  endif
>  obj-y += efi_watchdog.o
>  obj-y += efi_esrt.o
> +obj-y += efi_fake_fmp.o
>  obj-$(CONFIG_LCD) += efi_gop.o
>  obj-$(CONFIG_DM_VIDEO) += efi_gop.o
>  obj-$(CONFIG_PARTITIONS) += efi_disk.o
> diff --git a/lib/efi_loader/efi_fake_fmp.c b/lib/efi_loader/efi_fake_fmp.c
> new file mode 100644
> index 0000000000..ab7a8164c9
> --- /dev/null
> +++ b/lib/efi_loader/efi_fake_fmp.c
> @@ -0,0 +1,172 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * Fake FMP intended to test ESRT table creation.
> + *
> + *  Copyright (c) 2021 Arm Ltd.
> + */
> +
> +#include <common.h>
> +#include <efi_loader.h>
> +#include <net.h>
> +
> +/*
> + * Note: this GUID is used for code testing purposes.
> + */
> +#define EFI_FAKE_IMG_GUID \
> +	EFI_GUID(0x00000001, 0x0002, 0x0003, 0x04, 0x05, \
> +		 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b)
> +
> +static const efi_guid_t fake_img_guid = EFI_FAKE_IMG_GUID;
> +
> +const struct fw_image_info *get_image_info(void);
> +
> +static
> +efi_status_t EFIAPI efi_fake_fmp_get_image_info(
> +	struct efi_firmware_management_protocol *this,
> +	efi_uintn_t *image_info_size,
> +	struct efi_firmware_image_descriptor *image_info,
> +	u32 *descriptor_version,
> +	u8 *descriptor_count,
> +	efi_uintn_t *descriptor_size,
> +	u32 *package_version,
> +	u16 **package_version_name)
> +{
> +	efi_status_t ret = EFI_SUCCESS;
> +
> +	log_debug("EFI FMP: fake fmp get image info\n");
> +
> +	EFI_ENTRY("%p %p %p %p %p %p %p %p\n", this,
> +		  image_info_size, image_info,
> +		  descriptor_version, descriptor_count, descriptor_size,
> +		  package_version, package_version_name);
> +
> +	if (!image_info_size)
> +		return EFI_EXIT(EFI_INVALID_PARAMETER);
> +
> +	if (*image_info_size < sizeof(*image_info)) {
> +		*image_info_size = sizeof(*image_info);
> +		return EFI_EXIT(EFI_BUFFER_TOO_SMALL);
> +	}
> +
> +	*image_info_size = sizeof(*image_info);
> +	if (descriptor_version)
> +		*descriptor_version = EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION;
> +	if (descriptor_count)
> +		*descriptor_count = 1;
> +	if (descriptor_size)
> +		*descriptor_size = sizeof(*image_info);
> +	if (package_version)
> +		*package_version = 0xffffffff; /* not supported */
> +	if (package_version_name)
> +		*package_version_name = NULL; /* not supported */
> +
> +	if (!image_info_size)
> +		return EFI_EXIT(EFI_INVALID_PARAMETER);
> +
> +	if (*image_info_size < sizeof(*image_info)) {
> +		*image_info_size = sizeof(*image_info);
> +		return EFI_EXIT(EFI_BUFFER_TOO_SMALL);
> +	}
> +
> +	if (!image_info)
> +		return EFI_EXIT(EFI_INVALID_PARAMETER);
> +
> +	log_debug("EFI FMP: fake image UUID=%pUl\n", &fake_img_guid);
> +
> +	image_info[0].image_index = 1;
> +	image_info[0].image_type_id = fake_img_guid;
> +
> +	image_info[0].image_id = 0;
> +	image_info[0].image_id_name = NULL;
> +	image_info[0].version = 0; /* not supported */
> +	image_info[0].version_name = NULL; /* not supported */
> +	image_info[0].size = 0;
> +
> +	image_info[0].hardware_instance = 1;
> +
> +	return EFI_EXIT(ret);
> +}
> +
> +static
> +efi_status_t EFIAPI efi_fake_fmp_get_image(
> +	struct efi_firmware_management_protocol *this,
> +	u8 image_index,
> +	void *image,
> +	efi_uintn_t *image_size)
> +{
> +	return EFI_EXIT(EFI_UNSUPPORTED);
> +}
> +
> +static
> +efi_status_t EFIAPI efi_fake_fmp_set_image(
> +	struct efi_firmware_management_protocol *this,
> +	u8 image_index,
> +	const void *image,
> +	efi_uintn_t image_size,
> +	const void *vendor_code,
> +	efi_status_t (*progress)(efi_uintn_t completion),
> +	u16 **abort_reason)
> +{
> +	EFI_ENTRY("%p %d %p %ld %p %p %p\n", this, image_index, image,
> +		  image_size, vendor_code, progress, abort_reason);
> +
> +	return EFI_EXIT(EFI_UNSUPPORTED);
> +}
> +
> +static
> +efi_status_t EFIAPI efi_fake_fmp_check_image(
> +	struct efi_firmware_management_protocol *this,
> +	u8 image_index,
> +	const void *image,
> +	efi_uintn_t *image_size,
> +	u32 *image_updatable)
> +{
> +	return EFI_EXIT(EFI_UNSUPPORTED);
> +}
> +
> +static
> +efi_status_t EFIAPI efi_fake_fmp_get_package_info(
> +	struct efi_firmware_management_protocol *this,
> +	u32 *package_version,
> +	u16 **package_version_name,
> +	u32 *package_version_name_maxlen,
> +	u64 *attributes_supported,
> +	u64 *attributes_setting)
> +{
> +	return EFI_EXIT(EFI_UNSUPPORTED);
> +}
> +
> +static
> +efi_status_t EFIAPI efi_fake_fmp_set_package_info(
> +	struct efi_firmware_management_protocol *this,
> +	const void *image,
> +	efi_uintn_t *image_size,
> +	const void *vendor_code,
> +	u32 package_version,
> +	const u16 *package_version_name)
> +{
> +	return EFI_EXIT(EFI_UNSUPPORTED);
> +}
> +
> +const struct efi_firmware_management_protocol efi_fake_fmp = {
> +	.get_image_info = efi_fake_fmp_get_image_info,
> +	.get_image = efi_fake_fmp_get_image,
> +	.set_image = efi_fake_fmp_set_image,
> +	.check_image = efi_fake_fmp_check_image,
> +	.get_package_info = efi_fake_fmp_get_package_info,
> +	.set_package_info = efi_fake_fmp_set_package_info,
> +};
> +
> +efi_status_t arch_efi_load_capsule_drivers(void)
> +{
> +	efi_status_t ret = EFI_SUCCESS;
> +
> +	EFI_CALL(efi_install_multiple_protocol_interfaces(
> +			&efi_root, &efi_guid_firmware_management_protocol,
> +			&efi_fake_fmp, NULL));
> +
> +	if (ret != EFI_SUCCESS)
> +		log_err("EFI FMP: failed to install fake FMP %lx\n", ret);
> +
> +	return ret;
> +}
>



More information about the U-Boot mailing list