If the BMP headers are located in unaligned addresses, accessing them directly may lead to a data abort on some architectures. Use the safer bmp_layout API instead.
Signed-off-by: Nikita Kiryanov <[email protected]> Signed-off-by: Igor Grinberg <[email protected]> Cc: Anatolij Gustschin <[email protected]> Cc: Wolfgang Denk <[email protected]> Cc: Albert ARIBAUD <[email protected]> Cc: Jeroen Hofstee <[email protected]> --- drivers/video/cfb_console.c | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/drivers/video/cfb_console.c b/drivers/video/cfb_console.c index 26f673a..6d4e2c5 100644 --- a/drivers/video/cfb_console.c +++ b/drivers/video/cfb_console.c @@ -1446,8 +1446,7 @@ int video_display_bitmap(ulong bmp_image, int x, int y) WATCHDOG_RESET(); - if (!((bmp->header.signature[0] == 'B') && - (bmp->header.signature[1] == 'M'))) { + if (!bmp_signature_valid(bmp)) { #ifdef CONFIG_VIDEO_BMP_GZIP /* @@ -1477,8 +1476,7 @@ int video_display_bitmap(ulong bmp_image, int x, int y) */ bmp = (bmp_image_t *) dst; - if (!((bmp->header.signature[0] == 'B') && - (bmp->header.signature[1] == 'M'))) { + if (!bmp_signature_valid(bmp)) { printf("Error: no valid bmp.gz image at %lx\n", bmp_image); free(dst); @@ -1490,11 +1488,11 @@ int video_display_bitmap(ulong bmp_image, int x, int y) #endif /* CONFIG_VIDEO_BMP_GZIP */ } - width = le32_to_cpu(bmp->header.width); - height = le32_to_cpu(bmp->header.height); - bpp = le16_to_cpu(bmp->header.bit_count); - colors = le32_to_cpu(bmp->header.colors_used); - compression = le32_to_cpu(bmp->header.compression); + width = bmp_get_width(bmp); + height = bmp_get_height(bmp); + bpp = bmp_get_bit_count(bmp); + colors = bmp_get_colors_used(bmp); + compression = bmp_get_compression(bmp); debug("Display-bmp: %ld x %ld with %d colors\n", width, height, colors); @@ -1539,7 +1537,7 @@ int video_display_bitmap(ulong bmp_image, int x, int y) if ((y + height) > VIDEO_VISIBLE_ROWS) height = VIDEO_VISIBLE_ROWS - y; - bmap = (uchar *) bmp + le32_to_cpu(bmp->header.data_offset); + bmap = (uchar *) bmp + bmp_get_data_offset(bmp); fb = (uchar *) (video_fb_address + ((y + height - 1) * VIDEO_COLS * VIDEO_PIXEL_SIZE) + x * VIDEO_PIXEL_SIZE); @@ -1551,7 +1549,7 @@ int video_display_bitmap(ulong bmp_image, int x, int y) #endif /* We handle only 4, 8, or 24 bpp bitmaps */ - switch (le16_to_cpu(bmp->header.bit_count)) { + switch (bmp_get_bit_count(bmp)) { case 4: padded_line -= width / 2; ycount = height; @@ -1785,7 +1783,7 @@ int video_display_bitmap(ulong bmp_image, int x, int y) break; default: printf("Error: %d bit/pixel bitmaps not supported by U-Boot\n", - le16_to_cpu(bmp->header.bit_count)); + bmp_get_bit_count(bmp)); break; } -- 1.7.10.4 _______________________________________________ U-Boot mailing list [email protected] http://lists.denx.de/mailman/listinfo/u-boot

