58 uint64_t highest_addr = 0;
62 for (
size_t i = 0; i < entry_count; i++) {
69 if (region_end > highest_addr) highest_addr = region_end;
88 for (uint64_t i = 0; i < pages; ++i) {
89 uint64_t idx = first + i;
124 uint64_t totalRam = MiGetTotalMemory(BootInfo);
130 uint64_t neededRam = totalPfnEntries *
sizeof(
PFN_ENTRY);
131 assert((neededRam) < INT32_MAX,
"Needed Ram DB is insanely huge");
135 size_t entryCount = BootInfo->MapSize / BootInfo->DescriptorSize;
136 uint64_t pfnEntriesPhys = 0;
139 for (
size_t i = 0; i < entryCount; i++) {
144 if (regionSize >= neededRam) {
170 for (uint64_t i = 0; i < neededPages; i++) {
179 uint64_t pfn_region_phys = pfnEntriesPhys - (neededPages *
VirtualPageSize);
199 PfnDatabase.StandbyPageList.PfnListLock.locked = 0;
202 PfnDatabase.ModifiedPageList.PfnListLock.locked = 0;
209 desc = BootInfo->MemoryMap;
210 for (
size_t i = 0; i < entryCount; i++) {
215 for (uint64_t p = 0; p < regionPages; p++) {
223 if (currentPfnIndex > lastPfnIdx) {
224 lastPfnIdx = currentPfnIndex;
227 if (currentPfnIndex >=
PfnDatabase.TotalPageCount) {
236 if (physAddr >= pfn_region_phys && physAddr < pfn_region_phys + neededPages *
VirtualPageSize) {
244 switch (desc->
Type) {
317 if (!pListEntry)
return NULL;
361 pfn = MiReleaseAnyPage(&
PfnDatabase.ZeroedPageList.ListEntry);
371 pfn = MiReleaseAnyPage(&
PfnDatabase.FreePageList.ListEntry);
381 pfn = MiReleaseAnyPage(&
PfnDatabase.StandbyPageList.ListEntry);
445 assert((pfn->
RefCount) > 0,
"Refcount is 0 while releasing. Double Free");
495 volatile uint64_t* count = NULL;
498 switch (pfn->
State) {
FORCEINLINE uint64_t InterlockedIncrementU64(volatile uint64_t *target)
FORCEINLINE uint32_t InterlockedDecrementU32(volatile uint32_t *target)
FORCEINLINE uint64_t InterlockedDecrementU64(volatile uint64_t *target)
struct _DOUBLY_LINKED_LIST * PDOUBLY_LINKED_LIST
#define EfiRuntimeServicesData
struct _BOOT_INFO * PBOOT_INFO
#define EfiBootServicesCode
#define EfiBootServicesData
struct _BOOT_INFO BOOT_INFO
struct _EFI_MEMORY_DESCRIPTOR * PEFI_MEMORY_DESCRIPTOR
#define EfiConventionalMemory
#define EfiRuntimeServicesCode
#define EfiReservedMemoryType
void * MiMapPageInHyperspace(IN uint64_t PfnIndex, OUT PIRQL OldIrql)
void MiUnmapHyperSpaceMap(IN IRQL OldIrql)
#define CONTAINING_RECORD(ptr, type, member)
PMMPTE MiGetPtePointer(IN uintptr_t va)
#define PhysicalFrameSize
enum _PFN_STATE PFN_STATE
#define PPFN_TO_INDEX(PPFN)
struct _MM_PFN_DATABASE MM_PFN_DATABASE
struct _PFN_ENTRY PFN_ENTRY
FORCEINLINE void * kmemset(void *dest, int64_t val, uint64_t len)
#define PhysicalMemoryOffset
#define INDEX_TO_PPFN(Index)
#define MI_WRITE_PTE(_PtePointer, _Va, _Pa, _Flags)
struct _PFN_ENTRY * PPFN_ENTRY
FORCEINLINE PDOUBLY_LINKED_LIST RemoveHeadList(PDOUBLY_LINKED_LIST Head)
FORCEINLINE void InitializeListHead(PDOUBLY_LINKED_LIST Head)
FORCEINLINE void InsertTailList(PDOUBLY_LINKED_LIST Head, PDOUBLY_LINKED_LIST Entry)
struct _SPINLOCK SPINLOCK
FORCEINLINE void RemoveEntryList(PDOUBLY_LINKED_LIST Entry)
#define MT_GENERAL_FAILURE
PAGE_INDEX MiRequestPhysicalPage(IN PFN_STATE ListType)
void MiUnlinkPageFromList(PPFN_ENTRY pfn)
void MiReleasePhysicalPage(IN PAGE_INDEX PfnIndex)
bool MmPfnDatabaseInitialized
MM_PFN_DATABASE PfnDatabase
MTSTATUS MiInitializePfnDatabase(IN PBOOT_INFO BootInfo)
void MsAcquireSpinlock(IN PSPINLOCK lock, IN PIRQL OldIrql)
void MsReleaseSpinlock(IN PSPINLOCK lock, IN IRQL OldIrql)
EFI_MEMORY_DESCRIPTOR * MemoryMap
struct _DOUBLY_LINKED_LIST * Blink
struct _DOUBLY_LINKED_LIST * Flink
struct _MMPTE::@172372265215056352375070220246156106027174106113::@200357034104227323320222006243127050212100105247 Hard
union _PFN_ENTRY::@217024126340164016372152071216274230164113211246 Descriptor
volatile uint32_t RefCount
struct _PFN_ENTRY::@217024126340164016372152071216274230164113211246::@301110335271023021153236134322146064331241142124 Mapping
struct _DOUBLY_LINKED_LIST ListEntry