[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