Main Page | Class Hierarchy | Class List | File List | Class Members | File Members

setdirty.c File Reference

#include "mi.h"

Go to the source code of this file.

Functions

VOID MiSetDirtyBit (IN PVOID FaultingAddress, IN PMMPTE PointerPte, IN ULONG PfnHeld)


Function Documentation

VOID MiSetDirtyBit IN PVOID  FaultingAddress,
IN PMMPTE  PointerPte,
IN ULONG  PfnHeld
 

Definition at line 29 of file ppc/setdirty.c.

References MI_PFN_ELEMENT, MI_SET_ACCESSED_IN_PTE, MiReleasePageFileSpace(), MM_PTE_DIRTY, _MMPFN::OriginalPte, TRUE, _MMPTE::u, and _MMPFN::u3.

00037 : 00038 00039 This routine sets dirty in the specified PTE and the modify bit in the 00040 correpsonding PFN element. If any page file space is allocated, it 00041 is deallocated. 00042 00043 Arguments: 00044 00045 FaultingAddress - Supplies the faulting address. 00046 00047 PointerPte - Supplies a pointer to the corresponding valid PTE. 00048 00049 PfnHeld - Supplies TRUE if the PFN mutex is already held. 00050 00051 Return Value: 00052 00053 None. 00054 00055 Environment: 00056 00057 Kernel mode, APC's disabled, Working set mutex held. 00058 00059 --*/ 00060 00061 { 00062 MMPTE TempPte; 00063 ULONG PageFrameIndex; 00064 PMMPFN Pfn1; 00065 KIRQL OldIrql; 00066 00067 // 00068 // The page is NOT copy on write, update the PTE setting both the 00069 // dirty bit and the accessed bit. Note, that as this PTE is in 00070 // the TB, the TB must be flushed. 00071 // 00072 00073 PageFrameIndex = PointerPte->u.Hard.PageFrameNumber; 00074 Pfn1 = MI_PFN_ELEMENT (PageFrameIndex); 00075 00076 TempPte = *PointerPte; 00077 TempPte.u.Hard.Dirty = MM_PTE_DIRTY; 00078 MI_SET_ACCESSED_IN_PTE (&TempPte, 1); 00079 *PointerPte = TempPte; 00080 00081 // 00082 // Check state of PFN mutex and if not held, don't update PFN database. 00083 // 00084 00085 00086 if (PfnHeld) { 00087 00088 // 00089 // Set the modified field in the PFN database, also, if the phyiscal 00090 // page is currently in a paging file, free up the page file space 00091 // as the contents are now worthless. 00092 // 00093 00094 if ((Pfn1->OriginalPte.u.Soft.Prototype == 0) && 00095 (Pfn1->u3.e1.WriteInProgress == 0)) { 00096 00097 // 00098 // This page is in page file format, deallocate the page file space. 00099 // 00100 00101 MiReleasePageFileSpace (Pfn1->OriginalPte); 00102 00103 // 00104 // Change original PTE to indicate no page file space is reserved, 00105 // otherwise the space will be deallocated when the PTE is 00106 // deleted. 00107 // 00108 00109 Pfn1->OriginalPte.u.Soft.PageFileHigh = 0; 00110 } 00111 00112 Pfn1->u3.e1.Modified = 1; 00113 } 00114 00115 // 00116 // The TB entry must be flushed as the valid PTE with the dirty bit clear 00117 // has been fetched into the TB. If it isn't flushed, another fault 00118 // is generated as the dirty bit is not set in the cached TB entry. 00119 // 00120 00121 KeFillEntryTb ((PHARDWARE_PTE)PointerPte, FaultingAddress, TRUE); 00122 00123 return; 00124 } }


Generated on Sat May 15 19:45:38 2004 for test by doxygen 1.3.7