|
@@ -389,14 +389,24 @@ static void __init limit_regions(unsigned long long size)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for (i = 0; i < e820.nr_map; i++) {
|
|
for (i = 0; i < e820.nr_map; i++) {
|
|
- if (e820.map[i].type == E820_RAM) {
|
|
|
|
- current_addr = e820.map[i].addr + e820.map[i].size;
|
|
|
|
- if (current_addr >= size) {
|
|
|
|
- e820.map[i].size -= current_addr-size;
|
|
|
|
- e820.nr_map = i + 1;
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
|
|
+ current_addr = e820.map[i].addr + e820.map[i].size;
|
|
|
|
+ if (current_addr < size)
|
|
|
|
+ continue;
|
|
|
|
+
|
|
|
|
+ if (e820.map[i].type != E820_RAM)
|
|
|
|
+ continue;
|
|
|
|
+
|
|
|
|
+ if (e820.map[i].addr >= size) {
|
|
|
|
+ /*
|
|
|
|
+ * This region starts past the end of the
|
|
|
|
+ * requested size, skip it completely.
|
|
|
|
+ */
|
|
|
|
+ e820.nr_map = i;
|
|
|
|
+ } else {
|
|
|
|
+ e820.nr_map = i + 1;
|
|
|
|
+ e820.map[i].size -= current_addr - size;
|
|
}
|
|
}
|
|
|
|
+ return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|