@@ -26,7 +26,7 @@ AddMemoryDescriptor(
2626 IN PFN_NUMBER PageCount ,
2727 IN TYPE_OF_MEMORY MemoryType );
2828
29- // we love statically allocated memory, don't we? :D
29+ // BIOS/E820 memory map, this is passed to Windows for ACPI support
3030BIOS_MEMORY_MAP BiosMap [MAX_BIOS_DESCRIPTORS ];
3131UINT32 BiosMapNumberOfEntries = 0 ;
3232
@@ -193,6 +193,9 @@ BiosConvertToFreeldrType(BIOS_MEMORY_TYPE MemoryType)
193193 {
194194 case BiosMemoryUsable :
195195 return LoaderFree ;
196+ // FIXME: does this break real hardware?
197+ case BiosMemoryAcpiReclaim :
198+ return LoaderFirmwareTemporary ;
196199 case BiosMemoryReserved :
197200 return LoaderFirmwarePermanent ;
198201 default :
@@ -208,8 +211,8 @@ BiosAddMemoryRegion(PBIOS_MEMORY_MAP MemoryMap,
208211 UINT64 Size ,
209212 BIOS_MEMORY_TYPE Type )
210213{
211- UINT32 x = * BiosNumberOfEntries ;
212- if (x == MAX_BIOS_DESCRIPTORS )
214+ UINT32 NumEntries = * BiosNumberOfEntries ;
215+ if (NumEntries == MAX_BIOS_DESCRIPTORS )
213216 {
214217 ERR ("Too many entries!\n" );
215218 FrLdrBugCheckWithMessage (
@@ -219,17 +222,17 @@ BiosAddMemoryRegion(PBIOS_MEMORY_MAP MemoryMap,
219222 "Cannot create more than 80 BIOS memory descriptors!" );
220223 }
221224 // Add on to existing entry if we can
222- if ((x > 0 )
223- && (MemoryMap [x - 1 ].BaseAddress + MemoryMap [x - 1 ].Length == Start )
224- && (MemoryMap [x - 1 ].Type == Type ))
225+ if ((NumEntries > 0 )
226+ && (MemoryMap [NumEntries - 1 ].BaseAddress + MemoryMap [NumEntries - 1 ].Length == Start )
227+ && (MemoryMap [NumEntries - 1 ].Type == Type ))
225228 {
226- MemoryMap [x - 1 ].Length += Size ;
229+ MemoryMap [NumEntries - 1 ].Length += Size ;
227230 }
228231 else
229232 {
230- MemoryMap [x ].BaseAddress = Start ;
231- MemoryMap [x ].Length = Size ;
232- MemoryMap [x ].Type = Type ;
233+ MemoryMap [NumEntries ].BaseAddress = Start ;
234+ MemoryMap [NumEntries ].Length = Size ;
235+ MemoryMap [NumEntries ].Type = Type ;
233236 (* BiosNumberOfEntries )++ ;
234237 }
235238}
@@ -301,16 +304,10 @@ AppleTVMemGetMemoryMap(ULONG *MemoryMapSize)
301304 BiosConvertToFreeldrMap (BiosMapPtr ,
302305 BiosMapNumberOfEntries );
303306
304- // reserve some ranges to prevent windows bugs
305- SetMemory (FreeldrMemMap , 0x000000 , 0x01000 , LoaderFirmwarePermanent ); // Realmode IVT / BDA
306- SetMemory (FreeldrMemMap , 0x0A0000 , 0x50000 , LoaderFirmwarePermanent ); // Video memory
307- SetMemory (FreeldrMemMap , 0x0F0000 , 0x10000 , LoaderSpecialMemory ); // ROM
308- SetMemory (FreeldrMemMap , 0xFFF000 , 0x01000 , LoaderSpecialMemory ); // unusable memory (do we really need this?)
307+ // The first page should be reserved.
308+ SetMemory (FreeldrMemMap , 0x000000 , 0x01000 , LoaderSpecialMemory ); // Realmode IVT / BDA
309309
310310 * MemoryMapSize = PcMemFinalizeMemoryMap (FreeldrMemMap );
311-
312- // Prevent BootArgs from being overwritten (can this even happen?)
313- SetMemory (FreeldrMemMap , (ULONG_PTR )BootArgs , sizeof (MACH_BOOTARGS ), LoaderFirmwareTemporary );
314-
311+
315312 return FreeldrMemMap ;
316313}
0 commit comments