[U-Boot] [PATCH] lcd: align bmp header when uncopmressing image

Nikita Kiryanov nikita at compulab.co.il
Sun Jun 2 13:05:44 CEST 2013


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.

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


More information about the U-Boot mailing list