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.marc...@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");
> 

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to