x86: memtest: wipe out test pattern from memory
authorAndreas Herrmann <andreas.herrmann3@amd.com>
Wed, 25 Feb 2009 10:30:04 +0000 (11:30 +0100)
committerIngo Molnar <mingo@elte.hu>
Wed, 25 Feb 2009 11:19:46 +0000 (12:19 +0100)
Signed-off-by: Andreas Herrmann <andreas.herrmann3@amd.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/mm/memtest.c

index 3232397..9c52ef1 100644 (file)
@@ -57,6 +57,29 @@ static void __init memtest(u64 pattern, u64 start_phys, u64 size)
                reserve_bad_mem(pattern, start_bad, last_bad + incr);
 }
 
+static void __init do_one_pass(u64 pattern, u64 start, u64 end)
+{
+       u64 size = 0;
+
+       while (start < end) {
+               start = find_e820_area_size(start, &size, 1);
+
+               /* done ? */
+               if (start >= end)
+                       break;
+               if (start + size > end)
+                       size = end - start;
+
+               printk(KERN_INFO "  %010llx - %010llx pattern %016llx\n",
+                      (unsigned long long) start,
+                      (unsigned long long) start + size,
+                      (unsigned long long) cpu_to_be64(pattern));
+               memtest(pattern, start, size);
+
+               start += size;
+       }
+}
+
 /* default is disabled */
 static int memtest_pattern __initdata;
 
@@ -71,35 +94,22 @@ early_param("memtest", parse_memtest);
 
 void __init early_memtest(unsigned long start, unsigned long end)
 {
-       u64 t_start, t_size;
        unsigned int i;
-       u64 pattern;
+       unsigned int idx = 0;
 
        if (!memtest_pattern)
                return;
 
        printk(KERN_INFO "early_memtest: # of tests: %d\n", memtest_pattern);
        for (i = 0; i < memtest_pattern; i++) {
-               unsigned int idx = i % ARRAY_SIZE(patterns);
-               pattern = patterns[idx];
-               t_start = start;
-               t_size = 0;
-               while (t_start < end) {
-                       t_start = find_e820_area_size(t_start, &t_size, 1);
-
-                       /* done ? */
-                       if (t_start >= end)
-                               break;
-                       if (t_start + t_size > end)
-                               t_size = end - t_start;
-
-                       printk(KERN_INFO "  %010llx - %010llx pattern %016llx\n",
-                              (unsigned long long) t_start,
-                              (unsigned long long) t_start + t_size,
-                              (unsigned long long) cpu_to_be64(pattern));
-                       memtest(pattern, t_start, t_size);
-
-                       t_start += t_size;
-               }
+               idx = i % ARRAY_SIZE(patterns);
+               do_one_pass(patterns[idx], start, end);
+       }
+
+       if (idx > 0) {
+               printk(KERN_INFO "early_memtest: wipe out "
+                      "test pattern from memory\n");
+               /* additional test with pattern 0 will do this */
+               do_one_pass(0, start, end);
        }
 }