[U-Boot-Users] [PATCH] Fix wrong memory limit calculation in memory-test

Guennadi Liakhovetski g.liakhovetski at gmx.de
Thu Feb 7 17:40:50 CET 2008


If the length of the memory address range passed to the "mtest" command is 
not of the form 2^x - 1, not all address lines are tested. This bug is 
inherited from the original software at 
http://www.netrino.com/Embedded-Systems/How-To/Memory-Test-Suite-C. Fix 
this.

Signed-off-by: Guennadi Liakhovetski <g.liakhovetski at gmx.de>

---

diff --git a/common/cmd_mem.c b/common/cmd_mem.c
index a994211..2b55e7e 100644
--- a/common/cmd_mem.c
+++ b/common/cmd_mem.c
@@ -661,7 +661,7 @@ int do_mem_mtest (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 	ulong	readback;
 
 #if defined(CFG_ALT_MEMTEST)
-	vu_long	addr_mask;
+	vu_long	len;
 	vu_long	offset;
 	vu_long	test_offset;
 	vu_long	pattern;
@@ -800,24 +800,24 @@ int do_mem_mtest (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 		 * Returns:     0 if the test succeeds, 1 if the test fails.
 		 *
 		 * ## NOTE ##	Be sure to specify start and end
-		 *              addresses such that addr_mask has
+		 *              addresses such that len has
 		 *              lots of bits set. For example an
 		 *              address range of 01000000 02000000 is
 		 *              bad while a range of 01000000
 		 *              01ffffff is perfect.
 		 */
-		addr_mask = ((ulong)end - (ulong)start)/sizeof(vu_long);
+		len = ((ulong)end - (ulong)start)/sizeof(vu_long);
 		pattern = (vu_long) 0xaaaaaaaa;
 		anti_pattern = (vu_long) 0x55555555;
 
 		PRINTF("%s:%d: addr mask = 0x%.8lx\n",
 			__FUNCTION__, __LINE__,
-			addr_mask);
+			len);
 		/*
 		 * Write the default pattern at each of the
 		 * power-of-two offsets.
 		 */
-		for (offset = 1; (offset & addr_mask) != 0; offset <<= 1) {
+		for (offset = 1; offset < len; offset <<= 1) {
 			start[offset] = pattern;
 		}
 
@@ -827,7 +827,7 @@ int do_mem_mtest (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 		test_offset = 0;
 		start[test_offset] = anti_pattern;
 
-		for (offset = 1; (offset & addr_mask) != 0; offset <<= 1) {
+		for (offset = 1; offset < len; offset <<= 1) {
 		    temp = start[offset];
 		    if (temp != pattern) {
 			printf ("\nFAILURE: Address bit stuck high @ 0x%.8lx:"
@@ -841,10 +841,10 @@ int do_mem_mtest (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 		/*
 		 * Check for addr bits stuck low or shorted.
 		 */
-		for (test_offset = 1; (test_offset & addr_mask) != 0; test_offset <<= 1) {
+		for (test_offset = 1; test_offset < len; test_offset <<= 1) {
 		    start[test_offset] = anti_pattern;
 
-		    for (offset = 1; (offset & addr_mask) != 0; offset <<= 1) {
+		    for (offset = 1; offset < len; offset <<= 1) {
 			temp = start[offset];
 			if ((temp != pattern) && (offset != test_offset)) {
 			    printf ("\nFAILURE: Address bit stuck low or shorted @"




More information about the U-Boot mailing list