[U-Boot] [PATCH] lcd: align bmp header when uncopmressing image
Piotr Wilczek
p.wilczek at samsung.com
Mon Jun 3 08:39:24 CEST 2013
Hello Nikita,
> -----Original Message-----
> From: Nikita Kiryanov [mailto:nikita at compulab.co.il]
> Sent: Sunday, June 02, 2013 1:06 PM
> To: Piotr Wilczek
> Cc: u-boot at lists.denx.de; Kyungmin Park
> Subject: Re: [U-Boot] [PATCH] lcd: align bmp header when uncopmressing
> image
>
> Hello Piotr,
>
> On 05/31/2013 02:26 PM, Piotr Wilczek wrote:
> > -bmp_image_t *gunzip_bmp(unsigned long addr, unsigned long *lenp)
> > +bmp_image_t *gunzip_bmp(unsigned long addr, unsigned long *lenp,
> > + void **alloc_addr)
> > {
> > void *dst;
> > unsigned long len;
> > @@ -60,7 +65,14 @@ bmp_image_t *gunzip_bmp(unsigned long addr,
> unsigned long *lenp)
> > puts("Error: malloc in gunzip failed!\n");
> > return NULL;
> > }
> > - if (gunzip(dst, CONFIG_SYS_VIDEO_LOGO_MAX_SIZE, (uchar *)addr,
> &len) != 0) {
> > +
> > + bmp = dst;
> > +
> > + /* align to 32-bit-aligned-address + 2 */
> > + if ((unsigned int)bmp % 0x04 != 0x02)
> > + bmp = (bmp_image_t *)(((unsigned int)dst + 0x02) & ~0x01);
>
> This is wrong. Suppose that bmp % 4 == 3, then (dst + 2) % 4 == 1, and
> thus ((dst + 2) & ~1) % 4 == 0, which is not an aligned+2 address.
>
You are right but here I'm aligning a pointer returned by malloc which is
guaranteed to be aligned to 8 bytes. In fact it is sufficient only to add
two bytes.
Anyway, to make the code universal I provide a better alignment method.
> > +
> > + if (gunzip(bmp, CONFIG_SYS_VIDEO_LOGO_MAX_SIZE, (uchar *)addr,
> &len)
> > +!= 0) {
> > free(dst);
> > return NULL;
> > }
> > @@ -68,8 +80,6 @@ bmp_image_t *gunzip_bmp(unsigned long addr,
> unsigned long *lenp)
> > puts("Image could be truncated"
> > " (increase
> CONFIG_SYS_VIDEO_LOGO_MAX_SIZE)!\n");
> >
>
> --
> Regards,
> Nikita.
Best regards,
Piotr
More information about the U-Boot
mailing list