GPT: add accessor function for disk GUID

In order to read the GPT, modify the partition name strings, and then
write out a new GPT, the disk GUID is needed.  While there is an
existing accessor for the partition UUIDs, there is none yet for the
disk GUID.

Changes since v6: none.

Signed-off-by: Alison Chaiken <alison@peloton-tech.com>
This commit is contained in:
Alison Chaiken 2017-06-25 16:43:23 -07:00 committed by Tom Rini
parent e6faf21f25
commit 73d6d18b71
4 changed files with 74 additions and 1 deletions

View File

@ -398,6 +398,23 @@ static int gpt_verify(struct blk_desc *blk_dev_desc, const char *str_part)
return ret; return ret;
} }
static int do_disk_guid(struct blk_desc *dev_desc, char * const namestr)
{
int ret;
char disk_guid[UUID_STR_LEN + 1];
ret = get_disk_guid(dev_desc, disk_guid);
if (ret < 0)
return CMD_RET_FAILURE;
if (namestr)
setenv(namestr, disk_guid);
else
printf("%s\n", disk_guid);
return ret;
}
/** /**
* do_gpt(): Perform GPT operations * do_gpt(): Perform GPT operations
* *
@ -436,6 +453,8 @@ static int do_gpt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
} else if ((strcmp(argv[1], "verify") == 0)) { } else if ((strcmp(argv[1], "verify") == 0)) {
ret = gpt_verify(blk_dev_desc, argv[4]); ret = gpt_verify(blk_dev_desc, argv[4]);
printf("Verify GPT: "); printf("Verify GPT: ");
} else if (strcmp(argv[1], "guid") == 0) {
ret = do_disk_guid(blk_dev_desc, argv[4]);
} else { } else {
return CMD_RET_USAGE; return CMD_RET_USAGE;
} }
@ -458,4 +477,11 @@ U_BOOT_CMD(gpt, CONFIG_SYS_MAXARGS, 1, do_gpt,
" Example usage:\n" " Example usage:\n"
" gpt write mmc 0 $partitions\n" " gpt write mmc 0 $partitions\n"
" gpt verify mmc 0 $partitions\n" " gpt verify mmc 0 $partitions\n"
" guid <interface> <dev>\n"
" - print disk GUID\n"
" guid <interface> <dev> <varname>\n"
" - set environment variable to disk GUID\n"
" Example usage:\n"
" gpt guid mmc 0\n"
" gpt guid mmc 0 varname\n"
); );

View File

@ -178,6 +178,37 @@ static void prepare_backup_gpt_header(gpt_header *gpt_h)
* Public Functions (include/part.h) * Public Functions (include/part.h)
*/ */
/*
* UUID is displayed as 32 hexadecimal digits, in 5 groups,
* separated by hyphens, in the form 8-4-4-4-12 for a total of 36 characters
*/
int get_disk_guid(struct blk_desc * dev_desc, char *guid)
{
ALLOC_CACHE_ALIGN_BUFFER_PAD(gpt_header, gpt_head, 1, dev_desc->blksz);
gpt_entry *gpt_pte = NULL;
unsigned char *guid_bin;
/* This function validates AND fills in the GPT header and PTE */
if (is_gpt_valid(dev_desc, GPT_PRIMARY_PARTITION_TABLE_LBA,
gpt_head, &gpt_pte) != 1) {
printf("%s: *** ERROR: Invalid GPT ***\n", __func__);
if (is_gpt_valid(dev_desc, dev_desc->lba - 1,
gpt_head, &gpt_pte) != 1) {
printf("%s: *** ERROR: Invalid Backup GPT ***\n",
__func__);
return -EINVAL;
} else {
printf("%s: *** Using Backup GPT ***\n",
__func__);
}
}
guid_bin = gpt_head->disk_guid.b;
uuid_bin_to_str(guid_bin, guid, UUID_STR_FORMAT_GUID);
return 0;
}
void part_print_efi(struct blk_desc *dev_desc) void part_print_efi(struct blk_desc *dev_desc)
{ {
ALLOC_CACHE_ALIGN_BUFFER_PAD(gpt_header, gpt_head, 1, dev_desc->blksz); ALLOC_CACHE_ALIGN_BUFFER_PAD(gpt_header, gpt_head, 1, dev_desc->blksz);

View File

@ -171,7 +171,8 @@ To restore GUID partition table one needs to:
The fields 'uuid' and 'uuid_disk' are optional if CONFIG_RANDOM_UUID is 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/ 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 non-existent environment variable. The environment variable will be set to
the generated UUID. the generated UUID. The 'gpt guid' command reads the current value of the
uuid_disk from the GPT.
The field 'bootable' is optional, it is used to mark the GPT partition The field 'bootable' is optional, it is used to mark the GPT partition
bootable (set attribute flags "Legacy BIOS bootable"). bootable (set attribute flags "Legacy BIOS bootable").

View File

@ -372,6 +372,21 @@ int gpt_verify_headers(struct blk_desc *dev_desc, gpt_header *gpt_head,
int gpt_verify_partitions(struct blk_desc *dev_desc, int gpt_verify_partitions(struct blk_desc *dev_desc,
disk_partition_t *partitions, int parts, disk_partition_t *partitions, int parts,
gpt_header *gpt_head, gpt_entry **gpt_pte); gpt_header *gpt_head, gpt_entry **gpt_pte);
/**
* get_disk_guid() - Function to read the GUID string from a device's GPT
*
* This function reads the GUID string from a block device whose descriptor
* is provided.
*
* @param dev_desc - block device descriptor
* @param guid - pre-allocated string in which to return the GUID
*
* @return - '0' on success, otherwise error
*/
int get_disk_guid(struct blk_desc *dev_desc, char *guid);
#endif #endif
#if CONFIG_IS_ENABLED(DOS_PARTITION) #if CONFIG_IS_ENABLED(DOS_PARTITION)