[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