diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h index 1b7a0e6e933..dc5ca209ca7 100644 --- a/reactos/ntoskrnl/include/internal/mm.h +++ b/reactos/ntoskrnl/include/internal/mm.h @@ -293,7 +293,6 @@ PVOID MmFindGap(PMADDRESS_SPACE AddressSpace, ULONG Length); VOID ExUnmapPage(PVOID Addr); PVOID ExAllocatePage(VOID); -VOID MmInitPagingFile(VOID); BOOLEAN MmReserveSwapPages(ULONG Nr); VOID MmDereserveSwapPages(ULONG Nr); SWAPENTRY MmAllocSwapPage(VOID); @@ -467,6 +466,8 @@ VOID MmSetPageProtect(struct _EPROCESS* Process, BOOLEAN MmIsPagePresent(struct _EPROCESS* Process, PVOID Address); +VOID MmInitGlobalKernelPageDirectory(VOID); + /* Memory balancing. */ VOID MmInitializeMemoryConsumer(ULONG Consumer, diff --git a/reactos/ntoskrnl/mm/i386/page.c b/reactos/ntoskrnl/mm/i386/page.c index 6064cd6f5a5..40ae991f72f 100644 --- a/reactos/ntoskrnl/mm/i386/page.c +++ b/reactos/ntoskrnl/mm/i386/page.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: page.c,v 1.49 2003/05/08 05:26:36 gvg Exp $ +/* $Id: page.c,v 1.50 2003/05/17 13:45:04 hbirr Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/i386/page.c @@ -135,9 +135,7 @@ NTSTATUS MmCopyMmInfo(PEPROCESS Src, PEPROCESS Dest) { PHYSICAL_ADDRESS PhysPageDirectory; PULONG PageDirectory; - PULONG CurrentPageDirectory; PKPROCESS KProcess = &Dest->Pcb; - ULONG i; DPRINT("MmCopyMmInfo(Src %x, Dest %x)\n", Src, Dest); @@ -148,17 +146,12 @@ NTSTATUS MmCopyMmInfo(PEPROCESS Src, PEPROCESS Dest) } PhysPageDirectory = MmGetPhysicalAddress(PageDirectory); KProcess->DirectoryTableBase = PhysPageDirectory; - CurrentPageDirectory = (PULONG)PAGEDIRECTORY_MAP; - memset(PageDirectory,0,PAGE_SIZE); - for (i=768; i<896; i++) - { - PageDirectory[i] = CurrentPageDirectory[i]; - } - for (i=961; i<1024; i++) - { - PageDirectory[i] = CurrentPageDirectory[i]; - } + memset(PageDirectory,0, ADDR_TO_PDE_OFFSET(KERNEL_BASE) * sizeof(ULONG)); + memcpy(PageDirectory + ADDR_TO_PDE_OFFSET(KERNEL_BASE), + MmGlobalKernelPageDirectory + ADDR_TO_PDE_OFFSET(KERNEL_BASE), + (1024 - ADDR_TO_PDE_OFFSET(KERNEL_BASE)) * sizeof(ULONG)); + DPRINT("Addr %x\n",PAGETABLE_MAP / (4*1024*1024)); PageDirectory[PAGETABLE_MAP / (4*1024*1024)] = PhysPageDirectory.u.LowPart | PA_PRESENT | PA_READWRITE; @@ -805,13 +798,27 @@ BOOLEAN MmIsAccessedAndResetAccessPage(PEPROCESS Process, PVOID Address) { PULONG PageEntry; - PEPROCESS CurrentProcess = PsGetCurrentProcess(); + PEPROCESS CurrentProcess; BOOLEAN Accessed; - if (Process != CurrentProcess) + if (Process) { - KeAttachProcess(Process); + CurrentProcess = PsGetCurrentProcess(); + if (Process != CurrentProcess) + { + KeAttachProcess(Process); + } } + else + { + if (((ULONG)Address & ~0xFFF) < KERNEL_BASE) + { + DPRINT1("MmIsAccessedAndResetAccessPage is called for user space without a process.\n"); + KeBugCheck(0); + } + CurrentProcess = NULL; + } + PageEntry = MmGetPageEntry(Address); Accessed = (*PageEntry) & PA_ACCESSED; if (Accessed) @@ -830,11 +837,24 @@ MmIsAccessedAndResetAccessPage(PEPROCESS Process, PVOID Address) VOID MmSetCleanPage(PEPROCESS Process, PVOID Address) { PULONG PageEntry; - PEPROCESS CurrentProcess = PsGetCurrentProcess(); - - if (Process != CurrentProcess) + PEPROCESS CurrentProcess; + + if (Process) { - KeAttachProcess(Process); + CurrentProcess = PsGetCurrentProcess(); + if (Process != CurrentProcess) + { + KeAttachProcess(Process); + } + } + else + { + if (((ULONG)Address & ~0xFFF) < KERNEL_BASE) + { + DPRINT1("MmSetCleanPage is called for user space without a process.\n"); + KeBugCheck(0); + } + CurrentProcess = NULL; } PageEntry = MmGetPageEntry(Address); (*PageEntry) = (*PageEntry) & (~PA_DIRTY); @@ -848,11 +868,24 @@ VOID MmSetCleanPage(PEPROCESS Process, PVOID Address) VOID MmSetDirtyPage(PEPROCESS Process, PVOID Address) { PULONG PageEntry; - PEPROCESS CurrentProcess = PsGetCurrentProcess(); - - if (Process != CurrentProcess) + PEPROCESS CurrentProcess = NULL; + + if (Process) { - KeAttachProcess(Process); + CurrentProcess = PsGetCurrentProcess(); + if (Process != CurrentProcess) + { + KeAttachProcess(Process); + } + } + else + { + if (((ULONG)Address & ~0xFFF) < KERNEL_BASE) + { + DPRINT1("MmSetDirtyPage is called for user space without a process.\n"); + KeBugCheck(0); + } + CurrentProcess = NULL; } PageEntry = MmGetPageEntry(Address); (*PageEntry) = (*PageEntry) | PA_DIRTY; @@ -950,7 +983,7 @@ MmCreateVirtualMappingForKernel(PVOID Address, *Pte = PhysicalAddress.QuadPart | Attributes; if (Process != NULL && Process->AddressSpace.PageTableRefCountTable != NULL && - ADDR_TO_PAGE_TABLE(Address) < 768 && + Address < (PVOID)KERNEL_BASE && Attributes & PA_PRESENT) { PUSHORT Ptrc; @@ -1021,7 +1054,7 @@ MmCreatePageFileMapping(PEPROCESS Process, *Pte = SwapEntry << 1; if (Process != NULL && Process->AddressSpace.PageTableRefCountTable != NULL && - ADDR_TO_PAGE_TABLE(Address) < 768) + Address < (PVOID)KERNEL_BASE) { PUSHORT Ptrc; @@ -1104,7 +1137,7 @@ MmCreateVirtualMappingUnsafe(PEPROCESS Process, *Pte = PhysicalAddress.QuadPart | Attributes; if (Process != NULL && Process->AddressSpace.PageTableRefCountTable != NULL && - ADDR_TO_PAGE_TABLE(Address) < 768 && + Address < (PVOID)KERNEL_BASE && Attributes & PA_PRESENT) { PUSHORT Ptrc; @@ -1224,4 +1257,20 @@ MmUpdatePageDir(PULONG LocalPageDir, PVOID Address) } } +VOID +MmInitGlobalKernelPageDirectory(VOID) +{ + ULONG i; + PULONG CurrentPageDirectory = (PULONG)PAGEDIRECTORY_MAP; + + for (i = ADDR_TO_PDE_OFFSET(KERNEL_BASE); i < 1024; i++) + { + if (i != ADDR_TO_PDE_OFFSET(PAGETABLE_MAP) && + 0 == MmGlobalKernelPageDirectory[i] && 0 != CurrentPageDirectory[i]) + { + MmGlobalKernelPageDirectory[i] = CurrentPageDirectory[i]; + } + } +} + /* EOF */ diff --git a/reactos/ntoskrnl/mm/mminit.c b/reactos/ntoskrnl/mm/mminit.c index 3e6fd464566..82cf9197bc1 100644 --- a/reactos/ntoskrnl/mm/mminit.c +++ b/reactos/ntoskrnl/mm/mminit.c @@ -1,4 +1,4 @@ -/* $Id: mminit.c,v 1.43 2003/01/11 15:26:59 hbirr Exp $ +/* $Id: mminit.c,v 1.44 2003/05/17 13:45:04 hbirr Exp $ * * COPYRIGHT: See COPYING in the top directory * PROJECT: ReactOS kernel @@ -219,6 +219,8 @@ VOID MmInit1(ULONG FirstKrnlPhysAddr, LastKrnlPhysAddr, LastKernelAddress); + MmInitGlobalKernelPageDirectory(); + if ((BIOSMemoryMap != NULL) && (AddressRangeCount > 0)) { // If we have a bios memory map, recalulate the the memory size