lindows/lcrash/efi/memmap.c

42 lines
1.4 KiB
C

#include "memmap.h"
struct EfiMemoryDescription *StoredMemoryMap;
u32 StoredMemoryMapEntryCount = 0;
u32 StoredMemoryMapEntrySize = 0;
void EfiLoadStoredMemoryMap(
struct EfiMemoryDescription* MemoryMap,
u32 MemoryMapEntryCount,
u32 MemoryMapEntrySize
) {
StoredMemoryMap = MemoryMap;
StoredMemoryMapEntryCount = MemoryMapEntryCount;
StoredMemoryMapEntrySize = MemoryMapEntrySize;
}
/**
* Translate a pointer using what we can recover from the UEFI memory map, returns 0 if not found
*/
void* EfiTranslatePointer(void* FirmwarePointer) {
void* CurrentEntry = (void*)StoredMemoryMap;
// Scan the memory map for where our thing is
for (int i = 0; i < StoredMemoryMapEntryCount; i++) {
struct EfiMemoryDescription* Entry = (struct EfiMemoryDescription*)CurrentEntry;
if (FirmwarePointer >= Entry->VirtualStart &&
FirmwarePointer < Entry->VirtualStart + 0x1000 * Entry->NumberOfPages) {
return FirmwarePointer - Entry->VirtualStart + Entry->PhysicalStart;
}
CurrentEntry += StoredMemoryMapEntrySize;
}
// Well, we tried
return 0;
}
struct EfiMemoryDescription *EfiGetStoredMemoryMap() { return StoredMemoryMap; }
u32 EfiGetStoredMemoryMapEntryCount() { return StoredMemoryMapEntryCount; }
u32 EfiGetStoredMemoryMapEntrySize() { return StoredMemoryMapEntrySize; }