[U-Boot] [PATCH v3 07/16] efi_loader: implement OpenProtocolInformation

Alexander Graf agraf at suse.de
Fri Jan 19 16:30:35 UTC 2018



On 11.01.18 08:16, Heinrich Schuchardt wrote:
> efi_open_protocol_information provides the agent and controller
> handles as well as the attributes and open count of an protocol
> on a handle.
> 
> Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
> ---
> v3
> 	no change
> v2
> 	no change
> ---
>  lib/efi_loader/efi_boottime.c | 41 ++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 40 insertions(+), 1 deletion(-)
> 
> diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
> index a527e33141..44c9da0a7c 100644
> --- a/lib/efi_loader/efi_boottime.c
> +++ b/lib/efi_loader/efi_boottime.c
> @@ -1722,9 +1722,48 @@ static efi_status_t EFIAPI efi_open_protocol_information(efi_handle_t handle,
>  			struct efi_open_protocol_info_entry **entry_buffer,
>  			efi_uintn_t *entry_count)
>  {
> +	unsigned long buffer_size;
> +	unsigned long count;
> +	struct efi_handler *handler;
> +	struct efi_open_protocol_info_item *item;
> +	efi_status_t r;
> +
>  	EFI_ENTRY("%p, %pUl, %p, %p", handle, protocol, entry_buffer,
>  		  entry_count);
> -	return EFI_EXIT(EFI_NOT_FOUND);
> +
> +	/* Check parameters */
> +	if (!entry_buffer) {
> +		r = EFI_INVALID_PARAMETER;
> +		goto out;
> +	}
> +	r = efi_search_protocol(handle, protocol, &handler);
> +	if (r != EFI_SUCCESS)
> +		goto out;
> +
> +	/* Count entries */
> +	count = 0;
> +	list_for_each_entry(item, &handler->open_infos, link) {
> +		++count;

^

> +	}
> +	*entry_count = count;
> +	*entry_buffer = NULL;
> +	if (!count) {
> +		r = EFI_SUCCESS;
> +		goto out;
> +	}
> +
> +	/* Copy entries */
> +	buffer_size = count * sizeof(struct efi_open_protocol_info_entry);
> +	r = efi_allocate_pool(EFI_ALLOCATE_ANY_PAGES, buffer_size,
> +			      (void **)entry_buffer);
> +	if (r != EFI_SUCCESS)
> +		goto out;
> +	list_for_each_entry_reverse(item, &handler->open_infos, link) {
> +		if (item->info.open_count)
> +			(*entry_buffer)[--count] = item->info;

The count resulting here is different from the first count, as here you
also check item->info.open_count. Shouldn't that also get checked above?


Alex

> +	}
> +out:
> +	return EFI_EXIT(r);
>  }
>  
>  /*
> 


More information about the U-Boot mailing list