[U-Boot] [PATCH v2] display_buffer: fix misaligned buffer
Wolfgang Denk
wd at denx.de
Wed Sep 8 01:33:38 CEST 2010
Dear Reinhard Meyer,
In message <1283243000-25427-1-git-send-email-u-boot at emk-elektronik.de> you wrote:
> use a union to cause necessary alignment per architecture
>
> Signed-off-by: Reinhard Meyer <u-boot at emk-elektronik.de>
> ---
> lib/display_options.c | 24 +++++++++++++-----------
> 1 files changed, 13 insertions(+), 11 deletions(-)
>
> diff --git a/lib/display_options.c b/lib/display_options.c
> index 20319e6..4f2ad69 100644
> --- a/lib/display_options.c
> +++ b/lib/display_options.c
> @@ -101,10 +101,12 @@ void print_size(unsigned long long size, const char *s)
> #define DEFAULT_LINE_LENGTH_BYTES (16)
> int print_buffer (ulong addr, void* data, uint width, uint count, uint linelen)
> {
> - uint8_t linebuf[MAX_LINE_LENGTH_BYTES + 1];
> - uint32_t *uip = (void*)linebuf;
> - uint16_t *usp = (void*)linebuf;
> - uint8_t *ucp = (void*)linebuf;
> + /* linebuf as a union causes proper alignment */
> + union linebuf {
> + uint32_t ui[MAX_LINE_LENGTH_BYTES/4 + 1];
> + uint16_t us[MAX_LINE_LENGTH_BYTES/2 + 1];
> + uint8_t uc[MAX_LINE_LENGTH_BYTES/1 + 1];
Please replace the magic numbers 4, 2 and 1 by respective sizeof().
> int i;
>
> if (linelen*width > MAX_LINE_LENGTH_BYTES)
> @@ -123,21 +125,21 @@ int print_buffer (ulong addr, void* data, uint width, uint count, uint linelen)
> for (i = 0; i < linelen; i++) {
> uint32_t x;
> if (width == 4)
> - x = uip[i] = *(volatile uint32_t *)data;
> + x = lb.ui[i] = *(volatile uint32_t *)data;
> else if (width == 2)
> - x = usp[i] = *(volatile uint16_t *)data;
> + x = lb.us[i] = *(volatile uint16_t *)data;
> else
> - x = ucp[i] = *(volatile uint8_t *)data;
> + x = lb.uc[i] = *(volatile uint8_t *)data;
> printf(" %0*x", width * 2, x);
> data += width;
> }
>
> /* Print data in ASCII characters */
> for (i = 0; i < linelen * width; i++)
> - if (!isprint(ucp[i]) || ucp[i] >= 0x80)
> - ucp[i] = '.';
> - ucp[i] = '\0';
> - printf(" %s\n", ucp);
> + if (!isprint(lb.uc[i]) || lb.uc[i] >= 0x80)
> + lb.uc[i] = '.';
Please fix this old bug: the multi-line statement needs braces.
Best regards,
Wolfgang Denk
--
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
It is surely a great calamity for a human being to have no ob-
sessions. - Robert Bly
More information about the U-Boot
mailing list