mirror of
https://github.com/reactos/reactos.git
synced 2024-12-27 09:34:43 +00:00
Fixed reference counting of page tables
Don't print addresses that aren't in the text segment of a module svn path=/trunk/; revision=1627
This commit is contained in:
parent
d458692c89
commit
f827a8f124
3 changed files with 31 additions and 15 deletions
|
@ -57,7 +57,8 @@ extern ULONG init_stack_top;
|
||||||
|
|
||||||
extern unsigned int _text_start__, _text_end__;
|
extern unsigned int _text_start__, _text_end__;
|
||||||
|
|
||||||
static void print_address(PVOID address)
|
STATIC BOOLEAN
|
||||||
|
print_address(PVOID address)
|
||||||
{
|
{
|
||||||
PLIST_ENTRY current_entry;
|
PLIST_ENTRY current_entry;
|
||||||
PMODULE_OBJECT current;
|
PMODULE_OBJECT current;
|
||||||
|
@ -75,12 +76,15 @@ static void print_address(PVOID address)
|
||||||
{
|
{
|
||||||
DbgPrint("<%wZ: %x>", ¤t->Name,
|
DbgPrint("<%wZ: %x>", ¤t->Name,
|
||||||
address - current->Base);
|
address - current->Base);
|
||||||
return;
|
return(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
current_entry = current_entry->Flink;
|
current_entry = current_entry->Flink;
|
||||||
}
|
}
|
||||||
|
#if 0
|
||||||
DbgPrint("<%x>", address);
|
DbgPrint("<%x>", address);
|
||||||
|
#endif
|
||||||
|
return(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
ULONG
|
ULONG
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: page.c,v 1.19 2001/02/10 22:51:11 dwelch Exp $
|
/* $Id: page.c,v 1.20 2001/02/18 17:43:32 dwelch Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top directory
|
* COPYRIGHT: See COPYING in the top directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -173,8 +173,9 @@ VOID MmFreePageTable(PEPROCESS Process, PVOID Address)
|
||||||
{
|
{
|
||||||
if (PageTable[i] != 0)
|
if (PageTable[i] != 0)
|
||||||
{
|
{
|
||||||
DbgPrint("Page table entry not clear\n");
|
DbgPrint("Page table entry not clear at %x/%x (is %x)\n",
|
||||||
KeBugCheck(0);
|
((ULONG)Address / 4*1024*1024), i, PageTable[i]);
|
||||||
|
KeBugCheck(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
npage = *(ADDR_TO_PDE(Address));
|
npage = *(ADDR_TO_PDE(Address));
|
||||||
|
@ -324,7 +325,7 @@ VOID MmDeleteVirtualMapping(PEPROCESS Process, PVOID Address, BOOL FreePage)
|
||||||
Ptrc = Process->AddressSpace.PageTableRefCountTable;
|
Ptrc = Process->AddressSpace.PageTableRefCountTable;
|
||||||
|
|
||||||
Ptrc[ADDR_TO_PAGE_TABLE(Address)]--;
|
Ptrc[ADDR_TO_PAGE_TABLE(Address)]--;
|
||||||
#if 0
|
#if 1
|
||||||
if (Ptrc[ADDR_TO_PAGE_TABLE(Address)] == 0)
|
if (Ptrc[ADDR_TO_PAGE_TABLE(Address)] == 0)
|
||||||
{
|
{
|
||||||
MmFreePageTable(Process, Address);
|
MmFreePageTable(Process, Address);
|
||||||
|
@ -441,9 +442,20 @@ NTSTATUS MmCreateVirtualMapping(PEPROCESS Process,
|
||||||
|
|
||||||
if (!MmIsUsablePage((PVOID)PhysicalAddress))
|
if (!MmIsUsablePage((PVOID)PhysicalAddress))
|
||||||
{
|
{
|
||||||
|
DPRINT1("Page not usable\n");
|
||||||
KeBugCheck(0);
|
KeBugCheck(0);
|
||||||
}
|
}
|
||||||
|
if (Process == NULL && Address < (PVOID)KERNEL_BASE)
|
||||||
|
{
|
||||||
|
DPRINT1("No process\n");
|
||||||
|
KeBugCheck(0);
|
||||||
|
}
|
||||||
|
if (Process != NULL && Address >= (PVOID)KERNEL_BASE)
|
||||||
|
{
|
||||||
|
DPRINT1("Setting kernel address with process context\n");
|
||||||
|
KeBugCheck(0);
|
||||||
|
}
|
||||||
|
|
||||||
Attributes = ProtectToPTE(flProtect);
|
Attributes = ProtectToPTE(flProtect);
|
||||||
|
|
||||||
if (Process != NULL && Process != CurrentProcess)
|
if (Process != NULL && Process != CurrentProcess)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: section.c,v 1.46 2001/02/14 02:53:53 dwelch Exp $
|
/* $Id: section.c,v 1.47 2001/02/18 17:43:32 dwelch Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -218,7 +218,7 @@ MmWaitForPendingOperationSection(PMADDRESS_SPACE AddressSpace,
|
||||||
* and have a reference to a page containing valid data for the
|
* and have a reference to a page containing valid data for the
|
||||||
* section offset. Set the page and return success.
|
* section offset. Set the page and return success.
|
||||||
*/
|
*/
|
||||||
Status = MmCreateVirtualMapping(NULL,
|
Status = MmCreateVirtualMapping(PsGetCurrentProcess(),
|
||||||
Address,
|
Address,
|
||||||
Attributes,
|
Attributes,
|
||||||
(ULONG)Page);
|
(ULONG)Page);
|
||||||
|
@ -294,7 +294,7 @@ MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace,
|
||||||
/*
|
/*
|
||||||
* Just map the desired physical page
|
* Just map the desired physical page
|
||||||
*/
|
*/
|
||||||
Status = MmCreateVirtualMapping(NULL,
|
Status = MmCreateVirtualMapping(PsGetCurrentProcess(),
|
||||||
Address,
|
Address,
|
||||||
MemoryArea->Attributes,
|
MemoryArea->Attributes,
|
||||||
Offset.QuadPart);
|
Offset.QuadPart);
|
||||||
|
@ -329,7 +329,7 @@ MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace,
|
||||||
MmLockSectionSegment(Segment);
|
MmLockSectionSegment(Segment);
|
||||||
Page = MmAllocPage(0);
|
Page = MmAllocPage(0);
|
||||||
}
|
}
|
||||||
Status = MmCreateVirtualMapping(NULL,
|
Status = MmCreateVirtualMapping(PsGetCurrentProcess(),
|
||||||
Address,
|
Address,
|
||||||
MemoryArea->Attributes,
|
MemoryArea->Attributes,
|
||||||
(ULONG)Page);
|
(ULONG)Page);
|
||||||
|
@ -406,7 +406,7 @@ MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace,
|
||||||
Page = (PVOID)Entry;
|
Page = (PVOID)Entry;
|
||||||
MmReferencePage(Page);
|
MmReferencePage(Page);
|
||||||
|
|
||||||
Status = MmCreateVirtualMapping(NULL,
|
Status = MmCreateVirtualMapping(PsGetCurrentProcess(),
|
||||||
Address,
|
Address,
|
||||||
Attributes,
|
Attributes,
|
||||||
(ULONG)Page);
|
(ULONG)Page);
|
||||||
|
@ -500,7 +500,7 @@ MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace,
|
||||||
*/
|
*/
|
||||||
MmSetWaitPage(Page);
|
MmSetWaitPage(Page);
|
||||||
|
|
||||||
Status = MmCreateVirtualMapping(NULL,
|
Status = MmCreateVirtualMapping(PsGetCurrentProcess(),
|
||||||
Address,
|
Address,
|
||||||
Attributes,
|
Attributes,
|
||||||
(ULONG)Page);
|
(ULONG)Page);
|
||||||
|
@ -541,7 +541,7 @@ MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace,
|
||||||
Page = (PVOID)Entry;
|
Page = (PVOID)Entry;
|
||||||
MmReferencePage(Page);
|
MmReferencePage(Page);
|
||||||
|
|
||||||
Status = MmCreateVirtualMapping(NULL,
|
Status = MmCreateVirtualMapping(PsGetCurrentProcess(),
|
||||||
Address,
|
Address,
|
||||||
Attributes,
|
Attributes,
|
||||||
(ULONG)Page);
|
(ULONG)Page);
|
||||||
|
@ -626,7 +626,7 @@ MmAccessFaultSectionView(PMADDRESS_SPACE AddressSpace,
|
||||||
memcpy(NewAddress, (PVOID)PAGE_ROUND_DOWN(Address), PAGESIZE);
|
memcpy(NewAddress, (PVOID)PAGE_ROUND_DOWN(Address), PAGESIZE);
|
||||||
ExUnmapPage(NewAddress);
|
ExUnmapPage(NewAddress);
|
||||||
|
|
||||||
Status = MmCreateVirtualMapping(NULL,
|
Status = MmCreateVirtualMapping(PsGetCurrentProcess(),
|
||||||
Address,
|
Address,
|
||||||
MemoryArea->Attributes,
|
MemoryArea->Attributes,
|
||||||
(ULONG)NewPage);
|
(ULONG)NewPage);
|
||||||
|
|
Loading…
Reference in a new issue