
Hello Nikita,
-----Original Message----- From: Nikita Kiryanov [mailto:nikita@compulab.co.il] Sent: Sunday, June 02, 2013 1:06 PM To: Piotr Wilczek Cc: u-boot@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 *dst; unsigned long len;void **alloc_addr)
@@ -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