42 lines
1.4 KiB
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; }
|