[PATCH 2/2] lib/efi_selftest: test block io revision
Heinrich Schuchardt
xypron.glpk at gmx.de
Sun Jun 21 10:51:25 CEST 2026
On 6/9/26 10:07, Vincent Stehlé wrote:
> Enhance the unit test to verify all Revision fields of all the
> EFI_BLOCK_IO_PROTOCOL structures.
> As the unit test registers its own block io protocol for test purposes,
> make sure to initialize its revision properly, as it will be verified as
> well.
>
> This can run on the sandbox with the following command:
>
> ./u-boot -T -c 'setenv efi_selftest block device; bootefi selftest'
>
> Signed-off-by: Vincent Stehlé <vincent.stehle at arm.com>
> Cc: Heinrich Schuchardt <xypron.glpk at gmx.de>
> Cc: Ilias Apalodimas <ilias.apalodimas at linaro.org>
> Cc: Tom Rini <trini at konsulko.com>
> ---
> lib/efi_selftest/efi_selftest_block_device.c | 50 ++++++++++++++++++++++++++++
> 1 file changed, 50 insertions(+)
>
> diff --git a/lib/efi_selftest/efi_selftest_block_device.c b/lib/efi_selftest/efi_selftest_block_device.c
> index 9c4be834eeb..6fade3e9159 100644
> --- a/lib/efi_selftest/efi_selftest_block_device.c
> +++ b/lib/efi_selftest/efi_selftest_block_device.c
> @@ -170,6 +170,7 @@ static efi_status_t decompress(u8 **image)
> static struct efi_block_io_media media;
>
> static struct efi_block_io block_io = {
> + .revision = EFI_BLOCK_IO_PROTOCOL_REVISION3,
> .media = &media,
> .reset = reset,
> .read_blocks = read_blocks,
> @@ -603,6 +604,55 @@ static int execute(void)
> return EFI_ST_FAILURE;
> }
>
> + /* Get all handles with block io. */
> + ret = boottime->locate_handle_buffer(BY_PROTOCOL,
> + &block_io_protocol_guid, NULL,
> + &no_handles, &handles);
> + if (ret != EFI_SUCCESS) {
> + efi_st_error("Failed to locate block io handles\n");
> + return EFI_ST_FAILURE;
> + }
Thank you for providing this test.
The test should pass when invoking U-Boot without any block device.
EFI_NOT_FOUND should not be reported as failure instead you should leave
with EFI_ST_SUCCESS.
> +
> + /*
> + * Verify all handles with block io.
> + * If an error is encountered, the loop exits early instead of
> + * returning, to free the handles buffer.
> + */
> + for (i = 0; i < no_handles; ++i) {
> + u64 rev;
> +
> + ret = boottime->open_protocol(handles[i],
> + &block_io_protocol_guid,
> + (void *)&block_io_protocol,
> + NULL, NULL,
> + EFI_OPEN_PROTOCOL_GET_PROTOCOL);
> + if (ret != EFI_SUCCESS) {
> + efi_st_error("Failed to open block io protocol %d\n",
> + (unsigned int)i);
> + break;
> + }
> +
> + /* Verify block io revision. */
> + rev = block_io_protocol->revision;
> + if (rev != EFI_BLOCK_IO_PROTOCOL_REVISION2 &&
> + rev != EFI_BLOCK_IO_PROTOCOL_REVISION3) {
> + efi_st_error("Bad block io revision %d\n",
The field is unsigned. So we need %u here.
Best regards
Heinrich
> + (unsigned int)rev);
> + break;
> + }
> + }
> +
> + /* Free handles buffer. */
> + ret = boottime->free_pool(handles);
> + if (ret != EFI_SUCCESS) {
> + efi_st_error("Failed to free block io handles\n");
> + return EFI_ST_FAILURE;
> + }
> +
> + /* If we exited the loop on block io handles early this is a failure. */
> + if (i != no_handles)
> + return EFI_ST_FAILURE;
> +
> return EFI_ST_SUCCESS;
> }
>
>
More information about the U-Boot
mailing list