]> git.sur5r.net Git - u-boot/commitdiff
efi_loader: implement LocateHandleBuffer
authorxypron.glpk@gmx.de <xypron.glpk@gmx.de>
Tue, 11 Jul 2017 20:06:22 +0000 (22:06 +0200)
committerAlexander Graf <agraf@suse.de>
Wed, 19 Jul 2017 12:14:39 +0000 (14:14 +0200)
UEFI boot service LocateHandleBuffer is implemented by calling
efi_allocate_handle and efi_locate_handle.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Signed-off-by: Alexander Graf <agraf@suse.de>
lib/efi_loader/efi_boottime.c

index 1f72efe7c3b741e51ad97a1c44df7d81c26a7f45..6f093290eb6d50f263511f9a45460ac175105905 100644 (file)
@@ -758,9 +758,32 @@ static efi_status_t EFIAPI efi_locate_handle_buffer(
                        efi_guid_t *protocol, void *search_key,
                        unsigned long *no_handles, efi_handle_t **buffer)
 {
+       efi_status_t r;
+       unsigned long buffer_size = 0;
+
        EFI_ENTRY("%d, %p, %p, %p, %p", search_type, protocol, search_key,
                  no_handles, buffer);
-       return EFI_EXIT(EFI_NOT_FOUND);
+
+       if (!no_handles || !buffer) {
+               r = EFI_INVALID_PARAMETER;
+               goto out;
+       }
+       *no_handles = 0;
+       *buffer = NULL;
+       r = efi_locate_handle(search_type, protocol, search_key, &buffer_size,
+                             *buffer);
+       if (r != EFI_BUFFER_TOO_SMALL)
+               goto out;
+       r = efi_allocate_pool(EFI_ALLOCATE_ANY_PAGES, buffer_size,
+                             (void **)buffer);
+       if (r != EFI_SUCCESS)
+               goto out;
+       r = efi_locate_handle(search_type, protocol, search_key, &buffer_size,
+                             *buffer);
+       if (r == EFI_SUCCESS)
+               *no_handles = buffer_size / sizeof(void *);
+out:
+       return EFI_EXIT(r);
 }
 
 static struct efi_class_map efi_class_maps[] = {