diff mbox

[U-Boot] gpt: Fix the protective MBR partition size

Message ID 1420716404-710-1-git-send-email-maxime.ripard@free-electrons.com
State Accepted
Delegated to: Tom Rini
Headers show

Commit Message

Maxime Ripard Jan. 8, 2015, 11:26 a.m. UTC
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.

Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
---
 disk/part_efi.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Steve Rae Jan. 8, 2015, 9:23 p.m. UTC | #1
(+ Lukasz)
Interesting - I'll defer to Lukasz...
Thanks, Steve

On 15-01-08 03:26 AM, Maxime Ripard wrote:
> 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.
>
> Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
> ---
>   disk/part_efi.c | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/disk/part_efi.c b/disk/part_efi.c
> index 612f0926b62b..5ca17c138e96 100644
> --- a/disk/part_efi.c
> +++ b/disk/part_efi.c
> @@ -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) {
>
Tom Rini Jan. 9, 2015, 1:34 p.m. UTC | #2
On Thu, Jan 08, 2015 at 12:26:44PM +0100, Maxime Ripard wrote:

> 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.
> 
> Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>

Applied to u-boot/master, thanks!
Ɓukasz Majewski Jan. 13, 2015, 8:36 a.m. UTC | #3
Hi Steve,

> (+ 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


> 
> On 15-01-08 03:26 AM, Maxime Ripard wrote:
> > 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.
> >
> > Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
> > ---
> >   disk/part_efi.c | 2 +-
> >   1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/disk/part_efi.c b/disk/part_efi.c
> > index 612f0926b62b..5ca17c138e96 100644
> > --- a/disk/part_efi.c
> > +++ b/disk/part_efi.c
> > @@ -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) {
> >
diff mbox

Patch

diff --git a/disk/part_efi.c b/disk/part_efi.c
index 612f0926b62b..5ca17c138e96 100644
--- a/disk/part_efi.c
+++ b/disk/part_efi.c
@@ -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) {