cmd:gpt: randomly generate each partition uuid if undefined
Changes: - randomly generate partition uuid if any is undefined and CONFIG_RAND_UUID is defined - print debug info about set/unset/generated uuid - update doc/README.gpt Signed-off-by: Przemyslaw Marczak <p.marczak@samsung.com> Acked-by: Lukasz Majewski <l.majewski@samsung.com> Cc: Piotr Wilczek <p.wilczek@samsung.com> Cc: Tom Rini <trini@ti.com> Cc: Stephen Warren <swarren@nvidia.com> Cc: Lukasz Majewski <l.majewski@samsung.com>
This commit is contained in:
parent
89c8230dec
commit
39206382de
|
@ -29,30 +29,53 @@
|
||||||
*
|
*
|
||||||
* @return - zero on successful expand and env is set
|
* @return - zero on successful expand and env is set
|
||||||
*/
|
*/
|
||||||
static char extract_env(const char *str, char **env)
|
static int extract_env(const char *str, char **env)
|
||||||
{
|
{
|
||||||
|
int ret = -1;
|
||||||
char *e, *s;
|
char *e, *s;
|
||||||
|
#ifdef CONFIG_RANDOM_UUID
|
||||||
|
char uuid_str[UUID_STR_LEN + 1];
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!str || strlen(str) < 4)
|
if (!str || strlen(str) < 4)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if ((strncmp(str, "${", 2) == 0) && (str[strlen(str) - 1] == '}')) {
|
if (!((strncmp(str, "${", 2) == 0) && (str[strlen(str) - 1] == '}')))
|
||||||
s = strdup(str);
|
return -1;
|
||||||
if (s == NULL)
|
|
||||||
return -1;
|
s = strdup(str);
|
||||||
memset(s + strlen(s) - 1, '\0', 1);
|
if (s == NULL)
|
||||||
memmove(s, s + 2, strlen(s) - 1);
|
return -1;
|
||||||
|
|
||||||
|
memset(s + strlen(s) - 1, '\0', 1);
|
||||||
|
memmove(s, s + 2, strlen(s) - 1);
|
||||||
|
|
||||||
|
e = getenv(s);
|
||||||
|
if (e == NULL) {
|
||||||
|
#ifdef CONFIG_RANDOM_UUID
|
||||||
|
debug("%s unset. ", str);
|
||||||
|
gen_rand_uuid_str(uuid_str, UUID_STR_FORMAT_STD);
|
||||||
|
setenv(s, uuid_str);
|
||||||
|
|
||||||
e = getenv(s);
|
e = getenv(s);
|
||||||
free(s);
|
if (e) {
|
||||||
if (e == NULL) {
|
debug("Set to random.\n");
|
||||||
printf("Environmental '%s' not set\n", str);
|
ret = 0;
|
||||||
return -1; /* env not set */
|
} else {
|
||||||
|
debug("Can't get random UUID.\n");
|
||||||
}
|
}
|
||||||
*env = e;
|
#else
|
||||||
return 0;
|
debug("%s unset.\n", str);
|
||||||
|
#endif
|
||||||
|
} else {
|
||||||
|
debug("%s get from environment.\n", str);
|
||||||
|
ret = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
*env = e;
|
||||||
|
free(s);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -299,8 +322,16 @@ static int do_gpt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||||
return CMD_RET_FAILURE;
|
return CMD_RET_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gpt_default(blk_dev_desc, argv[4]))
|
puts("Writing GPT: ");
|
||||||
|
|
||||||
|
ret = gpt_default(blk_dev_desc, argv[4]);
|
||||||
|
if (!ret) {
|
||||||
|
puts("success!\n");
|
||||||
|
return CMD_RET_SUCCESS;
|
||||||
|
} else {
|
||||||
|
puts("error!\n");
|
||||||
return CMD_RET_FAILURE;
|
return CMD_RET_FAILURE;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
return CMD_RET_USAGE;
|
return CMD_RET_USAGE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -132,8 +132,8 @@ of the Primary.
|
||||||
----------------------
|
----------------------
|
||||||
Offset Size Description
|
Offset Size Description
|
||||||
|
|
||||||
0 16 B Partition type GUID
|
0 16 B Partition type GUID (Big Endian)
|
||||||
16 16 B Unique partition GUID
|
16 16 B Unique partition GUID in (Big Endian)
|
||||||
32 8 B First LBA (Little Endian)
|
32 8 B First LBA (Little Endian)
|
||||||
40 8 B Last LBA (inclusive)
|
40 8 B Last LBA (inclusive)
|
||||||
48 8 B Attribute flags [+]
|
48 8 B Attribute flags [+]
|
||||||
|
@ -160,6 +160,9 @@ To restore GUID partition table one needs to:
|
||||||
Fields 'name', 'size' and 'uuid' are mandatory for every partition.
|
Fields 'name', 'size' and 'uuid' are mandatory for every partition.
|
||||||
The field 'start' is optional.
|
The field 'start' is optional.
|
||||||
|
|
||||||
|
option: CONFIG_RANDOM_UUID
|
||||||
|
If any partition "UUID" no exists then it is randomly generated.
|
||||||
|
|
||||||
2. Define 'CONFIG_EFI_PARTITION' and 'CONFIG_CMD_GPT'
|
2. Define 'CONFIG_EFI_PARTITION' and 'CONFIG_CMD_GPT'
|
||||||
|
|
||||||
2. From u-boot prompt type:
|
2. From u-boot prompt type:
|
||||||
|
@ -168,11 +171,20 @@ To restore GUID partition table one needs to:
|
||||||
Useful info:
|
Useful info:
|
||||||
============
|
============
|
||||||
|
|
||||||
Two programs, namely: 'fdisk' and 'parted' are recommended to work with GPT
|
Two programs, namely: 'gdisk' and 'parted' are recommended to work with GPT
|
||||||
recovery. Parted is able to handle GUID partitions. Unfortunately the 'fdisk'
|
recovery. Both are able to handle GUID partitions.
|
||||||
hasn't got such ability.
|
|
||||||
Please, pay attention at -l switch for parted.
|
Please, pay attention at -l switch for parted.
|
||||||
|
|
||||||
"uuid" program is recommended to generate UUID string. Moreover it can decode
|
"uuid" program is recommended to generate UUID string. Moreover it can decode
|
||||||
(-d switch) passed in UUID string. It can be used to generate partitions UUID
|
(-d switch) passed in UUID string. It can be used to generate partitions UUID
|
||||||
passed to u-boot environment variables.
|
passed to u-boot environment variables.
|
||||||
|
If optional CONFIG_RANDOM_UUID is defined then for any partition which environment
|
||||||
|
uuid is unset, uuid is randomly generated and stored in correspond environment
|
||||||
|
variable.
|
||||||
|
|
||||||
|
note:
|
||||||
|
Each string block of UUID generated by program "uuid" is in big endian and it is
|
||||||
|
also stored in big endian in disk GPT.
|
||||||
|
Partitions layout can be printed by typing "mmc part". Note that each partition
|
||||||
|
GUID has different byte order than UUID generated before, this is because first
|
||||||
|
three blocks of GUID string are in Little Endian.
|
||||||
|
|
|
@ -251,5 +251,5 @@ U_BOOT_CMD(guid, CONFIG_SYS_MAXARGS, 1, do_uuid,
|
||||||
"varname: for set result in a environment variable\n"
|
"varname: for set result in a environment variable\n"
|
||||||
"e.g. guid guid_env"
|
"e.g. guid guid_env"
|
||||||
);
|
);
|
||||||
#endif
|
#endif /* CONFIG_CMD_UUID */
|
||||||
#endif
|
#endif /* CONFIG_RANDOM_UUID || CONFIG_CMD_UUID */
|
||||||
|
|
Loading…
Reference in New Issue