62 uint64_t highest_addr = 0;
66 for (
size_t i = 0; i < entry_count; i++) {
70 if (region_end > highest_addr) highest_addr = region_end;
90 for (uint64_t i = 0; i < pages; ++i) {
91 uint64_t idx = first + i;
126 uint64_t totalRam = MiGetTotalMemory(BootInfo);
132 uint64_t neededRam = totalPfnEntries *
sizeof(
PFN_ENTRY);
133 assert((neededRam) < INT32_MAX,
"Needed Ram DB is insanely huge");
137 size_t entryCount = BootInfo->MapSize / BootInfo->DescriptorSize;
138 uint64_t pfnEntriesPhys = 0;
141 for (
size_t i = 0; i < entryCount; i++) {
146 if (regionSize >= neededRam) {
172 for (uint64_t i = 0; i < neededPages; i++) {
181 uint64_t pfn_region_phys = pfnEntriesPhys - (neededPages *
VirtualPageSize);
188 for (uint64_t i = 0; i < totalPfnEntries; i++) {
207 PfnDatabase.StandbyPageList.PfnListLock.locked = 0;
210 PfnDatabase.ModifiedPageList.PfnListLock.locked = 0;
217 desc = BootInfo->MemoryMap;
218 for (
size_t i = 0; i < entryCount; i++) {
223 for (uint64_t p = 0; p < regionPages; p++) {
231 if (currentPfnIndex > lastPfnIdx) {
232 lastPfnIdx = currentPfnIndex;
235 if (currentPfnIndex >=
PfnDatabase.TotalPageCount) {
244 if (physAddr >= pfn_region_phys && physAddr < pfn_region_phys + neededPages *
VirtualPageSize) {
252 switch (desc->
Type) {
325 if (!pListEntry)
return NULL;
369 pfn = MiReleaseAnyPage(&
PfnDatabase.ZeroedPageList.ListEntry);
379 pfn = MiReleaseAnyPage(&
PfnDatabase.FreePageList.ListEntry);
389 pfn = MiReleaseAnyPage(&
PfnDatabase.StandbyPageList.ListEntry);
435asm(
".global MiReleasePhysicalPage_start\n"
436 "MiReleasePhysicalPage_start:\n");
465 assert((pfn->
RefCount) > 0,
"Refcount is 0 while releasing. Double Free");
511asm(
".global MiReleasePhysicalPage_end\n"
512 "MiReleasePhysicalPage_end:\n");
523 uintptr_t a = (uintptr_t)VirtualAddress;
526 return (a >= s) && (a < e);
539 volatile uint64_t* count = NULL;
542 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 UNREFERENCED_PARAMETER(x)
#define CONTAINING_RECORD(ptr, type, member)
PMMPTE MiGetPtePointer(IN uintptr_t va)
bool MiAtomicSetTransitionPte(IN PMMPTE Pte, IN PAGE_INDEX Pfn)
#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)
NOINLINE void MiReleasePhysicalPage(IN PAGE_INDEX PfnIndex)
void MiUnlinkPageFromList(PPFN_ENTRY pfn)
char MiReleasePhysicalPage_end
bool MmPfnDatabaseInitialized
bool MiIsWithinBoundsOfReleasePhysicalPage(void *VirtualAddress)
uint64_t MmTotalUsableMemory
MM_PFN_DATABASE PfnDatabase
char MiReleasePhysicalPage_start
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