PFREELDR_MEMORY_DESCRIPTOR PcMemGetMemoryMap(ULONG *MemoryMapSize) { ULONG i, EntryCount; ULONG ExtendedMemorySizeAtOneMB; ULONG ExtendedMemorySizeAtSixteenMB; EntryCount = PcMemGetBiosMemoryMap(PcMemoryMap, MAX_BIOS_DESCRIPTORS); /* If the BIOS didn't provide a memory map, synthesize one */ if (0 == EntryCount) { GetExtendedMemoryConfiguration(&ExtendedMemorySizeAtOneMB, &ExtendedMemorySizeAtSixteenMB); /* Conventional memory */ AddMemoryDescriptor(PcMemoryMap, MAX_BIOS_DESCRIPTORS, 0, PcMemGetConventionalMemorySize() * 1024 / PAGE_SIZE, LoaderFree); /* Extended memory */ EntryCount = AddMemoryDescriptor(PcMemoryMap, MAX_BIOS_DESCRIPTORS, 1024 * 1024 / PAGE_SIZE, ExtendedMemorySizeAtOneMB * 1024 / PAGE_SIZE, LoaderFree); if (ExtendedMemorySizeAtSixteenMB != 0) { /* Extended memory at 16MB */ EntryCount = AddMemoryDescriptor(PcMemoryMap, MAX_BIOS_DESCRIPTORS, 0x1000000 / PAGE_SIZE, ExtendedMemorySizeAtSixteenMB * 64 * 1024 / PAGE_SIZE, LoaderFree); } } TRACE("Dumping resulting memory map:\n"); for (i = 0; i < EntryCount; i++) { TRACE("BasePage=0x%lx, PageCount=0x%lx, Type=%s\n", PcMemoryMap[i].BasePage, PcMemoryMap[i].PageCount, MmGetSystemMemoryMapTypeString(PcMemoryMap[i].MemoryType)); } *MemoryMapSize = EntryCount; return PcMemoryMap; }
PFREELDR_MEMORY_DESCRIPTOR PcMemGetMemoryMap(ULONG *MemoryMapSize) { ULONG i, EntryCount; ULONG ExtendedMemorySizeAtOneMB; ULONG ExtendedMemorySizeAtSixteenMB; ULONG EbdaBase, EbdaSize; TRACE("PcMemGetMemoryMap()\n"); EntryCount = PcMemGetBiosMemoryMap(PcMemoryMap, MAX_BIOS_DESCRIPTORS); /* If the BIOS didn't provide a memory map, synthesize one */ if (EntryCount == 0) { GetExtendedMemoryConfiguration(&ExtendedMemorySizeAtOneMB, &ExtendedMemorySizeAtSixteenMB); /* Conventional memory */ AddMemoryDescriptor(PcMemoryMap, MAX_BIOS_DESCRIPTORS, 0, PcMemGetConventionalMemorySize() * 1024 / PAGE_SIZE, LoaderFree); /* Extended memory */ PcMapCount = AddMemoryDescriptor(PcMemoryMap, MAX_BIOS_DESCRIPTORS, 1024 * 1024 / PAGE_SIZE, ExtendedMemorySizeAtOneMB * 1024 / PAGE_SIZE, LoaderFree); if (ExtendedMemorySizeAtSixteenMB != 0) { /* Extended memory at 16MB */ PcMapCount = AddMemoryDescriptor(PcMemoryMap, MAX_BIOS_DESCRIPTORS, 0x1000000 / PAGE_SIZE, ExtendedMemorySizeAtSixteenMB * 64 * 1024 / PAGE_SIZE, LoaderFree); } /* Check if we have an EBDA and get it's location */ if (GetEbdaLocation(&EbdaBase, &EbdaSize)) { /* Add the descriptor */ PcMapCount = AddMemoryDescriptor(PcMemoryMap, MAX_BIOS_DESCRIPTORS, (EbdaBase / PAGE_SIZE), ADDRESS_AND_SIZE_TO_SPAN_PAGES(EbdaBase, EbdaSize), LoaderFirmwarePermanent); } } /* Setup some protected ranges */ SetMemory(0x000000, 0x01000, LoaderFirmwarePermanent); // Realmode IVT / BDA SetMemory(0x0A0000, 0x50000, LoaderFirmwarePermanent); // Video memory SetMemory(0x0F0000, 0x10000, LoaderSpecialMemory); // ROM SetMemory(0xFFF000, 0x01000, LoaderSpecialMemory); // unusable memory (do we really need this?) /* Reserve some static ranges for freeldr */ ReserveMemory(0x1000, STACKLOW - 0x1000, LoaderFirmwareTemporary, "BIOS area"); ReserveMemory(STACKLOW, STACKADDR - STACKLOW, LoaderOsloaderStack, "FreeLdr stack"); ReserveMemory(FREELDR_BASE, FrLdrImageSize, LoaderLoadedProgram, "FreeLdr image"); /* Default to 1 page above freeldr for the disk read buffer */ DiskReadBuffer = (PUCHAR)ALIGN_UP_BY(FREELDR_BASE + FrLdrImageSize, PAGE_SIZE); DiskReadBufferSize = PAGE_SIZE; /* Scan for free range above freeldr image */ for (i = 0; i < PcMapCount; i++) { if ((PcMemoryMap[i].BasePage > (FREELDR_BASE / PAGE_SIZE)) && (PcMemoryMap[i].MemoryType == LoaderFree)) { /* Use this range for the disk read buffer */ DiskReadBuffer = (PVOID)(PcMemoryMap[i].BasePage * PAGE_SIZE); DiskReadBufferSize = min(PcMemoryMap[i].PageCount * PAGE_SIZE, MAX_DISKREADBUFFER_SIZE); break; } } TRACE("DiskReadBuffer=%p, DiskReadBufferSize=%lx\n", DiskReadBuffer, DiskReadBufferSize); /* Now reserve the range for the disk read buffer */ ReserveMemory((ULONG_PTR)DiskReadBuffer, DiskReadBufferSize, LoaderFirmwareTemporary, "Disk read buffer"); TRACE("Dumping resulting memory map:\n"); for (i = 0; i < PcMapCount; i++) { TRACE("BasePage=0x%lx, PageCount=0x%lx, Type=%s\n", PcMemoryMap[i].BasePage, PcMemoryMap[i].PageCount, MmGetSystemMemoryMapTypeString(PcMemoryMap[i].MemoryType)); } *MemoryMapSize = PcMapCount; return PcMemoryMap; }