mirror of
https://github.com/u-boot/u-boot.git
synced 2024-11-25 21:24:21 +08:00
gpt: part: Definition and declaration of GPT verification functions
This commit provides definition and declaration of GPT verification functions - namely gpt_verify_headers() and gpt_verify_partitions(). The former is used to only check CRC32 of GPT's header and PTEs. The latter examines each partition entry and compare attributes such as: name, start offset and size with ones provided at '$partitions' env variable. Signed-off-by: Lukasz Majewski <l.majewski@majess.pl> Reviewed-by: Tom Rini <trini@konsulko.com> Reviewed-by: Przemyslaw Marczak <p.marczak@samsung.com>
This commit is contained in:
parent
74f889b039
commit
cef68bf904
110
disk/part_efi.c
110
disk/part_efi.c
@ -578,6 +578,116 @@ err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void gpt_convert_efi_name_to_char(char *s, efi_char16_t *es, int n)
|
||||
{
|
||||
char *ess = (char *)es;
|
||||
int i, j;
|
||||
|
||||
memset(s, '\0', n);
|
||||
|
||||
for (i = 0, j = 0; j < n; i += 2, j++) {
|
||||
s[j] = ess[i];
|
||||
if (!ess[i])
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
int gpt_verify_headers(block_dev_desc_t *dev_desc, gpt_header *gpt_head,
|
||||
gpt_entry **gpt_pte)
|
||||
{
|
||||
/*
|
||||
* 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__);
|
||||
return -1;
|
||||
}
|
||||
if (is_gpt_valid(dev_desc, (dev_desc->lba - 1),
|
||||
gpt_head, gpt_pte) != 1) {
|
||||
printf("%s: *** ERROR: Invalid Backup GPT ***\n",
|
||||
__func__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int gpt_verify_partitions(block_dev_desc_t *dev_desc,
|
||||
disk_partition_t *partitions, int parts,
|
||||
gpt_header *gpt_head, gpt_entry **gpt_pte)
|
||||
{
|
||||
char efi_str[PARTNAME_SZ + 1];
|
||||
u64 gpt_part_size;
|
||||
gpt_entry *gpt_e;
|
||||
int ret, i;
|
||||
|
||||
ret = gpt_verify_headers(dev_desc, gpt_head, gpt_pte);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
gpt_e = *gpt_pte;
|
||||
|
||||
for (i = 0; i < parts; i++) {
|
||||
if (i == gpt_head->num_partition_entries) {
|
||||
error("More partitions than allowed!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Check if GPT and ENV partition names match */
|
||||
gpt_convert_efi_name_to_char(efi_str, gpt_e[i].partition_name,
|
||||
PARTNAME_SZ + 1);
|
||||
|
||||
debug("%s: part: %2d name - GPT: %16s, ENV: %16s ",
|
||||
__func__, i, efi_str, partitions[i].name);
|
||||
|
||||
if (strncmp(efi_str, (char *)partitions[i].name,
|
||||
sizeof(partitions->name))) {
|
||||
error("Partition name: %s does not match %s!\n",
|
||||
efi_str, (char *)partitions[i].name);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Check if GPT and ENV sizes match */
|
||||
gpt_part_size = le64_to_cpu(gpt_e[i].ending_lba) -
|
||||
le64_to_cpu(gpt_e[i].starting_lba) + 1;
|
||||
debug("size(LBA) - GPT: %8llu, ENV: %8llu ",
|
||||
gpt_part_size, (u64) partitions[i].size);
|
||||
|
||||
if (le64_to_cpu(gpt_part_size) != partitions[i].size) {
|
||||
error("Partition %s size: %llu does not match %llu!\n",
|
||||
efi_str, gpt_part_size, (u64) partitions[i].size);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Start address is optional - check only if provided
|
||||
* in '$partition' variable
|
||||
*/
|
||||
if (!partitions[i].start) {
|
||||
debug("\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Check if GPT and ENV start LBAs match */
|
||||
debug("start LBA - GPT: %8llu, ENV: %8llu\n",
|
||||
le64_to_cpu(gpt_e[i].starting_lba),
|
||||
(u64) partitions[i].start);
|
||||
|
||||
if (le64_to_cpu(gpt_e[i].starting_lba) != partitions[i].start) {
|
||||
error("Partition %s start: %llu does not match %llu!\n",
|
||||
efi_str, le64_to_cpu(gpt_e[i].starting_lba),
|
||||
(u64) partitions[i].start);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int is_valid_gpt_buf(block_dev_desc_t *dev_desc, void *buf)
|
||||
{
|
||||
gpt_header *gpt_h;
|
||||
|
@ -267,6 +267,41 @@ int is_valid_gpt_buf(block_dev_desc_t *dev_desc, void *buf);
|
||||
* @return - '0' on success, otherwise error
|
||||
*/
|
||||
int write_mbr_and_gpt_partitions(block_dev_desc_t *dev_desc, void *buf);
|
||||
|
||||
/**
|
||||
* gpt_verify_headers() - Function to read and CRC32 check of the GPT's header
|
||||
* and partition table entries (PTE)
|
||||
*
|
||||
* As a side effect if sets gpt_head and gpt_pte so they point to GPT data.
|
||||
*
|
||||
* @param dev_desc - block device descriptor
|
||||
* @param gpt_head - pointer to GPT header data read from medium
|
||||
* @param gpt_pte - pointer to GPT partition table enties read from medium
|
||||
*
|
||||
* @return - '0' on success, otherwise error
|
||||
*/
|
||||
int gpt_verify_headers(block_dev_desc_t *dev_desc, gpt_header *gpt_head,
|
||||
gpt_entry **gpt_pte);
|
||||
|
||||
/**
|
||||
* gpt_verify_partitions() - Function to check if partitions' name, start and
|
||||
* size correspond to '$partitions' env variable
|
||||
*
|
||||
* This function checks if on medium stored GPT data is in sync with information
|
||||
* provided in '$partitions' environment variable. Specificially, name, start
|
||||
* and size of the partition is checked.
|
||||
*
|
||||
* @param dev_desc - block device descriptor
|
||||
* @param partitions - partition data read from '$partitions' env variable
|
||||
* @param parts - number of partitions read from '$partitions' env variable
|
||||
* @param gpt_head - pointer to GPT header data read from medium
|
||||
* @param gpt_pte - pointer to GPT partition table enties read from medium
|
||||
*
|
||||
* @return - '0' on success, otherwise error
|
||||
*/
|
||||
int gpt_verify_partitions(block_dev_desc_t *dev_desc,
|
||||
disk_partition_t *partitions, int parts,
|
||||
gpt_header *gpt_head, gpt_entry **gpt_pte);
|
||||
#endif
|
||||
|
||||
#endif /* _PART_H */
|
||||
|
Loading…
Reference in New Issue
Block a user