|
@@ -89,6 +89,17 @@ static unsigned int extmemsize_e801 ( void ) {
|
89
|
89
|
DBG ( "INT 15,e801 extended memory size %d+64*%d=%d kB "
|
90
|
90
|
"[100000,%llx)\n", extmem_1m_to_16m_k, extmem_16m_plus_64k,
|
91
|
91
|
extmem, ( 0x100000 + ( ( ( uint64_t ) extmem ) * 1024 ) ) );
|
|
92
|
+
|
|
93
|
+ /* Sanity check. Some BIOSes report the entire 4GB address
|
|
94
|
+ * space as available, which cannot be correct (since that
|
|
95
|
+ * would leave no address space available for 32-bit PCI
|
|
96
|
+ * BARs).
|
|
97
|
+ */
|
|
98
|
+ if ( extmem == ( 0x400000 - 0x400 ) ) {
|
|
99
|
+ DBG ( "INT 15,e801 reported whole 4GB; assuming insane\n" );
|
|
100
|
+ return 0;
|
|
101
|
+ }
|
|
102
|
+
|
92
|
103
|
return extmem;
|
93
|
104
|
}
|
94
|
105
|
|
|
@@ -186,6 +197,28 @@ static int meme820 ( struct memory_map *memmap ) {
|
186
|
197
|
}
|
187
|
198
|
} while ( next != 0 );
|
188
|
199
|
|
|
200
|
+ /* Sanity checks. Some BIOSes report complete garbage via INT
|
|
201
|
+ * 15,e820 (especially at POST time), despite passing the
|
|
202
|
+ * signature checks. We currently check for a base memory
|
|
203
|
+ * region (starting at 0) and at least one high memory region
|
|
204
|
+ * (starting at 0x100000).
|
|
205
|
+ */
|
|
206
|
+ if ( memmap->count < 2 ) {
|
|
207
|
+ DBG ( "INT 15,e820 returned only %d regions; assuming "
|
|
208
|
+ "insane\n", memmap->count );
|
|
209
|
+ return -EINVAL;
|
|
210
|
+ }
|
|
211
|
+ if ( memmap->regions[0].start != 0 ) {
|
|
212
|
+ DBG ( "INT 15,e820 region 0 starts at %llx (expected 0); "
|
|
213
|
+ "assuming insane\n", memmap->regions[0].start );
|
|
214
|
+ return -EINVAL;
|
|
215
|
+ }
|
|
216
|
+ if ( memmap->regions[1].start != 0x100000 ) {
|
|
217
|
+ DBG ( "INT 15,e820 region 1 starts at %llx (expected 100000); "
|
|
218
|
+ "assuming insane\n", memmap->regions[0].start );
|
|
219
|
+ return -EINVAL;
|
|
220
|
+ }
|
|
221
|
+
|
189
|
222
|
return 0;
|
190
|
223
|
}
|
191
|
224
|
|