grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 1/2] efidisk: move device path helpers in core for efinet


From: Vladimir 'φ-coder/phcoder' Serbinenko
Subject: Re: [PATCH 1/2] efidisk: move device path helpers in core for efinet
Date: Thu, 07 May 2015 16:53:41 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Icedove/31.6.0

Go ahead
On 19.04.2015 10:01, Andrei Borzenkov wrote:
> ---
>  grub-core/disk/efi/efidisk.c | 61 
> ++++++++------------------------------------
>  grub-core/kern/efi/efi.c     | 41 +++++++++++++++++++++++++++++
>  include/grub/efi/efi.h       |  4 +++
>  3 files changed, 55 insertions(+), 51 deletions(-)
> 
> diff --git a/grub-core/disk/efi/efidisk.c b/grub-core/disk/efi/efidisk.c
> index 60a6d3c..a8783a3 100644
> --- a/grub-core/disk/efi/efidisk.c
> +++ b/grub-core/disk/efi/efidisk.c
> @@ -43,47 +43,6 @@ static struct grub_efidisk_data *fd_devices;
>  static struct grub_efidisk_data *hd_devices;
>  static struct grub_efidisk_data *cd_devices;
>  
> -/* Duplicate a device path.  */
> -static grub_efi_device_path_t *
> -duplicate_device_path (const grub_efi_device_path_t *dp)
> -{
> -  grub_efi_device_path_t *p;
> -  grub_size_t total_size = 0;
> -
> -  for (p = (grub_efi_device_path_t *) dp;
> -       ;
> -       p = GRUB_EFI_NEXT_DEVICE_PATH (p))
> -    {
> -      total_size += GRUB_EFI_DEVICE_PATH_LENGTH (p);
> -      if (GRUB_EFI_END_ENTIRE_DEVICE_PATH (p))
> -     break;
> -    }
> -
> -  p = grub_malloc (total_size);
> -  if (! p)
> -    return 0;
> -
> -  grub_memcpy (p, dp, total_size);
> -  return p;
> -}
> -
> -/* Return the device path node right before the end node.  */
> -static grub_efi_device_path_t *
> -find_last_device_path (const grub_efi_device_path_t *dp)
> -{
> -  grub_efi_device_path_t *next, *p;
> -
> -  if (GRUB_EFI_END_ENTIRE_DEVICE_PATH (dp))
> -    return 0;
> -
> -  for (p = (grub_efi_device_path_t *) dp, next = GRUB_EFI_NEXT_DEVICE_PATH 
> (p);
> -       ! GRUB_EFI_END_ENTIRE_DEVICE_PATH (next);
> -       p = next, next = GRUB_EFI_NEXT_DEVICE_PATH (next))
> -    ;
> -
> -  return p;
> -}
> -
>  static struct grub_efidisk_data *
>  make_devices (void)
>  {
> @@ -110,7 +69,7 @@ make_devices (void)
>        if (! dp)
>       continue;
>  
> -      ldp = find_last_device_path (dp);
> +      ldp = grub_efi_find_last_device_path (dp);
>        if (! ldp)
>       /* This is empty. Why?  */
>       continue;
> @@ -150,11 +109,11 @@ find_parent_device (struct grub_efidisk_data *devices,
>    grub_efi_device_path_t *dp, *ldp;
>    struct grub_efidisk_data *parent;
>  
> -  dp = duplicate_device_path (d->device_path);
> +  dp = grub_efi_duplicate_device_path (d->device_path);
>    if (! dp)
>      return 0;
>  
> -  ldp = find_last_device_path (dp);
> +  ldp = grub_efi_find_last_device_path (dp);
>    ldp->type = GRUB_EFI_END_DEVICE_PATH_TYPE;
>    ldp->subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE;
>    ldp->length = sizeof (*ldp);
> @@ -180,11 +139,11 @@ is_child (struct grub_efidisk_data *child,
>    grub_efi_device_path_t *dp, *ldp;
>    int ret;
>  
> -  dp = duplicate_device_path (child->device_path);
> +  dp = grub_efi_duplicate_device_path (child->device_path);
>    if (! dp)
>      return 0;
>  
> -  ldp = find_last_device_path (dp);
> +  ldp = grub_efi_find_last_device_path (dp);
>    ldp->type = GRUB_EFI_END_DEVICE_PATH_TYPE;
>    ldp->subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE;
>    ldp->length = sizeof (*ldp);
> @@ -207,8 +166,8 @@ add_device (struct grub_efidisk_data **devices, struct 
> grub_efidisk_data *d)
>      {
>        int ret;
>  
> -      ret = grub_efi_compare_device_paths (find_last_device_path 
> ((*p)->device_path),
> -                                        find_last_device_path 
> (d->device_path));
> +      ret = grub_efi_compare_device_paths (grub_efi_find_last_device_path 
> ((*p)->device_path),
> +                                        grub_efi_find_last_device_path 
> (d->device_path));
>        if (ret == 0)
>       ret = grub_efi_compare_device_paths ((*p)->device_path,
>                                            d->device_path);
> @@ -795,7 +754,7 @@ grub_efidisk_get_device_name (grub_efi_handle_t *handle)
>    if (! dp)
>      return 0;
>  
> -  ldp = find_last_device_path (dp);
> +  ldp = grub_efi_find_last_device_path (dp);
>    if (! ldp)
>      return 0;
>  
> @@ -810,14 +769,14 @@ grub_efidisk_get_device_name (grub_efi_handle_t *handle)
>  
>        /* It is necessary to duplicate the device path so that GRUB
>        can overwrite it.  */
> -      dup_dp = duplicate_device_path (dp);
> +      dup_dp = grub_efi_duplicate_device_path (dp);
>        if (! dup_dp)
>       return 0;
>  
>        while (1)
>       {
>         grub_efi_device_path_t *dup_ldp;
> -       dup_ldp = find_last_device_path (dup_dp);
> +       dup_ldp = grub_efi_find_last_device_path (dup_dp);
>         if (!(GRUB_EFI_DEVICE_PATH_TYPE (dup_ldp) == 
> GRUB_EFI_MEDIA_DEVICE_PATH_TYPE
>               && (GRUB_EFI_DEVICE_PATH_SUBTYPE (dup_ldp) == 
> GRUB_EFI_CDROM_DEVICE_PATH_SUBTYPE
>                   || GRUB_EFI_DEVICE_PATH_SUBTYPE (dup_ldp) == 
> GRUB_EFI_HARD_DRIVE_DEVICE_PATH_SUBTYPE)))
> diff --git a/grub-core/kern/efi/efi.c b/grub-core/kern/efi/efi.c
> index b9eb1ab..49a1501 100644
> --- a/grub-core/kern/efi/efi.c
> +++ b/grub-core/kern/efi/efi.c
> @@ -394,6 +394,47 @@ grub_efi_get_device_path (grub_efi_handle_t handle)
>                                GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL);
>  }
>  
> +/* Return the device path node right before the end node.  */
> +grub_efi_device_path_t *
> +grub_efi_find_last_device_path (const grub_efi_device_path_t *dp)
> +{
> +  grub_efi_device_path_t *next, *p;
> +
> +  if (GRUB_EFI_END_ENTIRE_DEVICE_PATH (dp))
> +    return 0;
> +
> +  for (p = (grub_efi_device_path_t *) dp, next = GRUB_EFI_NEXT_DEVICE_PATH 
> (p);
> +       ! GRUB_EFI_END_ENTIRE_DEVICE_PATH (next);
> +       p = next, next = GRUB_EFI_NEXT_DEVICE_PATH (next))
> +    ;
> +
> +  return p;
> +}
> +
> +/* Duplicate a device path.  */
> +grub_efi_device_path_t *
> +grub_efi_duplicate_device_path (const grub_efi_device_path_t *dp)
> +{
> +  grub_efi_device_path_t *p;
> +  grub_size_t total_size = 0;
> +
> +  for (p = (grub_efi_device_path_t *) dp;
> +       ;
> +       p = GRUB_EFI_NEXT_DEVICE_PATH (p))
> +    {
> +      total_size += GRUB_EFI_DEVICE_PATH_LENGTH (p);
> +      if (GRUB_EFI_END_ENTIRE_DEVICE_PATH (p))
> +     break;
> +    }
> +
> +  p = grub_malloc (total_size);
> +  if (! p)
> +    return 0;
> +
> +  grub_memcpy (p, dp, total_size);
> +  return p;
> +}
> +
>  static void
>  dump_vendor_path (const char *type, grub_efi_vendor_device_path_t *vendor)
>  {
> diff --git a/include/grub/efi/efi.h b/include/grub/efi/efi.h
> index 489cf9e..0e6fd86 100644
> --- a/include/grub/efi/efi.h
> +++ b/include/grub/efi/efi.h
> @@ -53,6 +53,10 @@ void EXPORT_FUNC(grub_efi_print_device_path) 
> (grub_efi_device_path_t *dp);
>  char *EXPORT_FUNC(grub_efi_get_filename) (grub_efi_device_path_t *dp);
>  grub_efi_device_path_t *
>  EXPORT_FUNC(grub_efi_get_device_path) (grub_efi_handle_t handle);
> +grub_efi_device_path_t *
> +EXPORT_FUNC(grub_efi_find_last_device_path) (const grub_efi_device_path_t 
> *dp);
> +grub_efi_device_path_t *
> +EXPORT_FUNC(grub_efi_duplicate_device_path) (const grub_efi_device_path_t 
> *dp);
>  grub_err_t EXPORT_FUNC (grub_efi_finish_boot_services) (grub_efi_uintn_t 
> *outbuf_size, void *outbuf,
>                                                       grub_efi_uintn_t 
> *map_key,
>                                                       grub_efi_uintn_t 
> *efi_desc_size,
> 


Attachment: signature.asc
Description: OpenPGP digital signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]