Skip to content
Snippets Groups Projects
Commit ec4d8c1c authored by Nikita V. Youshchenko's avatar Nikita V. Youshchenko Committed by Wolfgang Denk
Browse files

fsl_diu: fix alignment error that caused malloc corruption


When aligning malloc()ed screen_base, invalid offset was added.
This not only caused misaligned result (which did not cause hardware
misbehaviour), but - worse - caused screen_base + smem_len to
be out of malloc()ed space, which in turn caused breakage of
futher malloc()/free() operation.

This patch fixes screen_base alignment.

Also this patch makes memset() that cleans framebuffer to be executed
on first initialization of diu, not only on re-initialization. It looks
correct to clean the framebuffer instead of displaying random garbage;
I believe that was disabled only because that memset caused breakage
of malloc/free described above - which no longer happens with the fix
described above.

Signed-off-by: default avatarNikita V. Youshchenko <yoush@debian.org>
parent 3d0ea311
No related branches found
No related tags found
No related merge requests found
...@@ -242,10 +242,10 @@ int fsl_diu_init(int xres, ...@@ -242,10 +242,10 @@ int fsl_diu_init(int xres,
printf("Unable to allocate fb memory 1\n"); printf("Unable to allocate fb memory 1\n");
return -1; return -1;
} }
} else {
memset(info->screen_base, 0, info->smem_len);
} }
memset(info->screen_base, 0, info->smem_len);
dr.diu_reg->desc[0] = (unsigned int) &dummy_ad; dr.diu_reg->desc[0] = (unsigned int) &dummy_ad;
dr.diu_reg->desc[1] = (unsigned int) &dummy_ad; dr.diu_reg->desc[1] = (unsigned int) &dummy_ad;
dr.diu_reg->desc[2] = (unsigned int) &dummy_ad; dr.diu_reg->desc[2] = (unsigned int) &dummy_ad;
...@@ -403,7 +403,7 @@ static int map_video_memory(struct fb_info *info, unsigned long bytes_align) ...@@ -403,7 +403,7 @@ static int map_video_memory(struct fb_info *info, unsigned long bytes_align)
mask = bytes_align - 1; mask = bytes_align - 1;
offset = (unsigned long)info->screen_base & mask; offset = (unsigned long)info->screen_base & mask;
if (offset) { if (offset) {
info->screen_base += offset; info->screen_base += (bytes_align - offset);
info->smem_len = info->smem_len - (bytes_align - offset); info->smem_len = info->smem_len - (bytes_align - offset);
} else } else
info->smem_len = info->smem_len - bytes_align; info->smem_len = info->smem_len - bytes_align;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment