diff --git a/common/cmd_gpt.c b/common/cmd_gpt.c index 460809c..d94d553 100644 --- a/common/cmd_gpt.c +++ b/common/cmd_gpt.c @@ -122,6 +122,40 @@ static char *extract_val(const char *str, const char *key) } /** + * found_key(): Found key without value in parameter list (comma separated). + * + * @param str - pointer to string with key + * @param key - pointer to the key to search for + * + * @return - true on found key + */ +static bool found_key(const char *str, const char *key) +{ + char *k; + char *s, *strcopy; + bool result = false; + + strcopy = strdup(str); + if (!strcopy) + return NULL; + + s = strcopy; + while (s) { + k = strsep(&s, ","); + if (!k) + break; + if (strcmp(k, key) == 0) { + result = true; + break; + } + } + + free(strcopy); + + return result; +} + +/** * set_gpt_info(): Fill partition information from string * function allocates memory, remember to free! * @@ -275,6 +309,10 @@ static int set_gpt_info(block_dev_desc_t *dev_desc, parts[i].start = lldiv(start_ll, dev_desc->blksz); free(val); } + + /* bootable */ + if (found_key(tok, "bootable")) + parts[i].bootable = 1; } *parts_count = p_count; diff --git a/disk/part_efi.c b/disk/part_efi.c index 40f0b36..b1e0155 100644 --- a/disk/part_efi.c +++ b/disk/part_efi.c @@ -493,6 +493,9 @@ int gpt_fill_pte(gpt_header *gpt_h, gpt_entry *gpt_e, memset(&gpt_e[i].attributes, 0, sizeof(gpt_entry_attributes)); + if (partitions[i].bootable) + gpt_e[i].attributes.fields.legacy_bios_bootable = 1; + /* partition name */ efiname_len = sizeof(gpt_e[i].partition_name) / sizeof(efi_char16_t); diff --git a/doc/README.gpt b/doc/README.gpt index db439f9..a6f6de6 100644 --- a/doc/README.gpt +++ b/doc/README.gpt @@ -142,6 +142,10 @@ of the Primary. Attribute flags: Bit 0 - System partition + Bit 1 - Hide from EFI + Bit 2 - Legacy BIOS bootable + Bit 48-63 - Defined and used by the individual partition type + For Basic data partition : Bit 60 - Read-only Bit 62 - Hidden Bit 63 - Not mount @@ -161,11 +165,21 @@ To restore GUID partition table one needs to: The fields 'name' and 'size' are mandatory for every partition. The field 'start' is optional. + If field 'size' of the last partition is 0, the partiton is extended + up to the end of the device. + The fields 'uuid' and 'uuid_disk' are optional if CONFIG_RANDOM_UUID is enabled. A random uuid will be used if omitted or they point to an empty/ non-existent environment variable. The environment variable will be set to the generated UUID. + The field 'bootable' is optional, it is used to mark the GPT partition + bootable (set attribute flags "Legacy BIOS bootable"). + "name=u-boot,size=60MiB;name=boot,size=60Mib,bootable;name=rootfs,size=0" + It can be used to locate bootable disks with command + "part list -bootable ", + please check out doc/README.distro for use. + 2. Define 'CONFIG_EFI_PARTITION' and 'CONFIG_CMD_GPT' 3. From u-boot prompt type: