All of lore.kernel.org
 help / color / mirror / Atom feed
From: AKASHI Takahiro <takahiro.akashi@linaro.org>
To: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
Cc: u-boot@lists.denx.de, Ilias Apalodimas <ilias.apalodimas@linaro.org>
Subject: Re: [PATCH v2 3/9] efi_loader: efi_dp_find_obj() add protocol check
Date: Wed, 23 Mar 2022 16:26:26 +0900	[thread overview]
Message-ID: <20220323072626.GE49108@laputa> (raw)
In-Reply-To: <20220319091148.142036-4-heinrich.schuchardt@canonical.com>

On Sat, Mar 19, 2022 at 10:11:42AM +0100, Heinrich Schuchardt wrote:
> Let function efi_dp_find_obj() additionally check if a given protocol is
> installed on the handle relating to the device-path.

Please describe why you want to add another parameter to the function.
Otherwise, we don't understand why the change is necessary.
The caller can simply call efi_search_protocol() to determine whether the given
protocol is installed or not on the handle.

> Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
> ---
> v2:
> 	new patch
> ---
>  include/efi_loader.h             |  1 +
>  lib/efi_loader/efi_boottime.c    |  2 +-
>  lib/efi_loader/efi_capsule.c     |  2 +-
>  lib/efi_loader/efi_device_path.c | 23 ++++++++++++++++-------
>  lib/efi_loader/efi_disk.c        |  2 +-
>  5 files changed, 20 insertions(+), 10 deletions(-)
> 
> diff --git a/include/efi_loader.h b/include/efi_loader.h
> index 6271d40125..1ae47a8713 100644
> --- a/include/efi_loader.h
> +++ b/include/efi_loader.h
> @@ -731,6 +731,7 @@ struct efi_device_path *efi_dp_next(const struct efi_device_path *dp);
>  int efi_dp_match(const struct efi_device_path *a,
>  		 const struct efi_device_path *b);
>  efi_handle_t efi_dp_find_obj(struct efi_device_path *dp,
> +			     const efi_guid_t *guid,
>  			     struct efi_device_path **rem);
>  /* get size of the first device path instance excluding end node */
>  efi_uintn_t efi_dp_instance_size(const struct efi_device_path *dp);
> diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
> index d0f3e05e70..a7bc371f54 100644
> --- a/lib/efi_loader/efi_boottime.c
> +++ b/lib/efi_loader/efi_boottime.c
> @@ -1750,7 +1750,7 @@ efi_status_t efi_setup_loaded_image(struct efi_device_path *device_path,
>  	info->system_table = &systab;
>  
>  	if (device_path) {
> -		info->device_handle = efi_dp_find_obj(device_path, NULL);
> +		info->device_handle = efi_dp_find_obj(device_path, NULL, NULL);
>  
>  		dp = efi_dp_append(device_path, file_path);
>  		if (!dp) {
> diff --git a/lib/efi_loader/efi_capsule.c b/lib/efi_loader/efi_capsule.c
> index c8e2d510a5..3d80d98c1f 100644
> --- a/lib/efi_loader/efi_capsule.c
> +++ b/lib/efi_loader/efi_capsule.c
> @@ -681,7 +681,7 @@ static bool device_is_present_and_system_part(struct efi_device_path *dp)
>  {
>  	efi_handle_t handle;
>  
> -	handle = efi_dp_find_obj(dp, NULL);
> +	handle = efi_dp_find_obj(dp, NULL, NULL);
>  	if (!handle)
>  		return false;
>  
> diff --git a/lib/efi_loader/efi_device_path.c b/lib/efi_loader/efi_device_path.c
> index aeb5264820..0a8802903d 100644
> --- a/lib/efi_loader/efi_device_path.c
> +++ b/lib/efi_loader/efi_device_path.c
> @@ -160,17 +160,19 @@ struct efi_device_path *efi_dp_shorten(struct efi_device_path *dp)
>  }
>  
>  /**
> - * find_handle() - find handle by device path
> + * find_handle() - find handle by device path and installed protocol
>   *
>   * If @rem is provided, the handle with the longest partial match is returned.
>   *
>   * @dp:		device path to search
> + * @guid:	GUID of protocol that must be installed on path or NULL
>   * @short_path:	use short form device path for matching
>   * @rem:	pointer to receive remaining device path
>   * Return:	matching handle
>   */
> -static efi_handle_t find_handle(struct efi_device_path *dp, bool short_path,
> -			        struct efi_device_path **rem)
> +static efi_handle_t find_handle(struct efi_device_path *dp,
> +				const efi_guid_t *guid, bool short_path,
> +				struct efi_device_path **rem)
>  {
>  	efi_handle_t handle, best_handle = NULL;
>  	efi_uintn_t len, best_len = 0;
> @@ -183,6 +185,11 @@ static efi_handle_t find_handle(struct efi_device_path *dp, bool short_path,
>  		efi_uintn_t len_current;
>  		efi_status_t ret;
>  
> +		if (guid) {
> +			ret = efi_search_protocol(handle, guid, &handler);
> +			if (ret != EFI_SUCCESS)
> +				continue;
> +		}
>  		ret = efi_search_protocol(handle, &efi_guid_device_path,
>  					  &handler);
>  		if (ret != EFI_SUCCESS)
> @@ -195,13 +202,13 @@ static efi_handle_t find_handle(struct efi_device_path *dp, bool short_path,
>  		}
>  		len_current = efi_dp_instance_size(dp_current);
>  		if (rem) {
> -			if (len_current < len)
> +			if (len_current > len)

It looks a bug fix, but it's not related to this patch?

-Takahiro Akashi

>  				continue;
>  		} else {
>  			if (len_current != len)
>  				continue;
>  		}
> -		if (memcmp(dp_current, dp, len))
> +		if (memcmp(dp_current, dp, len_current))
>  			continue;
>  		if (!rem)
>  			return handle;
> @@ -220,18 +227,20 @@ static efi_handle_t find_handle(struct efi_device_path *dp, bool short_path,
>   * If @rem is provided, the handle with the longest partial match is returned.
>   *
>   * @dp:		device path to search
> + * @guid:	GUID of protocol that must be installed on path or NULL
>   * @rem:	pointer to receive remaining device path
>   * Return:	matching handle
>   */
>  efi_handle_t efi_dp_find_obj(struct efi_device_path *dp,
> +			     const efi_guid_t *guid,
>  			     struct efi_device_path **rem)
>  {
>  	efi_handle_t handle;
>  
> -	handle = find_handle(dp, false, rem);
> +	handle = find_handle(dp, guid, false, rem);
>  	if (!handle)
>  		/* Match short form device path */
> -		handle = find_handle(dp, true, rem);
> +		handle = find_handle(dp, guid, true, rem);
>  
>  	return handle;
>  }
> diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c
> index 45127d1768..d36a35d94f 100644
> --- a/lib/efi_loader/efi_disk.c
> +++ b/lib/efi_loader/efi_disk.c
> @@ -302,7 +302,7 @@ efi_fs_from_path(struct efi_device_path *full_path)
>  	efi_free_pool(file_path);
>  
>  	/* Get the EFI object for the partition */
> -	efiobj = efi_dp_find_obj(device_path, NULL);
> +	efiobj = efi_dp_find_obj(device_path, NULL, NULL);
>  	efi_free_pool(device_path);
>  	if (!efiobj)
>  		return NULL;
> -- 
> 2.34.1
> 

  reply	other threads:[~2022-03-23  7:26 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-19  9:11 [PATCH v2 0/9] efi_loader: booting via short-form device-path Heinrich Schuchardt
2022-03-19  9:11 ` [PATCH v2 1/9] efi_loader: export efi_dp_shorten() Heinrich Schuchardt
2022-03-21  7:41   ` Ilias Apalodimas
2022-03-23  6:55   ` AKASHI Takahiro
2022-03-19  9:11 ` [PATCH v2 2/9] efi_loader: fix efi_dp_find_obj() Heinrich Schuchardt
2022-03-23  7:18   ` AKASHI Takahiro
2022-03-19  9:11 ` [PATCH v2 3/9] efi_loader: efi_dp_find_obj() add protocol check Heinrich Schuchardt
2022-03-23  7:26   ` AKASHI Takahiro [this message]
2022-03-19  9:11 ` [PATCH v2 4/9] efi_loader: support booting via short-form device-path Heinrich Schuchardt
2022-03-23  7:50   ` AKASHI Takahiro
2022-03-19  9:11 ` [PATCH v2 5/9] efi_loader: use short-form DP for load options Heinrich Schuchardt
2022-03-23  8:18   ` AKASHI Takahiro
2022-03-19  9:11 ` [PATCH v2 6/9] efi_loader: export efi_system_partition_guid Heinrich Schuchardt
2022-03-19  9:11 ` [PATCH v2 7/9] efi_loader: remove efi_disk_is_system_part() Heinrich Schuchardt
2022-03-19  9:11 ` [PATCH v2 8/9] efi_loader: move dtbdump.c, initrddump.c to lib/efi_loader Heinrich Schuchardt
2022-03-23  7:01   ` AKASHI Takahiro
2022-03-19  9:11 ` [PATCH v2 9/9] test: test UEFI boot manager Heinrich Schuchardt
2022-03-25  7:01 ` [PATCH v2 0/9] efi_loader: booting via short-form device-path AKASHI Takahiro
2022-03-25  9:12   ` AKASHI Takahiro

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220323072626.GE49108@laputa \
    --to=takahiro.akashi@linaro.org \
    --cc=heinrich.schuchardt@canonical.com \
    --cc=ilias.apalodimas@linaro.org \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.