#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; }