part: detect EFI system partition
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Thu, 19 Mar 2020 12:49:34 +0000 (13:49 +0100)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Thu, 30 Apr 2020 08:25:07 +0000 (10:25 +0200)
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.glpk@gmx.de>
cmd/gpt.c
disk/part_dos.c
disk/part_efi.c
include/part.h

index efaf1bcecb2bae46c83268b5e69564f6857b40bd..b94f0051cdd780197de80229a56e940c127acc6c 100644 (file)
--- a/cmd/gpt.c
+++ b/cmd/gpt.c
@@ -245,7 +245,7 @@ static void print_gpt_info(void)
                printf("Block size %lu, name %s\n", curr->gpt_part_info.blksz,
                       curr->gpt_part_info.name);
                printf("Type %s, bootable %d\n", curr->gpt_part_info.type,
-                      curr->gpt_part_info.bootable);
+                      curr->gpt_part_info.bootable & PART_BOOTABLE);
 #ifdef CONFIG_PARTITION_UUIDS
                printf("UUID %s\n", curr->gpt_part_info.uuid);
 #endif
@@ -535,7 +535,7 @@ static int set_gpt_info(struct blk_desc *dev_desc,
 
                /* bootable */
                if (found_key(tok, "bootable"))
-                       parts[i].bootable = 1;
+                       parts[i].bootable = PART_BOOTABLE;
        }
 
        *parts_count = p_count;
index 83ff40d310acd4d4936e669358708a63136190dc..813379f851ef500c928653d732c8a3bcfab59e02 100644 (file)
@@ -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 get_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;
 }
 
 static void print_one_part(dos_partition_t *p, lbaint_t ext_part_sector,
@@ -60,7 +66,7 @@ static void print_one_part(dos_partition_t *p, lbaint_t ext_part_sector,
                "u\t%08x-%02x\t%02x%s%s\n",
                part_num, lba_start, lba_size, disksig, part_num, p->sys_ind,
                (is_extended(p->sys_ind) ? " Extd" : ""),
-               (is_bootable(p) ? " Boot" : ""));
+               (get_bootable(p) ? " Boot" : ""));
 }
 
 static int test_block_type(unsigned char *buffer)
@@ -258,7 +264,7 @@ static int part_get_info_extended(struct blk_desc *dev_desc,
                                              (char *)info->name);
                        /* sprintf(info->type, "%d, pt->sys_ind); */
                        strcpy((char *)info->type, "U-Boot");
-                       info->bootable = is_bootable(pt);
+                       info->bootable = get_bootable(pt);
 #if CONFIG_IS_ENABLED(PARTITION_UUIDS)
                        sprintf(info->uuid, "%08x-%02x", disksig, part_num);
 #endif
index b2e157d9c1ec3aaf5dbc96ce5d67c7ef4c7f3d7b..83876a7bd979c2504abdb9deb1786190f79d2b3c 100644 (file)
@@ -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 get_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;
 }
 
 static int validate_gpt_header(gpt_header *gpt_h, lbaint_t lba,
@@ -286,7 +290,7 @@ int part_get_info_efi(struct blk_desc *dev_desc, int part,
        snprintf((char *)info->name, sizeof(info->name), "%s",
                 print_efiname(&gpt_pte[part - 1]));
        strcpy((char *)info->type, "U-Boot");
-       info->bootable = is_bootable(&gpt_pte[part - 1]);
+       info->bootable = get_bootable(&gpt_pte[part - 1]);
 #if CONFIG_IS_ENABLED(PARTITION_UUIDS)
        uuid_bin_to_str(gpt_pte[part - 1].unique_partition_guid.b, info->uuid,
                        UUID_STR_FORMAT_GUID);
@@ -501,7 +505,7 @@ int gpt_fill_pte(struct blk_desc *dev_desc,
                memset(&gpt_e[i].attributes, 0,
                       sizeof(gpt_entry_attributes));
 
-               if (partitions[i].bootable)
+               if (partitions[i].bootable & PART_BOOTABLE)
                        gpt_e[i].attributes.fields.legacy_bios_bootable = 1;
 
                /* partition name */
index 0b5cf3d5e813a3f4b35a52804bf7bdc74eb5a2b1..3693527397eca90467aa1c3137e81f97811284f5 100644 (file)
@@ -51,13 +51,22 @@ struct block_drvr {
 #define PART_TYPE_LEN 32
 #define MAX_SEARCH_PARTITIONS 64
 
+#define PART_BOOTABLE                  ((int)BIT(0))
+#define PART_EFI_SYSTEM_PARTITION      ((int)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