disk: part_efi: add support for the Backup GPT

Check the Backup GPT table if the Primary GPT table is invalid.
Renamed "Secondary GPT" to "Backup GPT" as per:
  UEFI Specification (Version 2.3.1, Errata A)

Signed-off-by: Steve Rae <srae@broadcom.com>
This commit is contained in:
Steve Rae 2014-05-05 13:00:08 -07:00 committed by Tom Rini
parent fa39ffe5d6
commit ae95fad5af
2 changed files with 26 additions and 10 deletions

View File

@ -93,7 +93,15 @@ void print_part_efi(block_dev_desc_t * dev_desc)
if (is_gpt_valid(dev_desc, GPT_PRIMARY_PARTITION_TABLE_LBA, if (is_gpt_valid(dev_desc, GPT_PRIMARY_PARTITION_TABLE_LBA,
gpt_head, &gpt_pte) != 1) { gpt_head, &gpt_pte) != 1) {
printf("%s: *** ERROR: Invalid GPT ***\n", __func__); printf("%s: *** ERROR: Invalid GPT ***\n", __func__);
return; if (is_gpt_valid(dev_desc, (dev_desc->lba - 1),
gpt_head, &gpt_pte) != 1) {
printf("%s: *** ERROR: Invalid Backup GPT ***\n",
__func__);
return;
} else {
printf("%s: *** Using Backup GPT ***\n",
__func__);
}
} }
debug("%s: gpt-entry at %p\n", __func__, gpt_pte); debug("%s: gpt-entry at %p\n", __func__, gpt_pte);
@ -142,7 +150,15 @@ int get_partition_info_efi(block_dev_desc_t * dev_desc, int part,
if (is_gpt_valid(dev_desc, GPT_PRIMARY_PARTITION_TABLE_LBA, if (is_gpt_valid(dev_desc, GPT_PRIMARY_PARTITION_TABLE_LBA,
gpt_head, &gpt_pte) != 1) { gpt_head, &gpt_pte) != 1) {
printf("%s: *** ERROR: Invalid GPT ***\n", __func__); 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;
} else {
printf("%s: *** Using Backup GPT ***\n",
__func__);
}
} }
if (part > le32_to_cpu(gpt_head->num_partition_entries) || if (part > le32_to_cpu(gpt_head->num_partition_entries) ||
@ -252,7 +268,7 @@ int write_gpt_table(block_dev_desc_t *dev_desc,
!= pte_blk_cnt) != pte_blk_cnt)
goto err; goto err;
/* recalculate the values for the Second GPT Header */ /* recalculate the values for the Backup GPT Header */
val = le64_to_cpu(gpt_h->my_lba); val = le64_to_cpu(gpt_h->my_lba);
gpt_h->my_lba = gpt_h->alternate_lba; gpt_h->my_lba = gpt_h->alternate_lba;
gpt_h->alternate_lba = cpu_to_le64(val); gpt_h->alternate_lba = cpu_to_le64(val);

View File

@ -66,14 +66,14 @@ GPT brief explanation:
|Partition n | |Partition n |
| | | |
---------------------------------------------------------- ----------------------------------------------------------
LBA -34 |Entry 1|Entry 2| Entry 3| Entry 4| Secondary LBA -34 |Entry 1|Entry 2| Entry 3| Entry 4| Backup
-------------------------------------------------- (bkp) -------------------------------------------------- GPT
LBA -33 |Entries 5 - 128 | GPT LBA -33 |Entries 5 - 128 |
| | | |
| | | |
LBA -2 | | LBA -2 | |
-------------------------------------------------- --------------------------------------------------
LBA -1 |Secondary GPT Header | LBA -1 |Backup GPT Header |
---------------------------------------------------------- ----------------------------------------------------------
For a legacy reasons, GPT's LBA 0 sector has a MBR structure. It is called For a legacy reasons, GPT's LBA 0 sector has a MBR structure. It is called
@ -86,7 +86,7 @@ It is possible to define 128 linearly placed partition entries.
"LBA -1" means the last addressable block (in the mmc subsystem: "LBA -1" means the last addressable block (in the mmc subsystem:
"dev_desc->lba - 1") "dev_desc->lba - 1")
Primary/Secondary GPT header: Primary/Backup GPT header:
---------------------------- ----------------------------
Offset Size Description Offset Size Description
@ -115,7 +115,7 @@ IMPORTANT:
GPT headers and partition entries are protected by CRC32 (the POSIX CRC32). GPT headers and partition entries are protected by CRC32 (the POSIX CRC32).
Primary GPT header and Secondary GPT header have swapped values of "Current LBA" Primary GPT header and Backup GPT header have swapped values of "Current LBA"
and "Backup LBA" and therefore different CRC32 check-sum. and "Backup LBA" and therefore different CRC32 check-sum.
CRC32 for GPT headers (field "CRC of header") are calculated up till CRC32 for GPT headers (field "CRC of header") are calculated up till
@ -125,7 +125,7 @@ CRC32 for partition entries (field "CRC32 of partition array") is calculated for
the whole array entry ( Number_of_partition_entries * the whole array entry ( Number_of_partition_entries *
sizeof(partition_entry_size (usually 128))) sizeof(partition_entry_size (usually 128)))
Observe, how Secondary GPT is placed in the memory. It is NOT a mirror reflect Observe, how Backup GPT is placed in the memory. It is NOT a mirror reflect
of the Primary. of the Primary.
Partition Entry Format: Partition Entry Format: