Hi Vincent,

> Subject: [PATCH] efi_loader: add missing EFI_CALL around tcg2 read_blocks
> calls
> 
> The read_blocks() function from the Block IO protocol is a UEFI function;
> make sure to call it from within U-Boot using the EFI_CALL() macro.
> 
> To demonstrate the issue on an AArch64 machine, define the DEBUG macro in
> include/efi_loader.h and build u-boot with sandbox_defconfig, then download
> and uncompress the ACS-DT image [1], and finally execute the following
> command:
> 
>   $ ./u-boot -T -c " \
>       host bind 0 systemready-dt_acs_live_image.wic; \
>       setenv loadaddr 0x10000; \
>       load host 0 \${loadaddr} EFI/BOOT/Shell.efi; \
>       bootefi \${loadaddr} \${fdtcontroladdr}"
> 
> The following assertion should fail:
> 
>   lib/efi_loader/efi_net.c:858: efi_network_timer_notify: Assertion
> `__efi_entry_check()' failed.
> 
> This happens due to the following EFIAPI functions call chain:
> 
>   efi_start_image()
>     efi_disk_read_blocks()
>       (due to the missing EFI_CALL, entry_count == 2)
>       efi_network_timer_notify()
> 
> Link:
> https://github.com/ARM-software/arm-systemready/releases/download/v25
> .12_DT_3.1.1/systemready-dt_acs_live_image.wic.xz [1]
> Fixes: ce3dbc5d080d ("efi_loader: add UEFI GPT measurement")
> Signed-off-by: Vincent StehlĂ© <[email protected]>
> Cc: Heinrich Schuchardt <[email protected]>
> Cc: Ilias Apalodimas <[email protected]>
> Cc: Tom Rini <[email protected]>
> Cc: Masahisa Kojima <[email protected]>
> ---
>  lib/efi_loader/efi_tcg2.c | 13 ++++++++-----
>  1 file changed, 8 insertions(+), 5 deletions(-)
> 
> diff --git a/lib/efi_loader/efi_tcg2.c b/lib/efi_loader/efi_tcg2.c
> index bdf78897d47..1860dc50238 100644
> --- a/lib/efi_loader/efi_tcg2.c
> +++ b/lib/efi_loader/efi_tcg2.c
> @@ -1213,8 +1213,10 @@ tcg2_measure_gpt_data(struct udevice *dev,
>               goto out2;
>       }
> 
> -     ret = block_io->read_blocks(block_io, block_io->media->media_id,
> 1,
> -                                 block_io->media->block_size, gpt_h);
> +     ret = EFI_CALL(block_io->read_blocks(block_io,
> +                                          block_io->media->media_id,
> 1,
> +                                          block_io->media->block_size,
> +                                          gpt_h));
>       if (ret != EFI_SUCCESS)
>               goto out2;
> 
> @@ -1227,9 +1229,10 @@ tcg2_measure_gpt_data(struct udevice *dev,
>               goto out2;
>       }
> 
> -     ret = block_io->read_blocks(block_io, block_io->media->media_id,
> -                                 gpt_h->partition_entry_lba,
> -                                 total_gpt_entry_size, entry);
> +     ret = EFI_CALL(block_io->read_blocks(block_io,
> +                                          block_io->media->media_id,
> +                                          gpt_h->partition_entry_lba,
> +                                          total_gpt_entry_size, entry));

Thank you again for the fix.
Acked-by: Masahisa Kojima <[email protected]>

Best regards,
Masahisa Kojima

>       if (ret != EFI_SUCCESS)
>               goto out2;
> 
> --
> 2.51.0

Reply via email to