Skip to contentSkip to conversation

gpt: Fix the protective MBR partition size

PATCH In review Maxime Ripard 4 participants 4 messages Jan 8, 2015 – Jan 13, 2015

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 gpt: Fix the protective MBR partition size

According to the UEFI Spec (Table 16, section 5.2.3 of the version 2.4 Errata B), the protective MBR partition record size must be set to the size of the disk minus one, in LBAs.

However, the current code was setting the size as the total number of LBAs on the disk, resulting in an off-by-one error.

This confused the AM335x ROM code, and will probably confuse other tools as well.

---
 disk/part_efi.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
disk/part_efi.c +1 -1
index 612f0926b62b..5ca17c138e96 100644
@@ -240,7 +240,7 @@ static int set_protective_mbr(block_dev_desc_t *dev_desc)
 	p_mbr->signature = MSDOS_MBR_SIGNATURE;
 	p_mbr->partition_record[0].sys_ind = EFI_PMBR_OSTYPE_EFI_GPT;
 	p_mbr->partition_record[0].start_sect = 1;
-	p_mbr->partition_record[0].nr_sects = (u32) dev_desc->lba;
+	p_mbr->partition_record[0].nr_sects = (u32) dev_desc->lba - 1;
 
 	/* Write MBR sector to the MMC device */
 	if (dev_desc->block_write(dev_desc->dev, 0, 1, p_mbr) != 1) {
Signature · 1 line
2.2.1
#1 lore raw

PATCH 1/1 gpt: Fix the protective MBR partition size

(+ Lukasz)
Interesting - I'll defer to Lukasz...
Thanks, Steve

Quoted 29 lines · Maxime Ripard

According to the UEFI Spec (Table 16, section 5.2.3 of the version 2.4 Errata B), the protective MBR partition record size must be set to the size of the disk minus one, in LBAs.

However, the current code was setting the size as the total number of LBAs on the disk, resulting in an off-by-one error.

This confused the AM335x ROM code, and will probably confuse other tools as well.

---
  disk/part_efi.c | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
disk/part_efi.c +1 -1
index 612f0926b62b..5ca17c138e96 100644
@@ -240,7 +240,7 @@ static int set_protective_mbr(block_dev_desc_t *dev_desc)
  	p_mbr->signature = MSDOS_MBR_SIGNATURE;
  	p_mbr->partition_record[0].sys_ind = EFI_PMBR_OSTYPE_EFI_GPT;
  	p_mbr->partition_record[0].start_sect = 1;
-	p_mbr->partition_record[0].nr_sects = (u32) dev_desc->lba;
+	p_mbr->partition_record[0].nr_sects = (u32) dev_desc->lba - 1;
 
  	/* Write MBR sector to the MMC device */
  	if (dev_desc->block_write(dev_desc->dev, 0, 1, p_mbr) != 1) {
#2 lore raw

PATCH 1/1 gpt: Fix the protective MBR partition size

Hi Steve,

Quoted 3 lines

(+ Lukasz)
Interesting - I'll defer to Lukasz...
Thanks, Steve

Thanks guys for spotting the mistake and sorry for a late reply (holidays time).

I'm glad that this patch was included to v2015.01

Quoted 33 lines · Maxime Ripard
Quoted 31 lines

According to the UEFI Spec (Table 16, section 5.2.3 of the version 2.4 Errata B), the protective MBR partition record size must be set to the size of the disk minus one, in LBAs.

However, the current code was setting the size as the total number of LBAs on the disk, resulting in an off-by-one error.

This confused the AM335x ROM code, and will probably confuse other tools as well.

---
  disk/part_efi.c | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
disk/part_efi.c +1 -2
index 612f0926b62b..5ca17c138e96 100644
@@ -240,7 +240,7 @@ static int set_protective_mbr(block_dev_desc_t
 *dev_desc) p_mbr->signature = MSDOS_MBR_SIGNATURE;
  	p_mbr->partition_record[0].sys_ind =
 EFI_PMBR_OSTYPE_EFI_GPT; p_mbr->partition_record[0].start_sect = 1;
-	p_mbr->partition_record[0].nr_sects = (u32) dev_desc->lba;
+	p_mbr->partition_record[0].nr_sects = (u32) dev_desc->lba
- 1;
 
  	/* Write MBR sector to the MMC device */
  	if (dev_desc->block_write(dev_desc->dev, 0, 1, p_mbr) !=

1) {

Signature · 5 lines
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group
#3 lore raw
In reply to Maxime Ripard
Quoted 11 lines · Maxime Ripard

According to the UEFI Spec (Table 16, section 5.2.3 of the version 2.4 Errata B), the protective MBR partition record size must be set to the size of the disk minus one, in LBAs.

However, the current code was setting the size as the total number of LBAs on the disk, resulting in an off-by-one error.

This confused the AM335x ROM code, and will probably confuse other tools as well.

Applied to u-boot/master, thanks!

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20150109/9aa3b759/attachment.pgp>