Skip to contentSkip to conversation

cfb_console: force natural alignment of unzipped bitmap images

PATCH New Eric Nelson 3 participants 4 messages Feb 22, 2014 – Mar 10, 2014 Framebuffer layer

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 cfb_console: force natural alignment of unzipped bitmap images

Bitmaps contain 32-bit integers aligned at offsets of +2, +6 within the bmp_header structure. This patch forces them to be aligned properly when gzipped bitmaps are used.

Refer to these files for more details:
doc/README.displaying-bmps
doc/README.arm-unaligned-accesses

---
 drivers/video/cfb_console.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/video/cfb_console.c +5 -2
index 6db4073..2209148 100644
@@ -1473,7 +1473,10 @@ int video_display_bitmap(ulong bmp_image, int x, int y)
 			printf("Error: malloc in gunzip failed!\n");
 			return 1;
 		}
-		if (gunzip(dst, CONFIG_SYS_VIDEO_LOGO_MAX_SIZE,
+		/* NB: we need to force offset of +2
+		 * See doc/README.displaying-bmps
+		 */
+		if (gunzip(dst+2, CONFIG_SYS_VIDEO_LOGO_MAX_SIZE-2,
 			   (uchar *) bmp_image,
 			   &len) != 0) {
 			printf("Error: no valid bmp or bmp.gz image at %lx\n",
@@ -1489,7 +1492,7 @@ int video_display_bitmap(ulong bmp_image, int x, int y)
 		/*
 		 * Set addr to decompressed image
 		 */
-		bmp = (bmp_image_t *) dst;
+		bmp = (bmp_image_t *)(dst+2);
 
 		if (!((bmp->header.signature[0] == 'B') &&
 		      (bmp->header.signature[1] == 'M'))) {
Signature · 1 line
1.8.3.2
#1 lore raw

PATCH 1/1 cfb_console: force natural alignment of unzipped bitmap images

Dear Eric Nelson,

Quoted 4 lines · In message <[email protected]>…

Bitmaps contain 32-bit integers aligned at offsets of +2, +6 within the bmp_header structure. This patch forces them to be aligned properly when gzipped bitmaps are used.

This makes no sense to me. In the Subject: you talk about "unzipped bitmap images", but here you write about "gzipped bitmaps".

I think I understand what you mean, but this needs better wording.

drivers/video/cfb_console.c int video_display_bitmap(ulong bmp_image, int x, int y) · line 1477

Quoted 3 lines
drivers/video/cfb_console.c +2 -1
-		if (gunzip(dst, CONFIG_SYS_VIDEO_LOGO_MAX_SIZE,
+		/* NB: we need to force offset of +2
+		 * See doc/README.displaying-bmps

Incorrect multiline comment style.

Best regards,

Wolfgang Denk

Signature · 7 lines
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
There are three ways to get something done:
        (1) Do it yourself.
        (2) Hire someone to do it for you.
        (3) Forbid your kids to do it.
#2 lore raw

PATCH v3 1/1 cfb_console: align fields in gzipped .bmp files

In reply to Eric Nelson

.bmp files contain 32-bit integers aligned at offsets of +2, +6, et cetera within the bmp_header structure (see include/bmp_layout.h).

Support for gzip-compressed .bmp files is present in the cfb_console display subsystem by uncompressing them prior to use.

This patch forces the in-memory header to be aligned properly for these compressed images by extracting them to a 2-byte offset in the memory returned by malloc. Since malloc will always return a 4-byte aligned value, this forces the .bmp header fields to be naturally aligned on 4-byte addresses.

Refer to these files for more details:
doc/README.displaying-bmps
doc/README.arm-unaligned-accesses

---
Changes in V2:
- re-worded the subject line
- expanded and re-worded the commit message
Changes in V3:
- shortened the subject line
- fixed multiline comment style
- added patch history
- sent with "In-Reply-To" header referring to V1 See also:
V1: http://patchwork.ozlabs.org/patch/323243/
V2: http://patchwork.ozlabs.org/patch/325348/

 drivers/video/cfb_console.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/video/cfb_console.c +6 -2
index 6db4073..b52e9ed 100644
@@ -1473,7 +1473,11 @@ int video_display_bitmap(ulong bmp_image, int x, int y)
 			printf("Error: malloc in gunzip failed!\n");
 			return 1;
 		}
-		if (gunzip(dst, CONFIG_SYS_VIDEO_LOGO_MAX_SIZE,
+		/*
+		 * NB: we need to force offset of +2
+		 * See doc/README.displaying-bmps
+		 */
+		if (gunzip(dst+2, CONFIG_SYS_VIDEO_LOGO_MAX_SIZE-2,
 			   (uchar *) bmp_image,
 			   &len) != 0) {
 			printf("Error: no valid bmp or bmp.gz image at %lx\n",
@@ -1489,7 +1493,7 @@ int video_display_bitmap(ulong bmp_image, int x, int y)
 		/*
 		 * Set addr to decompressed image
 		 */
-		bmp = (bmp_image_t *) dst;
+		bmp = (bmp_image_t *)(dst+2);
 
 		if (!((bmp->header.signature[0] == 'B') &&
 		      (bmp->header.signature[1] == 'M'))) {
Signature · 1 line
1.8.3.2
#3 lore raw

PATCH v3 1/1 cfb_console: align fields in gzipped .bmp files

Quoted 12 lines · Eric Nelson

.bmp files contain 32-bit integers aligned at offsets of +2, +6, et cetera within the bmp_header structure (see include/bmp_layout.h).

Support for gzip-compressed .bmp files is present in the cfb_console display subsystem by uncompressing them prior to use.

This patch forces the in-memory header to be aligned properly for these compressed images by extracting them to a 2-byte offset in the memory returned by malloc. Since malloc will always return a 4-byte aligned value, this forces the .bmp header fields to be naturally aligned on 4-byte addresses.

Quoted 5 lines

Refer to these files for more details:
doc/README.displaying-bmps
doc/README.arm-unaligned-accesses

Applied to u-boot/master, thanks!

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20140310/b041d9e0/attachment.pgp>