提交 73d6d18b 编写于 作者: A Alison Chaiken 提交者: Tom Rini

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: NAlison Chaiken <alison@peloton-tech.com>
上级 e6faf21f
...@@ -398,6 +398,23 @@ static int gpt_verify(struct blk_desc *blk_dev_desc, const char *str_part) ...@@ -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[]) ...@@ -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, ...@@ -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"
); );
...@@ -178,6 +178,37 @@ static void prepare_backup_gpt_header(gpt_header *gpt_h) ...@@ -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);
......
...@@ -171,7 +171,8 @@ To restore GUID partition table one needs to: ...@@ -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").
......
...@@ -372,6 +372,21 @@ int gpt_verify_headers(struct blk_desc *dev_desc, gpt_header *gpt_head, ...@@ -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)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册