Heinrich,

On Sun, Apr 05, 2020 at 11:28:17AM +0200, Heinrich Schuchardt wrote:
> Up to now for MBR and GPT partitions the info field 'bootable' was set to 1
> if either the partition was an EFI system partition or the bootable flag
> was set.
> 
> Turn info field 'bootable' into a bit mask with separate bits for bootable
> and EFI system partition.
> 
> This will allow us to identify the EFI system partition in the UEFI
> sub-system.
> 
> Signed-off-by: Heinrich Schuchardt <xypron.g...@gmx.de>
> ---
> v2:
>       used BIT() macro to define bit mask
> ---
>  disk/part_dos.c | 10 ++++++++--
>  disk/part_efi.c | 12 ++++++++----
>  include/part.h  | 11 ++++++++++-
>  3 files changed, 26 insertions(+), 7 deletions(-)
> 
> diff --git a/disk/part_dos.c b/disk/part_dos.c
> index 83ff40d310..0ec7f1628e 100644
> --- a/disk/part_dos.c
> +++ b/disk/part_dos.c
> @@ -45,9 +45,15 @@ static inline int is_extended(int part_type)
>           part_type == 0x85);
>  }
> 
> -static inline int is_bootable(dos_partition_t *p)
> +static int is_bootable(dos_partition_t *p)
>  {
> -     return (p->sys_ind == 0xef) || (p->boot_ind == 0x80);
> +     int ret = 0;
> +
> +     if (p->sys_ind == 0xef)
> +             ret |= PART_EFI_SYSTEM_PARTITION;
> +     if (p->boot_ind == 0x80)
> +             ret |= PART_BOOTABLE;
> +     return ret;
>  }

The return value is no longer boolean, so the function's name
should be changed to avoid confusion. Say, get_bootable_flags()?
Then  another function, or inline function should be provided.

bool part_is_bootable(blk_desc *bdev)

for checking if the device is "bootable."

>  static void print_one_part(dos_partition_t *p, lbaint_t ext_part_sector,
> diff --git a/disk/part_efi.c b/disk/part_efi.c
> index b2e157d9c1..19f1f43f4e 100644
> --- a/disk/part_efi.c
> +++ b/disk/part_efi.c
> @@ -71,11 +71,15 @@ static char *print_efiname(gpt_entry *pte)
> 
>  static const efi_guid_t system_guid = PARTITION_SYSTEM_GUID;
> 
> -static inline int is_bootable(gpt_entry *p)
> +static int is_bootable(gpt_entry *p)
>  {
> -     return p->attributes.fields.legacy_bios_bootable ||
> -             !memcmp(&(p->partition_type_guid), &system_guid,
> -                     sizeof(efi_guid_t));
> +     int ret = 0;
> +
> +     if (!memcmp(&p->partition_type_guid, &system_guid, sizeof(efi_guid_t)))
> +             ret |=  PART_EFI_SYSTEM_PARTITION;
> +     if (p->attributes.fields.legacy_bios_bootable)
> +             ret |=  PART_BOOTABLE;
> +     return ret;
>  }

ditto, and again

bool part_is_efi_system()

-Takahiro Akashi

>  static int validate_gpt_header(gpt_header *gpt_h, lbaint_t lba,
> diff --git a/include/part.h b/include/part.h
> index 0b5cf3d5e8..f3442ef85d 100644
> --- a/include/part.h
> +++ b/include/part.h
> @@ -51,13 +51,22 @@ struct block_drvr {
>  #define PART_TYPE_LEN 32
>  #define MAX_SEARCH_PARTITIONS 64
> 
> +#define PART_BOOTABLE                        BIT(0)
> +#define PART_EFI_SYSTEM_PARTITION    BIT(1)
> +
>  typedef struct disk_partition {
>       lbaint_t        start;  /* # of first block in partition        */
>       lbaint_t        size;   /* number of blocks in partition        */
>       ulong   blksz;          /* block size in bytes                  */
>       uchar   name[PART_NAME_LEN];    /* partition name                       
> */
>       uchar   type[PART_TYPE_LEN];    /* string type description              
> */
> -     int     bootable;       /* Active/Bootable flag is set          */
> +     /*
> +      * The bootable is a bitmask with the following fields:
> +      *
> +      * PART_BOOTABLE                the MBR bootable flag is set
> +      * PART_EFI_SYSTEM_PARTITION    the partition is an EFI system partition
> +      */
> +     int     bootable;
>  #if CONFIG_IS_ENABLED(PARTITION_UUIDS)
>       char    uuid[UUID_STR_LEN + 1]; /* filesystem UUID as string, if exists 
> */
>  #endif
> --
> 2.25.1
> 

Reply via email to