aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/kernel/e820.c94
1 files changed, 56 insertions, 38 deletions
diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c
index 91abf5b2fb94..41c480ae47df 100644
--- a/arch/x86/kernel/e820.c
+++ b/arch/x86/kernel/e820.c
@@ -139,9 +139,64 @@ void __init e820_print_map(char *who)
139 * Sanitize the BIOS e820 map. 139 * Sanitize the BIOS e820 map.
140 * 140 *
141 * Some e820 responses include overlapping entries. The following 141 * Some e820 responses include overlapping entries. The following
142 * replaces the original e820 map with a new one, removing overlaps. 142 * replaces the original e820 map with a new one, removing overlaps,
143 * and resolving conflicting memory types in favor of highest
144 * numbered type.
143 * 145 *
146 * The input parameter biosmap points to an array of 'struct
147 * e820entry' which on entry has elements in the range [0, *pnr_map)
148 * valid, and which has space for up to max_nr_map entries.
149 * On return, the resulting sanitized e820 map entries will be in
150 * overwritten in the same location, starting at biosmap.
151 *
152 * The integer pointed to by pnr_map must be valid on entry (the
153 * current number of valid entries located at biosmap) and will
154 * be updated on return, with the new number of valid entries
155 * (something no more than max_nr_map.)
156 *
157 * The return value from sanitize_e820_map() is zero if it
158 * successfully 'sanitized' the map entries passed in, and is -1
159 * if it did nothing, which can happen if either of (1) it was
160 * only passed one map entry, or (2) any of the input map entries
161 * were invalid (start + size < start, meaning that the size was
162 * so big the described memory range wrapped around through zero.)
163 *
164 * Visually we're performing the following
165 * (1,2,3,4 = memory types)...
166 *
167 * Sample memory map (w/overlaps):
168 * ____22__________________
169 * ______________________4_
170 * ____1111________________
171 * _44_____________________
172 * 11111111________________
173 * ____________________33__
174 * ___________44___________
175 * __________33333_________
176 * ______________22________
177 * ___________________2222_
178 * _________111111111______
179 * _____________________11_
180 * _________________4______
181 *
182 * Sanitized equivalent (no overlap):
183 * 1_______________________
184 * _44_____________________
185 * ___1____________________
186 * ____22__________________
187 * ______11________________
188 * _________1______________
189 * __________3_____________
190 * ___________44___________
191 * _____________33_________
192 * _______________2________
193 * ________________1_______
194 * _________________4______
195 * ___________________2____
196 * ____________________33__
197 * ______________________4_
144 */ 198 */
199
145int __init sanitize_e820_map(struct e820entry *biosmap, int max_nr_map, 200int __init sanitize_e820_map(struct e820entry *biosmap, int max_nr_map,
146 int *pnr_map) 201 int *pnr_map)
147{ 202{
@@ -162,43 +217,6 @@ static struct e820entry new_bios[E820_X_MAX] __initdata;
162 int old_nr, new_nr, chg_nr; 217 int old_nr, new_nr, chg_nr;
163 int i; 218 int i;
164 219
165 /*
166 Visually we're performing the following
167 (1,2,3,4 = memory types)...
168
169 Sample memory map (w/overlaps):
170 ____22__________________
171 ______________________4_
172 ____1111________________
173 _44_____________________
174 11111111________________
175 ____________________33__
176 ___________44___________
177 __________33333_________
178 ______________22________
179 ___________________2222_
180 _________111111111______
181 _____________________11_
182 _________________4______
183
184 Sanitized equivalent (no overlap):
185 1_______________________
186 _44_____________________
187 ___1____________________
188 ____22__________________
189 ______11________________
190 _________1______________
191 __________3_____________
192 ___________44___________
193 _____________33_________
194 _______________2________
195 ________________1_______
196 _________________4______
197 ___________________2____
198 ____________________33__
199 ______________________4_
200 */
201
202 /* if there's only one memory region, don't bother */ 220 /* if there's only one memory region, don't bother */
203 if (*pnr_map < 2) 221 if (*pnr_map < 2)
204 return -1; 222 return -1;