Merge branch 'for-linus' of git://www.linux-m32r.org/git/takata/linux-2.6_dev
[pandora-kernel.git] / arch / x86 / kernel / e820_64.c
index 79f0d52..124480c 100644 (file)
@@ -100,20 +100,25 @@ void __init free_early(unsigned long start, unsigned long end)
        for (j = i + 1; j < MAX_EARLY_RES && early_res[j].end; j++)
                ;
 
-       memcpy(&early_res[i], &early_res[i + 1],
+       memmove(&early_res[i], &early_res[i + 1],
               (j - 1 - i) * sizeof(struct early_res));
 
        early_res[j - 1].end = 0;
 }
 
-void __init early_res_to_bootmem(void)
+void __init early_res_to_bootmem(unsigned long start, unsigned long end)
 {
        int i;
+       unsigned long final_start, final_end;
        for (i = 0; i < MAX_EARLY_RES && early_res[i].end; i++) {
                struct early_res *r = &early_res[i];
-               printk(KERN_INFO "early res: %d [%lx-%lx] %s\n", i,
-                       r->start, r->end - 1, r->name);
-               reserve_bootmem_generic(r->start, r->end - r->start);
+               final_start = max(start, r->start);
+               final_end = min(end, r->end);
+               if (final_start >= final_end)
+                       continue;
+               printk(KERN_INFO "  early res: %d [%lx-%lx] %s\n", i,
+                       final_start, final_end - 1, r->name);
+               reserve_bootmem_generic(final_start, final_end - final_start);
        }
 }