[U-Boot] [PATCH V2] disk:efi: avoid unaligned access on efi partition

Tom Rini trini at ti.com
Wed Feb 19 16:03:50 CET 2014


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 02/19/2014 09:56 AM, Hector Palacios wrote:
> On 01/28/2014 01:46 PM, Piotr Wilczek wrote:
>> This patch fixes part_efi code to avoid unaligned access exception
>> on some ARM platforms.
>>
>> Signed-off-by: Piotr Wilczek <p.wilczek at samsung.com>
>> Signed-off-by: Kyungmin Park <kyungmin.park at samsung.com>
>> CC: Tom Rini <trini at ti.com>
>> CC: Albert ARIBAUD <albert.u.boot at aribaud.net>
>> ---
>> Chnages for V2:
>>   - used put_unaligned to copy value;
>>   - use __aligned to align local array;
>>
>>   disk/part_efi.c |    7 ++++---
>>   1 file changed, 4 insertions(+), 3 deletions(-)
>>
>> diff --git a/disk/part_efi.c b/disk/part_efi.c
>> index 9c33ae7..eb2cd57 100644
>> --- a/disk/part_efi.c
>> +++ b/disk/part_efi.c
>> @@ -225,7 +225,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;
>> +    put_unaligned(dev_desc->lba, &p_mbr->partition_record[0].nr_sects);
>>
>>       /* Write MBR sector to the MMC device */
>>       if (dev_desc->block_write(dev_desc->dev, 0, 1, p_mbr) != 1) {
>> @@ -361,6 +361,8 @@ int gpt_fill_pte(gpt_header *gpt_h, gpt_entry *gpt_e,
>>   #ifdef CONFIG_PARTITION_UUIDS
>>       char *str_uuid;
>>   #endif
>> +    static efi_guid_t basic_guid __aligned(0x04) =
>> +        PARTITION_BASIC_DATA_GUID;
>>
>>       for (i = 0; i < parts; i++) {
>>           /* partition starting lba */
>> @@ -388,8 +390,7 @@ int gpt_fill_pte(gpt_header *gpt_h, gpt_entry *gpt_e,
>>               gpt_e[i].ending_lba = cpu_to_le64(offset - 1);
>>
>>           /* partition type GUID */
>> -        memcpy(gpt_e[i].partition_type_guid.b,
>> -            &PARTITION_BASIC_DATA_GUID, 16);
>> +        gpt_e[i].partition_type_guid = basic_guid;
>>
>>   #ifdef CONFIG_PARTITION_UUIDS
>>           str_uuid = partitions[i].uuid;
>>
> 
> Sorry, I sent my tested-by on a different thread:
> http://patchwork.ozlabs.org/patch/319649/
> 
> Tested on i.MX6 (armv7) custom board and it is working fine without
> the -mno-unaligned-access flag.
> 
> Tested-by: Hector Palacios <hector.palacios at digi.com>
> 
> Replying to Tom's question in that other thread, regarding the issue:
> 
>> Can you give me some steps on how to hit this bug?  I believe it's a bug
>> and I believe we need to fix it, I just want to investigate a few things
>> while we've got a trigger case right now.  Thanks!
> 
> GPT partition table needs to write a protective MBR to sector 0.
> The MBR structure has four partition entries (each occupying 16 bytes)
> at unaligned offsets +1BEh, +1CEh, +1DEh, +1EEh (see [1]). The structure
> of each partition entry is defined at include/part_efi.h
> 
> struct partition {
>     u8 boot_ind;        /* 0x80 - active */
>     u8 head;        /* starting head */
>     u8 sector;        /* starting sector */
>     u8 cyl;            /* starting cylinder */
>     u8 sys_ind;        /* What partition type */
>     u8 end_head;        /* end head */
>     u8 end_sector;        /* end sector */
>     u8 end_cyl;        /* end cylinder */
>     __le32 start_sect;    /* starting sector counting from 0 */
>     __le32 nr_sects;    /* nr of sectors in partition */
> } __packed;
> 
> showing eight 1-byte fields and two 4-byte fields. Since the offsets for
> each partition entry are unaligned, the last two fields (which are
> 32bit) are unaligned as well. But it's not an error, it's just the
> specification of the MBR requires these fields to be at those exact
> offsets. So the usage of unaligned macros for accessing those fields is
> justified.

Right.  I would have sworn I used the GPT commands since we've dropped
- -mno-unaligned-access but I'll just go re-test locally now then, thanks.

- -- 
Tom
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/

iQIcBAEBAgAGBQJTBMfWAAoJENk4IS6UOR1Wm/IP/1sOKxdJvLljPxOQ5myKhT0k
PWFMVuN9ZomSkr9+yYt87cVtz28OV42dqVIig7i96TYbzA19AxWY6jWVlPxlmbAZ
0qIwILgogtytJPDad/4NMWXy8GyHP6f9iYIui/DRImsZaErSek+egEshf46M5oyH
0Fd6H/HcpLlJ1QydN1jQzKSppS3HadlwVKEQqC2vN2WjKv3li/m84xoSdiNty2Lj
WgqEBOTfbS5dYQub72WiiaCvs2QVBAP2jRk1Lmtu/gj/L5Av0uc+J8JFV6+Un+Tt
VNUKigG8PdLonex6gCOwpULX6Lft+9x0YWJXIp0ow3JFStpxbHPgMqqKkVyC7Jgp
n14dHO4mG5ZdT2m0y/Tyu1sg7tllTPtW2k+GBsRa8vnOzHq11I6/wQ712S6BK4aB
jjuQsxOoxbGSzMEpMrotf4knc0tuL72Lh46Lz1ksRZNdu7NGOAO+DjGuXnzKn8H4
oEB6aFEewaMV8o2XBNaMddMg8MyPtVC4qZiN2uuMMKjxkTukKUCV9xCl9YkJLAV2
oXdVtEoczjWY6made42olvTeev5R1NDD1ex63q0sZIylJQrQSjMju+1PpQQxAwAh
/Kv5xn+13JtX7eaHY2oogHRLmLB5Cp2EUwg/ZVzArNTnlVdzOsr72v7BLi/fz6T2
NA5qIFUntQunN2OweEE+
=32uL
-----END PGP SIGNATURE-----


More information about the U-Boot mailing list