diff --git a/reactos/ntoskrnl/mm/balance.c b/reactos/ntoskrnl/mm/balance.c index 184b2a23630..8a7209b73e5 100644 --- a/reactos/ntoskrnl/mm/balance.c +++ b/reactos/ntoskrnl/mm/balance.c @@ -163,6 +163,38 @@ MiTrimMemoryConsumer(ULONG Consumer) } } +NTSTATUS +MmTrimUserMemory(ULONG Target, ULONG Priority, PULONG NrFreedPages) +{ + PFN_TYPE CurrentPage; + PFN_TYPE NextPage; + NTSTATUS Status; + + (*NrFreedPages) = 0; + + CurrentPage = MmGetLRUFirstUserPage(); + while (CurrentPage != 0 && Target > 0) + { + NextPage = MmGetLRUNextUserPage(CurrentPage); + + Status = MmPageOutPhysicalAddress(CurrentPage); + if (NT_SUCCESS(Status)) + { + DPRINT("Succeeded\n"); + Target--; + (*NrFreedPages)++; + } + else if (Status == STATUS_PAGEFILE_QUOTA) + { + MmRemoveLRUUserPage(CurrentPage); + MmInsertLRULastUserPage(CurrentPage); + } + + CurrentPage = NextPage; + } + return(STATUS_SUCCESS); +} + VOID NTAPI MmRebalanceMemoryConsumers(VOID) diff --git a/reactos/ntoskrnl/mm/kmap.c b/reactos/ntoskrnl/mm/kmap.c deleted file mode 100644 index e671088b26c..00000000000 --- a/reactos/ntoskrnl/mm/kmap.c +++ /dev/null @@ -1,58 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * FILE: ntoskrnl/mm/kmap.c - * PURPOSE: Implements the kernel memory pool - * - * PROGRAMMERS: David Welch (welch@cwcom.net) - */ - -/* INCLUDES ****************************************************************/ - -#include -#define NDEBUG -#include - -/* GLOBALS *****************************************************************/ - -/* FUNCTIONS ***************************************************************/ - -NTSTATUS -NTAPI -MiZeroPage(PFN_TYPE Page) -{ - KIRQL Irql; - PVOID TempAddress; - - Irql = KeRaiseIrqlToDpcLevel(); - TempAddress = MiMapPageToZeroInHyperSpace(Page); - if (TempAddress == NULL) - { - return(STATUS_NO_MEMORY); - } - memset(TempAddress, 0, PAGE_SIZE); - MiUnmapPagesInZeroSpace(TempAddress, 1); - KeLowerIrql(Irql); - return(STATUS_SUCCESS); -} - -NTSTATUS -NTAPI -MiCopyFromUserPage(PFN_TYPE DestPage, PVOID SourceAddress) -{ - PEPROCESS Process; - KIRQL Irql; - PVOID TempAddress; - - Process = PsGetCurrentProcess(); - TempAddress = MiMapPageInHyperSpace(Process, DestPage, &Irql); - if (TempAddress == NULL) - { - return(STATUS_NO_MEMORY); - } - memcpy(TempAddress, SourceAddress, PAGE_SIZE); - MiUnmapPageInHyperSpace(Process, TempAddress, Irql); - return(STATUS_SUCCESS); -} - -/* EOF */ diff --git a/reactos/ntoskrnl/mm/mm.c b/reactos/ntoskrnl/mm/mmfault.c similarity index 70% rename from reactos/ntoskrnl/mm/mm.c rename to reactos/ntoskrnl/mm/mmfault.c index a3332916664..e0a9c677a7e 100644 --- a/reactos/ntoskrnl/mm/mm.c +++ b/reactos/ntoskrnl/mm/mmfault.c @@ -1,30 +1,18 @@ /* * COPYRIGHT: See COPYING in the top directory * PROJECT: ReactOS kernel - * FILE: ntoskrnl/mm/mm.c + * FILE: ntoskrnl/mm/mmfault.c * PURPOSE: Kernel memory managment functions * PROGRAMMERS: David Welch (welch@cwcom.net) */ -/* INCLUDES *****************************************************************/ +/* INCLUDES *******************************************************************/ #include #define NDEBUG #include -/* GLOBALS *****************************************************************/ - -ULONG MmUserProbeAddress = 0; -PVOID MmHighestUserAddress = NULL; -PBOOLEAN Mm64BitPhysicalAddress = FALSE; -PVOID MmSystemRangeStart = NULL; -ULONG MmReadClusterSize; - -MM_STATS MmStats; - -PMMSUPPORT MmKernelAddressSpace; - -/* FUNCTIONS ****************************************************************/ +/* PRIVATE FUNCTIONS **********************************************************/ VOID FASTCALL @@ -57,54 +45,6 @@ MiSyncForContextSwitch(IN PKTHREAD Thread) KERNEL_LARGE_STACK_SIZE : KERNEL_STACK_SIZE); } -/* - * @implemented - */ -BOOLEAN NTAPI MmIsNonPagedSystemAddressValid(PVOID VirtualAddress) -{ - return MmIsAddressValid(VirtualAddress); -} - -/* - * @implemented - */ -BOOLEAN NTAPI MmIsAddressValid(PVOID VirtualAddress) -/* - * FUNCTION: Checks whether the given address is valid for a read or write - * ARGUMENTS: - * VirtualAddress = address to check - * RETURNS: True if the access would be valid - * False if the access would cause a page fault - * NOTES: This function checks whether a byte access to the page would - * succeed. Is this realistic for RISC processors which don't - * allow byte granular access? - */ -{ - MEMORY_AREA* MemoryArea; - PMMSUPPORT AddressSpace; - - if (VirtualAddress >= MmSystemRangeStart) - { - AddressSpace = MmGetKernelAddressSpace(); - } - else - { - AddressSpace = &PsGetCurrentProcess()->Vm; - } - - MmLockAddressSpace(AddressSpace); - MemoryArea = MmLocateMemoryAreaByAddress(AddressSpace, - VirtualAddress); - - if (MemoryArea == NULL || MemoryArea->DeleteInProgress) - { - MmUnlockAddressSpace(AddressSpace); - return(FALSE); - } - MmUnlockAddressSpace(AddressSpace); - return(TRUE); -} - NTSTATUS NTAPI MmpAccessFault(KPROCESSOR_MODE Mode, @@ -379,113 +319,40 @@ MmCommitPagedPoolAddress(PVOID Address, BOOLEAN Locked) return(Status); } - - -/* Miscellanea functions: they may fit somewhere else */ +/* PUBLIC FUNCTIONS ***********************************************************/ /* * @implemented */ BOOLEAN NTAPI -MmIsRecursiveIoFault (VOID) +MmIsAddressValid(IN PVOID VirtualAddress) { - PETHREAD Thread = PsGetCurrentThread(); - - return (Thread->DisablePageFaultClustering | Thread->ForwardClusterOnly); -} - -/* - * @unimplemented - */ -NTSTATUS -NTAPI -MmMapUserAddressesToPage(IN PVOID BaseAddress, - IN SIZE_T NumberOfBytes, - IN PVOID PageAddress) -{ - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; -} - -/* - * @unimplemented - */ -ULONG NTAPI -MmAdjustWorkingSetSize (ULONG Unknown0, - ULONG Unknown1, - ULONG Unknown2, - ULONG Unknown3) -{ - UNIMPLEMENTED; - return (0); -} - -/* - * @unimplemented - */ -BOOLEAN -NTAPI -MmSetAddressRangeModified ( - IN PVOID Address, - IN ULONG Length -) -{ - UNIMPLEMENTED; - return (FALSE); -} - -/* - * @unimplemented - */ -NTSTATUS -NTAPI -NtGetWriteWatch(IN HANDLE ProcessHandle, - IN ULONG Flags, - IN PVOID BaseAddress, - IN ULONG RegionSize, - IN PVOID *UserAddressArray, - OUT PULONG EntriesInUserAddressArray, - OUT PULONG Granularity) -{ - if (!EntriesInUserAddressArray || !Granularity) + MEMORY_AREA* MemoryArea; + PMMSUPPORT AddressSpace; + + DPRINT1("WARNING: %s returns bogus result\n", __FUNCTION__); + + if (VirtualAddress >= MmSystemRangeStart) { - return STATUS_ACCESS_VIOLATION; + AddressSpace = MmGetKernelAddressSpace(); } - - if (!*EntriesInUserAddressArray || !RegionSize) + else { - return STATUS_INVALID_PARAMETER; + AddressSpace = &PsGetCurrentProcess()->Vm; } - - if (!UserAddressArray) + + MmLockAddressSpace(AddressSpace); + MemoryArea = MmLocateMemoryAreaByAddress(AddressSpace, + VirtualAddress); + + if (MemoryArea == NULL || MemoryArea->DeleteInProgress) { - return STATUS_ACCESS_VIOLATION; + MmUnlockAddressSpace(AddressSpace); + return(FALSE); } - - /* HACK: Set granularity to PAGE_SIZE */ - *Granularity = PAGE_SIZE; - - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; -} - -/* - * @unimplemented - */ -NTSTATUS -NTAPI -NtResetWriteWatch(IN HANDLE ProcessHandle, - IN PVOID BaseAddress, - IN ULONG RegionSize) -{ - if (!RegionSize) - { - return STATUS_INVALID_PARAMETER; - } - - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + MmUnlockAddressSpace(AddressSpace); + return(TRUE); } /* EOF */ diff --git a/reactos/ntoskrnl/mm/mminit.c b/reactos/ntoskrnl/mm/mminit.c index 117bbcc11a3..54a8dd59f76 100644 --- a/reactos/ntoskrnl/mm/mminit.c +++ b/reactos/ntoskrnl/mm/mminit.c @@ -55,6 +55,13 @@ ULONG_PTR MiKSeg0Start, MiKSeg0End; ULONG_PTR MmPfnDatabaseEnd; PMEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptor; MEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptorOrg; +ULONG MmUserProbeAddress = 0; +PVOID MmHighestUserAddress = NULL; +PBOOLEAN Mm64BitPhysicalAddress = FALSE; +PVOID MmSystemRangeStart = NULL; +ULONG MmReadClusterSize; +MM_STATS MmStats; +PMMSUPPORT MmKernelAddressSpace; extern KMUTANT MmSystemLoadLock; extern HANDLE MpwThreadHandle; extern BOOLEAN MpwThreadShouldTerminate; diff --git a/reactos/ntoskrnl/mm/mmsup.c b/reactos/ntoskrnl/mm/mmsup.c new file mode 100644 index 00000000000..4c828cb88ab --- /dev/null +++ b/reactos/ntoskrnl/mm/mmsup.c @@ -0,0 +1,120 @@ +/* + * COPYRIGHT: See COPYING in the top directory + * PROJECT: ReactOS kernel + * FILE: ntoskrnl/mm/mmsup.c + * PURPOSE: Kernel memory managment functions + * PROGRAMMERS: David Welch (welch@cwcom.net) + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +/* PRIVATE FUNCTIONS **********************************************************/ + +NTSTATUS +NTAPI +MiZeroPage(PFN_TYPE Page) +{ + KIRQL Irql; + PVOID TempAddress; + + Irql = KeRaiseIrqlToDpcLevel(); + TempAddress = MiMapPageToZeroInHyperSpace(Page); + if (TempAddress == NULL) + { + return(STATUS_NO_MEMORY); + } + memset(TempAddress, 0, PAGE_SIZE); + MiUnmapPagesInZeroSpace(TempAddress, 1); + KeLowerIrql(Irql); + return(STATUS_SUCCESS); +} + +NTSTATUS +NTAPI +MiCopyFromUserPage(PFN_TYPE DestPage, PVOID SourceAddress) +{ + PEPROCESS Process; + KIRQL Irql; + PVOID TempAddress; + + Process = PsGetCurrentProcess(); + TempAddress = MiMapPageInHyperSpace(Process, DestPage, &Irql); + if (TempAddress == NULL) + { + return(STATUS_NO_MEMORY); + } + memcpy(TempAddress, SourceAddress, PAGE_SIZE); + MiUnmapPageInHyperSpace(Process, TempAddress, Irql); + return(STATUS_SUCCESS); +} + +/* PRIVATE FUNCTIONS **********************************************************/ + +/* Miscellanea functions: they may fit somewhere else */ + +/* + * @implemented + */ +BOOLEAN +NTAPI +MmIsRecursiveIoFault (VOID) +{ + PETHREAD Thread = PsGetCurrentThread(); + + return (Thread->DisablePageFaultClustering | Thread->ForwardClusterOnly); +} + +/* + * @unimplemented + */ +NTSTATUS +NTAPI +MmMapUserAddressesToPage(IN PVOID BaseAddress, + IN SIZE_T NumberOfBytes, + IN PVOID PageAddress) +{ + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +ULONG NTAPI +MmAdjustWorkingSetSize (ULONG Unknown0, + ULONG Unknown1, + ULONG Unknown2, + ULONG Unknown3) +{ + UNIMPLEMENTED; + return (0); +} + +/* + * @unimplemented + */ +BOOLEAN +NTAPI +MmSetAddressRangeModified ( + IN PVOID Address, + IN ULONG Length +) +{ + UNIMPLEMENTED; + return (FALSE); +} + +/* + * @implemented + */ +BOOLEAN NTAPI MmIsNonPagedSystemAddressValid(PVOID VirtualAddress) +{ + DPRINT1("WARNING: %s returns bogus result\n", __FUNCTION__); + return MmIsAddressValid(VirtualAddress); +} + +/* EOF */ diff --git a/reactos/ntoskrnl/mm/virtual.c b/reactos/ntoskrnl/mm/virtual.c index 912be98d15c..f33f5286c67 100644 --- a/reactos/ntoskrnl/mm/virtual.c +++ b/reactos/ntoskrnl/mm/virtual.c @@ -1151,4 +1151,57 @@ NtFlushVirtualMemory(IN HANDLE ProcessHandle, return STATUS_SUCCESS; } +/* + * @unimplemented + */ +NTSTATUS +NTAPI +NtGetWriteWatch(IN HANDLE ProcessHandle, + IN ULONG Flags, + IN PVOID BaseAddress, + IN ULONG RegionSize, + IN PVOID *UserAddressArray, + OUT PULONG EntriesInUserAddressArray, + OUT PULONG Granularity) +{ + if (!EntriesInUserAddressArray || !Granularity) + { + return STATUS_ACCESS_VIOLATION; + } + + if (!*EntriesInUserAddressArray || !RegionSize) + { + return STATUS_INVALID_PARAMETER; + } + + if (!UserAddressArray) + { + return STATUS_ACCESS_VIOLATION; + } + + /* HACK: Set granularity to PAGE_SIZE */ + *Granularity = PAGE_SIZE; + + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + +/* + * @unimplemented + */ +NTSTATUS +NTAPI +NtResetWriteWatch(IN HANDLE ProcessHandle, + IN PVOID BaseAddress, + IN ULONG RegionSize) +{ + if (!RegionSize) + { + return STATUS_INVALID_PARAMETER; + } + + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; +} + /* EOF */ diff --git a/reactos/ntoskrnl/mm/wset.c b/reactos/ntoskrnl/mm/wset.c deleted file mode 100644 index 51335dbdb86..00000000000 --- a/reactos/ntoskrnl/mm/wset.c +++ /dev/null @@ -1,48 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * FILE: ntoskrnl/mm/wset.c - * PURPOSE: Manages working sets - * - * PROGRAMMERS: David Welch (welch@cwcom.net) - */ - -/* INCLUDES *****************************************************************/ - -#include -#define NDEBUG -#include - -/* FUNCTIONS *****************************************************************/ - -NTSTATUS -MmTrimUserMemory(ULONG Target, ULONG Priority, PULONG NrFreedPages) -{ - PFN_TYPE CurrentPage; - PFN_TYPE NextPage; - NTSTATUS Status; - - (*NrFreedPages) = 0; - - CurrentPage = MmGetLRUFirstUserPage(); - while (CurrentPage != 0 && Target > 0) - { - NextPage = MmGetLRUNextUserPage(CurrentPage); - - Status = MmPageOutPhysicalAddress(CurrentPage); - if (NT_SUCCESS(Status)) - { - DPRINT("Succeeded\n"); - Target--; - (*NrFreedPages)++; - } - else if (Status == STATUS_PAGEFILE_QUOTA) - { - MmRemoveLRUUserPage(CurrentPage); - MmInsertLRULastUserPage(CurrentPage); - } - - CurrentPage = NextPage; - } - return(STATUS_SUCCESS); -} diff --git a/reactos/ntoskrnl/ntoskrnl-generic.rbuild b/reactos/ntoskrnl/ntoskrnl-generic.rbuild index e19b5f25bb4..78092bf7f8c 100644 --- a/reactos/ntoskrnl/ntoskrnl-generic.rbuild +++ b/reactos/ntoskrnl/ntoskrnl-generic.rbuild @@ -374,10 +374,10 @@ balance.c dbgpool.c freelist.c - kmap.c marea.c mdlsup.c - mm.c + mmfault.c + mmsup.c mminit.c mpw.c ncache.c @@ -393,7 +393,6 @@ section.c sysldr.c virtual.c - wset.c elf32.c elf64.c