
Unaligned 32-/16-bit accesses to local bus on MPC5200 and MPC512x deliver corrupted data:
=> md F0000000 10 f0000000: 27051956 552d426f 6f742032 3031302e '..VU-Boot 2010. f0000010: 30362d72 63332d30 38303336 2d676665 06-rc3-08036-gfe f0000020: 38663238 362d6469 72747920 284a756e 8f286-dirty (Jun f0000030: 20323920 32303130 202d2031 343a3235 29 2010 - 14:25 => md F0000001 10 f0000001: 00005655 00006f6f 00003230 00002e30 ..VU..oo..20...0 f0000011: 00007263 00003038 0000362d 00006538 ..rc..08..6-..e8 f0000021: 00003836 00006972 00002028 00006e20 ..86..ir.. (..n f0000031: 00002032 00003020 00003134 0000353a .. 2..0 ..14..5: => md.w F0000001 20 f0000001: 0000 5655 0000 6f6f 0000 3230 0000 2e30 ..VU..oo..20...0 f0000011: 0000 7263 0000 3038 0000 362d 0000 6538 ..rc..08..6-..e8 f0000021: 0000 3836 0000 6972 0000 2028 0000 6e20 ..86..ir.. (..n f0000031: 0000 2032 0000 3020 0000 3134 0000 353a .. 2..0 ..14..5:
Use memcpy in print_buffer() to fix the problem.
Signed-off-by: Anatolij Gustschin agust@denx.de Cc: Wolfgang Denk wd@denx.de Cc: Detlev Zundel dzu@denx.de --- lib/display_options.c | 14 ++++++++++++++ 1 files changed, 14 insertions(+), 0 deletions(-)
diff --git a/lib/display_options.c b/lib/display_options.c index a711425..c0b89b2 100644 --- a/lib/display_options.c +++ b/lib/display_options.c @@ -122,10 +122,24 @@ int print_buffer (ulong addr, void* data, uint width, uint count, uint linelen) /* Copy from memory into linebuf and print hex values */ for (i = 0; i < linelen; i++) { if (width == 4) { +#if defined(CONFIG_MPC5200) || defined(CONFIG_MPC512X) + /* + * workaround for issues on the MPC5200/MPC512X, + * where unaligned 32-/16-bit-accesses to the + * local bus will deliver corrupted data. Just + * use fixed memcpy here. + */ + memcpy(&uip[i], data, 4); +#else uip[i] = *(volatile uint32_t *)data; +#endif printf(" %08x", uip[i]); } else if (width == 2) { +#if defined(CONFIG_MPC5200) || defined(CONFIG_MPC512X) + memcpy(&usp[i], data, 2); +#else usp[i] = *(volatile uint16_t *)data; +#endif printf(" %04x", usp[i]); } else { ucp[i] = *(volatile uint8_t *)data;