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é <[email protected]>
Cc: Heinrich Schuchardt <[email protected]>
Cc: Ilias Apalodimas <[email protected]>
Cc: Tom Rini <[email protected]>
---
  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;
  }

Reply via email to