|
@@ -139,9 +139,64 @@ void __init e820_print_map(char *who)
|
|
|
* Sanitize the BIOS e820 map.
|
|
|
*
|
|
|
* Some e820 responses include overlapping entries. The following
|
|
|
- * replaces the original e820 map with a new one, removing overlaps.
|
|
|
+ * replaces the original e820 map with a new one, removing overlaps,
|
|
|
+ * and resolving conflicting memory types in favor of highest
|
|
|
+ * numbered type.
|
|
|
*
|
|
|
+ * The input parameter biosmap points to an array of 'struct
|
|
|
+ * e820entry' which on entry has elements in the range [0, *pnr_map)
|
|
|
+ * valid, and which has space for up to max_nr_map entries.
|
|
|
+ * On return, the resulting sanitized e820 map entries will be in
|
|
|
+ * overwritten in the same location, starting at biosmap.
|
|
|
+ *
|
|
|
+ * The integer pointed to by pnr_map must be valid on entry (the
|
|
|
+ * current number of valid entries located at biosmap) and will
|
|
|
+ * be updated on return, with the new number of valid entries
|
|
|
+ * (something no more than max_nr_map.)
|
|
|
+ *
|
|
|
+ * The return value from sanitize_e820_map() is zero if it
|
|
|
+ * successfully 'sanitized' the map entries passed in, and is -1
|
|
|
+ * if it did nothing, which can happen if either of (1) it was
|
|
|
+ * only passed one map entry, or (2) any of the input map entries
|
|
|
+ * were invalid (start + size < start, meaning that the size was
|
|
|
+ * so big the described memory range wrapped around through zero.)
|
|
|
+ *
|
|
|
+ * Visually we're performing the following
|
|
|
+ * (1,2,3,4 = memory types)...
|
|
|
+ *
|
|
|
+ * Sample memory map (w/overlaps):
|
|
|
+ * ____22__________________
|
|
|
+ * ______________________4_
|
|
|
+ * ____1111________________
|
|
|
+ * _44_____________________
|
|
|
+ * 11111111________________
|
|
|
+ * ____________________33__
|
|
|
+ * ___________44___________
|
|
|
+ * __________33333_________
|
|
|
+ * ______________22________
|
|
|
+ * ___________________2222_
|
|
|
+ * _________111111111______
|
|
|
+ * _____________________11_
|
|
|
+ * _________________4______
|
|
|
+ *
|
|
|
+ * Sanitized equivalent (no overlap):
|
|
|
+ * 1_______________________
|
|
|
+ * _44_____________________
|
|
|
+ * ___1____________________
|
|
|
+ * ____22__________________
|
|
|
+ * ______11________________
|
|
|
+ * _________1______________
|
|
|
+ * __________3_____________
|
|
|
+ * ___________44___________
|
|
|
+ * _____________33_________
|
|
|
+ * _______________2________
|
|
|
+ * ________________1_______
|
|
|
+ * _________________4______
|
|
|
+ * ___________________2____
|
|
|
+ * ____________________33__
|
|
|
+ * ______________________4_
|
|
|
*/
|
|
|
+
|
|
|
int __init sanitize_e820_map(struct e820entry *biosmap, int max_nr_map,
|
|
|
int *pnr_map)
|
|
|
{
|
|
@@ -162,43 +217,6 @@ static struct e820entry new_bios[E820_X_MAX] __initdata;
|
|
|
int old_nr, new_nr, chg_nr;
|
|
|
int i;
|
|
|
|
|
|
- /*
|
|
|
- Visually we're performing the following
|
|
|
- (1,2,3,4 = memory types)...
|
|
|
-
|
|
|
- Sample memory map (w/overlaps):
|
|
|
- ____22__________________
|
|
|
- ______________________4_
|
|
|
- ____1111________________
|
|
|
- _44_____________________
|
|
|
- 11111111________________
|
|
|
- ____________________33__
|
|
|
- ___________44___________
|
|
|
- __________33333_________
|
|
|
- ______________22________
|
|
|
- ___________________2222_
|
|
|
- _________111111111______
|
|
|
- _____________________11_
|
|
|
- _________________4______
|
|
|
-
|
|
|
- Sanitized equivalent (no overlap):
|
|
|
- 1_______________________
|
|
|
- _44_____________________
|
|
|
- ___1____________________
|
|
|
- ____22__________________
|
|
|
- ______11________________
|
|
|
- _________1______________
|
|
|
- __________3_____________
|
|
|
- ___________44___________
|
|
|
- _____________33_________
|
|
|
- _______________2________
|
|
|
- ________________1_______
|
|
|
- _________________4______
|
|
|
- ___________________2____
|
|
|
- ____________________33__
|
|
|
- ______________________4_
|
|
|
- */
|
|
|
-
|
|
|
/* if there's only one memory region, don't bother */
|
|
|
if (*pnr_map < 2)
|
|
|
return -1;
|