diff --git a/xtoskrnl/includes/mm/pfn.hh b/xtoskrnl/includes/mm/pfn.hh index 072184e..0839d80 100644 --- a/xtoskrnl/includes/mm/pfn.hh +++ b/xtoskrnl/includes/mm/pfn.hh @@ -40,9 +40,11 @@ namespace MM STATIC XTAPI PFN_NUMBER AllocatePhysicalPage(IN ULONG Color); STATIC XTAPI VOID ComputePfnDatabaseSize(VOID); STATIC XTAPI VOID DecrementReferenceCount(IN PMMPFN Pfn1, - IN PFN_NUMBER PageFrameIndex); + IN PFN_NUMBER PageFrameIndex, + IN BOOLEAN BeginStandbyList = FALSE); STATIC XTAPI VOID DecrementShareCount(IN PMMPFN Pfn1, - IN PFN_NUMBER PageFrameIndex); + IN PFN_NUMBER PageFrameIndex, + IN BOOLEAN BeginStandbyList = FALSE); STATIC XTAPI VOID FreePhysicalPage(IN PMMPTE PointerPte); STATIC XTAPI ULONG_PTR GetHighestPhysicalPage(VOID); STATIC XTAPI ULONGLONG GetNumberOfPhysicalPages(VOID); diff --git a/xtoskrnl/mm/pfn.cc b/xtoskrnl/mm/pfn.cc index 5a03203..40e5c30 100644 --- a/xtoskrnl/mm/pfn.cc +++ b/xtoskrnl/mm/pfn.cc @@ -138,6 +138,9 @@ MM::Pfn::DecrementAvailablePages(VOID) * @param PageFrameIndex * The page frame number of the physical page. * + * @param BeginStandbyList + * Determines whether the page should be added to the beginning of the standby list. + * * @return This routine does not return any value. * * @since XT 1.0 @@ -145,7 +148,8 @@ MM::Pfn::DecrementAvailablePages(VOID) XTAPI VOID MM::Pfn::DecrementReferenceCount(IN PMMPFN PageFrameNumber, - IN PFN_NUMBER PageFrameIndex) + IN PFN_NUMBER PageFrameIndex, + IN BOOLEAN BeginStandbyList) { /* Decrement the PFN reference count */ PageFrameNumber->u3.e2.ReferenceCount--; @@ -203,7 +207,15 @@ MM::Pfn::DecrementReferenceCount(IN PMMPFN PageFrameNumber, else { /* Link clean page to the standby list */ - LinkPage(&StandbyPagesList, PageFrameIndex); + if(BeginStandbyList) + { + UNIMPLEMENTED; + } + else + { + /* Link clean page to the end of the standby list */ + LinkPage(&StandbyPagesList, PageFrameIndex); + } } } } @@ -217,6 +229,9 @@ MM::Pfn::DecrementReferenceCount(IN PMMPFN PageFrameNumber, * @param PageFrameIndex * The page frame number of the physical page. * + * @param BeginStandbyList + * Determines whether the page should be added to the beginning of the standby list. + * * @return This routine does not return any value. * * @since XT 1.0 @@ -224,7 +239,8 @@ MM::Pfn::DecrementReferenceCount(IN PMMPFN PageFrameNumber, XTAPI VOID MM::Pfn::DecrementShareCount(IN PMMPFN PageFrameNumber, - IN PFN_NUMBER PageFrameIndex) + IN PFN_NUMBER PageFrameIndex, + IN BOOLEAN BeginStandbyList) { /* Ensure the page is in a valid state */ if((PageFrameNumber->u3.e1.PageLocation != ActiveAndValid) && @@ -280,7 +296,7 @@ MM::Pfn::DecrementShareCount(IN PMMPFN PageFrameNumber, else { /* The PTE can not be removed yet, decrement the reference count */ - DecrementReferenceCount(PageFrameNumber, PageFrameIndex); + DecrementReferenceCount(PageFrameNumber, PageFrameIndex, BeginStandbyList); } } else @@ -317,13 +333,13 @@ MM::Pfn::FreePhysicalPage(IN PMMPTE PointerPte) PageTableFrame = MM::Pfn::GetPfnEntry(PageTableFrameNumber); /* Decrement the share count of the page table */ - MM::Pfn::DecrementShareCount(PageTableFrame, PageTableFrameNumber); + MM::Pfn::DecrementShareCount(PageTableFrame, PageTableFrameNumber, FALSE); /* Mark the PTE as being ready for removal */ MM::Paging::SetPte(PageFrame->PteAddress, MM::Paging::GetPte(PageFrame->PteAddress) | 1); /* Decrement the share count of the page */ - MM::Pfn::DecrementShareCount(PageFrame, PageFrameNumber); + MM::Pfn::DecrementShareCount(PageFrame, PageFrameNumber, FALSE); } /**