[U-Boot] [PATCH v3 05/12] common: lcd.c: fix data abort exception when try to access bmp header
Minkyu Kang
mk7.kang at samsung.com
Mon Jan 6 06:05:13 CET 2014
Cc: Anatolij Gustschin
On 04/01/14 01:43, Przemyslaw Marczak wrote:
> Changes:
> - le16_to_cpu() to get_unaligned_le16()
> - le32_to_cpu() to get_unaligned_le32()
> when access fields in struct bmp header.
>
> This changes avoids data abort exception caused by unaligned data access.
>
> Signed-off-by: Przemyslaw Marczak <p.marczak at samsung.com>
>
> ---
> Changes v2:
> - new patch
>
> Changes v3:
> - common/Makefile - remove CFLAG: -mno-unaligned-access
> - common/lcd.c - fix data abort exception when access bmp_header
>
> common/lcd.c | 27 +++++++++++++--------------
> 1 file changed, 13 insertions(+), 14 deletions(-)
>
> diff --git a/common/lcd.c b/common/lcd.c
> index 56bf067..aa81522 100644
> --- a/common/lcd.c
> +++ b/common/lcd.c
> @@ -26,7 +26,7 @@
> #endif
> #include <lcd.h>
> #include <watchdog.h>
> -
> +#include <asm/unaligned.h>
> #include <splash.h>
>
> #if defined(CONFIG_CPU_PXA25X) || defined(CONFIG_CPU_PXA27X) || \
> @@ -777,9 +777,9 @@ static void lcd_display_rle8_bitmap(bmp_image_t *bmp, ushort *cmap, uchar *fb,
> int x, y;
> int decode = 1;
>
> - width = le32_to_cpu(bmp->header.width);
> - height = le32_to_cpu(bmp->header.height);
> - bmap = (uchar *)bmp + le32_to_cpu(bmp->header.data_offset);
> + width = get_unaligned_le32(&bmp->header.width);
> + height = get_unaligned_le32(&bmp->header.height);
> + bmap = (uchar *)bmp + get_unaligned_le32(&bmp->header.data_offset);
>
> x = 0;
> y = height - 1;
> @@ -900,9 +900,10 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
> return 1;
> }
>
> - width = le32_to_cpu(bmp->header.width);
> - height = le32_to_cpu(bmp->header.height);
> - bmp_bpix = le16_to_cpu(bmp->header.bit_count);
> + width = get_unaligned_le32(&bmp->header.width);
> + height = get_unaligned_le32(&bmp->header.height);
> + bmp_bpix = get_unaligned_le16(&bmp->header.bit_count);
> +
> colors = 1 << bmp_bpix;
>
> bpix = NBITS(panel_info.vl_bpix);
> @@ -917,9 +918,7 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
> /* We support displaying 8bpp BMPs on 16bpp LCDs */
> if (bpix != bmp_bpix && !(bmp_bpix == 8 && bpix == 16)) {
> printf ("Error: %d bit/pixel mode, but BMP has %d bit/pixel\n",
> - bpix,
> - le16_to_cpu(bmp->header.bit_count));
> -
> + bpix, get_unaligned_le16(&bmp->header.bit_count));
> return 1;
> }
>
> @@ -956,7 +955,6 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
> }
> }
> #endif
> -
> /*
> * BMP format for Monochrome assumes that the state of a
> * pixel is described on a per Bit basis, not per Byte.
> @@ -987,15 +985,16 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
> if ((y + height) > panel_info.vl_row)
> height = panel_info.vl_row - y;
>
> - bmap = (uchar *) bmp + le32_to_cpu(bmp->header.data_offset);
> - fb = (uchar *) (lcd_base +
> + bmap = (uchar *)bmp + get_unaligned_le32(&bmp->header.data_offset);
> + fb = (uchar *)(lcd_base +
> (y + height - 1) * lcd_line_length + x * bpix / 8);
>
> switch (bmp_bpix) {
> case 1: /* pass through */
> case 8:
> #ifdef CONFIG_LCD_BMP_RLE8
> - if (le32_to_cpu(bmp->header.compression) == BMP_BI_RLE8) {
> + u32 compression = get_unaligned_le32(&bmp->header.compression);
> + if (compression == BMP_BI_RLE8) {
> if (bpix != 16) {
> /* TODO implement render code for bpix != 16 */
> printf("Error: only support 16 bpix");
>
More information about the U-Boot
mailing list