ReactOS  0.4.14-dev-1025-gd1ac13c
init.c
Go to the documentation of this file.
1 /*
2  * COPYRIGHT: GPL, See COPYING in the top level directory
3  * PROJECT: ReactOS kernel
4  * FILE: ntoskrnl/mm/amd64/init.c
5  * PURPOSE: Memory Manager Initialization for amd64
6  *
7  * PROGRAMMERS: Timo kreuzer (timo.kreuzer@reactos.org)
8  * ReactOS Portable Systems Group
9  */
10 
11 /* INCLUDES ***************************************************************/
12 
13 #include <ntoskrnl.h>
14 //#define NDEBUG
15 #include <debug.h>
16 
17 #include <mm/ARM3/miarm.h>
18 
19 extern PMMPTE MmDebugPte;
20 
21 /* Helper macros */
22 #define IS_ALIGNED(addr, align) (((ULONG64)(addr) & (align - 1)) == 0)
23 #define IS_PAGE_ALIGNED(addr) IS_ALIGNED(addr, PAGE_SIZE)
24 
25 /* GLOBALS *****************************************************************/
26 
27 /* Template PTE and PDE for a kernel page */
28 MMPTE ValidKernelPde = {{PTE_VALID|PTE_READWRITE|PTE_DIRTY|PTE_ACCESSED}};
29 MMPTE ValidKernelPte = {{PTE_VALID|PTE_READWRITE|PTE_DIRTY|PTE_ACCESSED}};
30 
31 /* The same, but for local pages */
32 MMPTE ValidKernelPdeLocal = {{PTE_VALID|PTE_READWRITE|PTE_DIRTY|PTE_ACCESSED}};
33 MMPTE ValidKernelPteLocal = {{PTE_VALID|PTE_READWRITE|PTE_DIRTY|PTE_ACCESSED}};
34 
35 /* Template PDE for a demand-zero page */
38 
39 /* Template PTE for prototype page */
41  PTE_PROTOTYPE | (MI_PTE_LOOKUP_NEEDED << 32)}};
42 
43 /* Template PTE for decommited page */
45 
46 /* Address ranges */
50 
55 
57 
58 /* FUNCTIONS *****************************************************************/
59 
60 VOID
61 NTAPI
62 INIT_FUNCTION
64 {
70 
71  /* Set up session space */
73 
74  /* This is where we will load Win32k.sys and the video driver */
77 
78  /* The view starts right below the session working set (itself below
79  * the image area) */
83 
84  /* Session pool follows */
88 
89  /* And it all begins here */
91 
92  /* System view space ends at session space, so now that we know where
93  * this is, we can compute the base address of system view space itself. */
96 
97  /* Sanity checks */
100 }
101 
102 VOID
103 NTAPI
105  PVOID StartAddress,
106  PVOID EndAddress)
107 {
108  PMMPDE PointerPpe;
109  MMPDE TmplPde = ValidKernelPde;
110 
111  /* Loop the PPEs */
112  for (PointerPpe = MiAddressToPpe(StartAddress);
113  PointerPpe <= MiAddressToPpe(EndAddress);
114  PointerPpe++)
115  {
116  /* Check if its already mapped */
117  if (!PointerPpe->u.Hard.Valid)
118  {
119  /* No, map it! */
120  TmplPde.u.Hard.PageFrameNumber = MxGetNextPage(1);
121  MI_WRITE_VALID_PTE(PointerPpe, TmplPde);
122 
123  /* Zero out the page table */
124  RtlZeroMemory(MiPteToAddress(PointerPpe), PAGE_SIZE);
125  }
126  }
127 }
128 
129 VOID
130 NTAPI
132  PVOID StartAddress,
133  PVOID EndAddress)
134 {
135  PMMPDE PointerPde;
136  MMPDE TmplPde = ValidKernelPde;
137 
138  /* Loop the PDEs */
139  for (PointerPde = MiAddressToPde(StartAddress);
140  PointerPde <= MiAddressToPde(EndAddress);
141  PointerPde++)
142  {
143  /* Check if its already mapped */
144  if (!PointerPde->u.Hard.Valid)
145  {
146  /* No, map it! */
147  TmplPde.u.Hard.PageFrameNumber = MxGetNextPage(1);
148  MI_WRITE_VALID_PTE(PointerPde, TmplPde);
149 
150  /* Zero out the page table */
151  RtlZeroMemory(MiPteToAddress(PointerPde), PAGE_SIZE);
152  }
153  }
154 }
155 
156 VOID
157 NTAPI
159  PVOID StartAddress,
160  PVOID EndAddress)
161 {
162  PMMPTE PointerPte;
163  MMPTE TmplPte = ValidKernelPte;
164 
165  /* Loop the PTEs */
166  for (PointerPte = MiAddressToPte(StartAddress);
167  PointerPte <= MiAddressToPte(EndAddress);
168  PointerPte++)
169  {
170  /* Check if its already mapped */
171  if (!PointerPte->u.Hard.Valid)
172  {
173  /* No, map it! */
174  TmplPte.u.Hard.PageFrameNumber = MxGetNextPage(1);
175  MI_WRITE_VALID_PTE(PointerPte, TmplPte);
176 
177  /* Zero out the page (FIXME: not always neccessary) */
178  RtlZeroMemory(MiPteToAddress(PointerPte), PAGE_SIZE);
179  }
180  }
181 }
182 
183 VOID
184 NTAPI
185 INIT_FUNCTION
187 {
188  ULONG64 PxePhysicalAddress;
189  MMPTE TmplPte, *PointerPxe;
190  PFN_NUMBER PxePfn;
191 
192  /* Get current directory base */
193  PxePfn = ((PMMPTE)PXE_SELFMAP)->u.Hard.PageFrameNumber;
194  PxePhysicalAddress = PxePfn << PAGE_SHIFT;
195  ASSERT(PxePhysicalAddress == __readcr3());
196 
197  /* Set directory base for the system process */
198  PsGetCurrentProcess()->Pcb.DirectoryTableBase[0] = PxePhysicalAddress;
199 
200  /* Enable global pages */
202  ASSERT(__readcr4() & CR4_PGE);
203 
204  /* Loop the user mode PXEs */
205  for (PointerPxe = MiAddressToPxe(0);
206  PointerPxe <= MiAddressToPxe(MmHighestUserAddress);
207  PointerPxe++)
208  {
209  /* Zero the PXE, clear all mappings */
210  PointerPxe->u.Long = 0;
211  }
212 
213  /* Flush the TLB */
215 
216  /* Set up a template PTE */
217  TmplPte.u.Long = 0;
218  TmplPte.u.Flush.Valid = 1;
219  TmplPte.u.Flush.Write = 1;
220  HyperTemplatePte = TmplPte;
221 
222  /* Create PDPTs (72 KB) for shared system address space,
223  * skip page tables TODO: use global pages. */
224 
225  /* Loop the PXEs */
226  for (PointerPxe = MiAddressToPxe((PVOID)HYPER_SPACE);
228  PointerPxe++)
229  {
230  /* Is the PXE already valid? */
231  if (!PointerPxe->u.Hard.Valid)
232  {
233  /* It's not Initialize it */
234  TmplPte.u.Flush.PageFrameNumber = MxGetNextPage(1);
235  *PointerPxe = TmplPte;
236 
237  /* Zero the page. The PXE is the PTE for the PDPT. */
238  RtlZeroMemory(MiPteToAddress(PointerPxe), PAGE_SIZE);
239  }
240  }
241 
242  /* Map PPEs for paged pool */
244 
245  /* Setup 1 PPE for hyper space */
247 
248  /* Setup PPEs for system space view */
250 
251  /* Setup the mapping PDEs */
253 
254  /* Setup the mapping PTEs */
258 
259  /* Setup debug mapping PTE */
263 
264  /* Setup PDE and PTEs for VAD bitmap and working set list */
267 }
268 
269 VOID
270 NTAPI
271 INIT_FUNCTION
273 {
274  /* Check if this is a machine with less than 256MB of RAM, and no overide */
277  {
278  /* Force the non paged pool to be 2MB so we can reduce RAM usage */
279  MmSizeOfNonPagedPoolInBytes = 2 * 1024 * 1024;
280  }
281 
282  /* Check if the user gave a ridicuously large nonpaged pool RAM size */
284  (MmNumberOfPhysicalPages * 7 / 8))
285  {
286  /* More than 7/8ths of RAM was dedicated to nonpaged pool, ignore! */
288  }
289 
290  /* Check if no registry setting was set, or if the setting was too low */
292  {
293  /* Start with the minimum (256 KB) and add 32 KB for each MB above 4 */
297  }
298 
299  /* Check if the registy setting or our dynamic calculation was too high */
301  {
302  /* Set it to the maximum */
304  }
305 
306  /* Check if a percentage cap was set through the registry */
308  {
309  /* Don't feel like supporting this right now */
311  }
312 
313  /* Page-align the nonpaged pool size */
315 
316  /* Now, check if there was a registry size for the maximum size */
318  {
319  /* Start with the default (1MB) and add 400 KB for each MB above 4 */
323  }
324 
325  /* Don't let the maximum go too high */
327  {
328  /* Set it to the upper limit */
330  }
331 
332  /* Convert nonpaged pool size from bytes to pages */
334 
335  /* Non paged pool starts after the PFN database */
337 
338  /* Calculate the nonpaged pool expansion start region */
342 
343  /* And this is where the none paged pool ends */
346 
347  /* Map PPEs and PDEs for non paged pool (including expansion) */
350 
351  /* Map the nonpaged pool PTEs (without expansion) */
353 
354  /* Initialize the ARM3 nonpaged pool */
357 
358 }
359 
360 VOID
361 NTAPI
362 INIT_FUNCTION
364 {
365  PMMPTE PointerPte;
366  SIZE_T NonPagedSystemSize;
367 
368  /* Use the default number of system PTEs */
370  NonPagedSystemSize = (MmNumberOfSystemPtes + 1) * PAGE_SIZE;
371 
372  /* Put system PTEs at the start of the system VA space */
374  MiSystemPteSpaceEnd = (PUCHAR)MiSystemPteSpaceStart + NonPagedSystemSize;
375 
376  /* Map the PPEs and PDEs for the system PTEs */
379 
380  /* Initialize the system PTE space */
383 
384  /* Reserve system PTEs for zeroing PTEs and clear them */
388 
389  /* Set the counter to maximum */
391 }
392 
393 static
394 VOID
396  PFN_NUMBER PageFrameIndex,
397  PMMPTE PointerPte)
398 {
399  PMMPFN Pfn;
400  PMMPDE PointerPde;
401 
402  /* Get the pfn entry for this page */
403  Pfn = MiGetPfnEntry(PageFrameIndex);
404 
405  /* Check if it's valid memory */
406  if ((PageFrameIndex <= MmHighestPhysicalPage) &&
407  (MmIsAddressValid(Pfn)) &&
408  (Pfn->u3.e1.PageLocation == ActiveAndValid))
409  {
410  /* Setup the PFN entry */
411  Pfn->u1.WsIndex = 0;
412  Pfn->u2.ShareCount++;
413  Pfn->PteAddress = PointerPte;
414  Pfn->OriginalPte = *PointerPte;
417  Pfn->u3.e2.ReferenceCount = 1;
418  Pfn->u4.PteFrame = PFN_FROM_PTE(MiAddressToPte(PointerPte));
419  }
420 
421  /* Increase the shared count of the PFN entry for the PDE */
422  PointerPde = MiAddressToPde(MiPteToAddress(PointerPte));
423  Pfn = MiGetPfnEntry(PFN_FROM_PTE(PointerPde));
424  Pfn->u2.ShareCount++;
425 }
426 
427 VOID
428 NTAPI
430 {
431  PVOID Address = NULL;
432  PFN_NUMBER PageFrameIndex;
433  PMMPDE PointerPde;
434  PMMPTE PointerPte;
435  ULONG k, l;
436  PMMPFN Pfn;
437 #if (_MI_PAGING_LEVELS >= 3)
438  PMMPDE PointerPpe;
439  ULONG j;
440 #endif
441 #if (_MI_PAGING_LEVELS == 4)
442  PMMPDE PointerPxe;
443  ULONG i;
444 #endif
445 
446  /* Manual setup of the top level page directory */
447 #if (_MI_PAGING_LEVELS == 4)
448  PageFrameIndex = PFN_FROM_PTE(MiAddressToPte(PXE_BASE));
449 #elif (_MI_PAGING_LEVELS == 3)
450  PageFrameIndex = PFN_FROM_PTE(MiAddressToPte(PPE_BASE));
451 #else
452  PageFrameIndex = PFN_FROM_PTE(MiAddressToPte(PDE_BASE));
453 #endif
454  Pfn = MiGetPfnEntry(PageFrameIndex);
456  Pfn->u1.WsIndex = 0;
457  Pfn->u2.ShareCount = 1;
458  Pfn->PteAddress = NULL;
460  Pfn->u3.e2.ReferenceCount = 1;
461  Pfn->u4.PteFrame = 0;
462 
463 #if (_MI_PAGING_LEVELS == 4)
464  /* Loop all PXEs in the PML4 */
465  PointerPxe = MiAddressToPxe(Address);
466  for (i = 0; i < PXE_PER_PAGE; i++, PointerPxe++)
467  {
468  /* Skip invalid PXEs */
469  if (!PointerPxe->u.Hard.Valid) continue;
470 
471  /* Handle the PFN */
472  PageFrameIndex = PFN_FROM_PXE(PointerPxe);
473  MiSetupPfnForPageTable(PageFrameIndex, PointerPxe);
474 
475  /* Get starting VA for this PXE */
476  Address = MiPxeToAddress(PointerPxe);
477 #endif
478 #if (_MI_PAGING_LEVELS >= 3)
479  /* Loop all PPEs in this PDP */
480  PointerPpe = MiAddressToPpe(Address);
481  for (j = 0; j < PPE_PER_PAGE; j++, PointerPpe++)
482  {
483  /* Skip invalid PPEs */
484  if (!PointerPpe->u.Hard.Valid) continue;
485 
486  /* Handle the PFN */
487  PageFrameIndex = PFN_FROM_PPE(PointerPpe);
488  MiSetupPfnForPageTable(PageFrameIndex, PointerPpe);
489 
490  /* Get starting VA for this PPE */
491  Address = MiPpeToAddress(PointerPpe);
492 #endif
493  /* Loop all PDEs in this PD */
494  PointerPde = MiAddressToPde(Address);
495  for (k = 0; k < PDE_PER_PAGE; k++, PointerPde++)
496  {
497  /* Skip invalid PDEs */
498  if (!PointerPde->u.Hard.Valid) continue;
499 
500  /* Handle the PFN */
501  PageFrameIndex = PFN_FROM_PDE(PointerPde);
502  MiSetupPfnForPageTable(PageFrameIndex, PointerPde);
503 
504  /* Get starting VA for this PDE */
505  Address = MiPdeToAddress(PointerPde);
506 
507  /* Loop all PTEs in this PT */
508  PointerPte = MiAddressToPte(Address);
509  for (l = 0; l < PTE_PER_PAGE; l++, PointerPte++)
510  {
511  /* Skip invalid PTEs */
512  if (!PointerPte->u.Hard.Valid) continue;
513 
514  /* Handle the PFN */
515  PageFrameIndex = PFN_FROM_PTE(PointerPte);
516  MiSetupPfnForPageTable(PageFrameIndex, PointerPte);
517  }
518  }
519 #if (_MI_PAGING_LEVELS >= 3)
520  }
521 #endif
522 #if (_MI_PAGING_LEVELS == 4)
523  }
524 #endif
525 }
526 
527 VOID
528 NTAPI
529 INIT_FUNCTION
531  PFN_NUMBER BasePage,
532  PFN_NUMBER PageCount,
533  TYPE_OF_MEMORY MemoryType)
534 {
535  PMMPFN Pfn;
536 
537  ASSERT(!MiIsMemoryTypeInvisible(MemoryType));
538 
539  /* Check if the memory is free */
540  if (MiIsMemoryTypeFree(MemoryType))
541  {
542  /* Get the last pfn of this descriptor. Note we loop backwards */
543  Pfn = &MmPfnDatabase[BasePage + PageCount - 1];
544 
545  /* Loop all pages */
546  while (PageCount--)
547  {
548  /* Add it to the free list */
550  MiInsertPageInFreeList(BasePage + PageCount);
551 
552  /* Go to the previous page */
553  Pfn--;
554  }
555  }
556  else if (MemoryType == LoaderXIPRom)
557  {
558  Pfn = &MmPfnDatabase[BasePage];
559  while (PageCount--)
560  {
561  /* Make it a pseudo-I/O ROM mapping */
562  Pfn->PteAddress = 0;
563  Pfn->u1.Flink = 0;
564  Pfn->u2.ShareCount = 0;
565  Pfn->u3.e1.PageLocation = 0;
567  Pfn->u3.e1.Rom = 1;
568  Pfn->u3.e1.PrototypePte = 1;
569  Pfn->u3.e2.ReferenceCount = 0;
570  Pfn->u4.InPageError = 0;
571  Pfn->u4.PteFrame = 0;
572 
573  /* Advance one */
574  Pfn++;
575  }
576  }
577  else if (MemoryType == LoaderBad)
578  {
579  // FIXME: later
580  ASSERT(FALSE);
581  }
582  else
583  {
584  /* For now skip it */
585  DbgPrint("Skipping BasePage=0x%lx, PageCount=0x%lx, MemoryType=%lx\n",
586  BasePage, PageCount, MemoryType);
587  Pfn = &MmPfnDatabase[BasePage];
588  while (PageCount--)
589  {
590  /* Make an active PFN */
592 
593  /* Advance one */
594  Pfn++;
595  }
596  }
597 }
598 
599 VOID
600 NTAPI
601 INIT_FUNCTION
603 {
604  PLIST_ENTRY ListEntry;
606  PFN_NUMBER BasePage, PageCount;
607 
608  /* Map the PDEs and PPEs for the pfn database (ignore holes) */
609 #if (_MI_PAGING_LEVELS >= 3)
611 #endif
613 
614  /* First initialize the color tables */
616 
617  /* Loop the memory descriptors */
618  for (ListEntry = LoaderBlock->MemoryDescriptorListHead.Flink;
619  ListEntry != &LoaderBlock->MemoryDescriptorListHead;
620  ListEntry = ListEntry->Flink)
621  {
622  /* Get the descriptor */
623  Descriptor = CONTAINING_RECORD(ListEntry,
625  ListEntry);
626 
627  /* Skip invisible memory */
628  if (MiIsMemoryTypeInvisible(Descriptor->MemoryType)) continue;
629 
630  /* If this is the free descriptor, use the copy instead */
632 
633  /* Get the range for this descriptor */
634  BasePage = Descriptor->BasePage;
635  PageCount = Descriptor->PageCount;
636 
637  /* Map the pages for the database */
638  MiMapPTEs(&MmPfnDatabase[BasePage],
639  (PUCHAR)(&MmPfnDatabase[BasePage + PageCount]) - 1);
640 
641  /* If this was the free descriptor, skip the next step */
642  if (Descriptor == &MxOldFreeDescriptor) continue;
643 
644  /* Add this descriptor to the database */
645  MiAddDescriptorToDatabase(BasePage, PageCount, Descriptor->MemoryType);
646  }
647 
648  /* At this point the whole pfn database is mapped. We are about to add the
649  pages from the free descriptor to the database, so from now on we cannot
650  use it anymore. */
651 
652  /* Now add the free descriptor */
653  BasePage = MxFreeDescriptor->BasePage;
654  PageCount = MxFreeDescriptor->PageCount;
655  MiAddDescriptorToDatabase(BasePage, PageCount, LoaderFree);
656 
657  /* And finally the memory we used */
658  BasePage = MxOldFreeDescriptor.BasePage;
659  PageCount = MxFreeDescriptor->BasePage - BasePage;
660  MiAddDescriptorToDatabase(BasePage, PageCount, LoaderMemoryData);
661 
662  /* Reset the descriptor back so we can create the correct memory blocks */
664 }
665 
666 NTSTATUS
667 NTAPI
668 INIT_FUNCTION
670 {
671  KIRQL OldIrql;
672 
673  ASSERT(MxPfnAllocation != 0);
674 
675  /* Set some hardcoded addresses */
680 
681 
682 // PrototypePte.u.Proto.Valid = 1
683 // PrototypePte.u.ReadOnly
684 // PrototypePte.u.Prototype
685 // PrototypePte.u.Protection = MM_READWRITE;
686 // PrototypePte.u.ProtoAddress
688 
689 
691 
693 
695 
696  /* Need to be at DISPATCH_LEVEL for MiInsertPageInFreeList */
698 
699  /* Map the PFN database pages */
700  MiBuildPfnDatabase(LoaderBlock);
701 
702  /* Now process the page tables */
704 
705  /* PFNs are initialized now! */
707 
708  //KeLowerIrql(OldIrql);
709 
710  /* Need to be at DISPATCH_LEVEL for InitializePool */
711  //KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
712 
713  /* Initialize the nonpaged pool */
715 
717 
718  /* Initialize the balancer */
720 
721  /* Make sure we have everything we need */
732 
733  return STATUS_SUCCESS;
734 }
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
Definition: glfuncs.h:240
ULONG64 Valid
Definition: mmtypes.h:66
#define MM_SYSTEM_SPACE_START
Definition: mm.h:19
signed char * PCHAR
Definition: retypes.h:7
ULONG64 MxPfnSizeInBytes
Definition: init.c:51
INIT_FUNCTION VOID NTAPI InitializePool(IN POOL_TYPE PoolType, IN ULONG Threshold)
Definition: expool.c:1009
#define PDE_PER_PAGE
Definition: mm.h:21
__INTRIN_INLINE void __writecr4(unsigned int Data)
Definition: intrin_x86.h:1680
#define PAGE_SHIFT
Definition: env_spec_w32.h:45
#define IN
Definition: typedefs.h:39
MMPTE PrototypePte
Definition: init.c:40
#define MI_PFN_DATABASE
Definition: mm.h:28
#define MI_MAX_NONPAGED_POOL_SIZE
Definition: mm.h:57
#define KeRaiseIrql(irql, oldIrql)
Definition: env_spec_w32.h:597
#define MM_HAL_VA_START
Definition: ketypes.h:256
#define TRUE
Definition: types.h:120
#define PXE_PER_PAGE
VOID NTAPI MiMapPDEs(PVOID StartAddress, PVOID EndAddress)
Definition: init.c:131
#define PFN_FROM_PDE(v)
Definition: mm.h:90
#define KeLowerIrql(oldIrql)
Definition: env_spec_w32.h:602
NTSTATUS NTAPI INIT_FUNCTION MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
Definition: init.c:669
#define MI_SESSION_SIZE
Definition: mm.h:63
VOID NTAPI MiInsertPageInFreeList(IN PFN_NUMBER PageFrameIndex)
Definition: pfnlist.c:604
PVOID MiSessionPoolStart
Definition: init.c:32
INIT_FUNCTION VOID NTAPI MiInitializeNonPagedPool(VOID)
Definition: pool.c:276
#define MiAddressToPde(x)
Definition: mmx86.c:20
ULONG MmSessionSize
Definition: init.c:34
SIZE_T MmMinimumNonPagedPoolSize
Definition: mminit.c:39
#define DbgPrint
Definition: loader.c:25
PFN_NUMBER MxFreePageBase
Definition: init.c:53
PMMPTE NTAPI MiReserveSystemPtes(IN ULONG NumberOfPtes, IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType)
Definition: syspte.c:246
PVOID MiSystemPteSpaceStart
Definition: init.c:48
ULONG MmMaximumNonPagedPoolPercent
Definition: init.c:20
#define MI_VAD_BITMAP
Definition: mm.h:47
#define MM_DECOMMIT
Definition: miarm.h:63
unsigned char * PUCHAR
Definition: retypes.h:3
ULONG MmNumberOfSystemPtes
Definition: init.c:42
PVOID MiSessionImageStart
Definition: init.c:29
ULONG MmMaxAdditionNonPagedPoolPerMb
Definition: mminit.c:42
LONG NTSTATUS
Definition: precomp.h:26
FORCEINLINE PMMPTE MiAddressToPpe(PVOID Address)
Definition: mm.h:151
PFN_NUMBER Flink
Definition: mm.h:309
PVOID MmNonPagedPoolExpansionStart
Definition: init.c:25
#define MI_PTE_LOOKUP_NEEDED
Definition: miarm.h:250
BOOLEAN MiPfnsInitialized
Definition: init.c:56
HARDWARE_PTE Flush
Definition: mmtypes.h:216
PVOID MmPagedPoolEnd
Definition: init.c:26
PMMPTE MmLastReservedMappingPte
Definition: hypermap.c:20
#define MM_PTE_SOFTWARE_PROTECTION_BITS
Definition: mm.h:72
VOID NTAPI MiMapPTEs(PVOID StartAddress, PVOID EndAddress)
Definition: init.c:158
PMEMORY_ALLOCATION_DESCRIPTOR MxFreeDescriptor
Definition: init.c:46
union _MMPFN::@1747 u4
__INTRIN_INLINE unsigned long __readcr3(void)
Definition: intrin_x86.h:1706
VOID NTAPI INIT_FUNCTION MiInitializePageTable(VOID)
Definition: init.c:186
ULONG MmSessionImageSize
Definition: init.c:37
PFN_NUMBER MmAvailablePages
Definition: freelist.c:26
#define PPE_PER_PAGE
Definition: mm.h:22
struct _MMPFN::@1744::@1750 e2
USHORT PageLocation
Definition: mm.h:297
PMMPFN MmPfnDatabase
Definition: freelist.c:24
INIT_FUNCTION PFN_NUMBER NTAPI MxGetNextPage(IN PFN_NUMBER PageCount)
Definition: mminit.c:483
PVOID MmNonPagedPoolEnd
Definition: mminit.c:99
enum _TYPE_OF_MEMORY TYPE_OF_MEMORY
#define CR4_PGE
Definition: ketypes.h:91
USHORT PrototypePte
Definition: mm.h:295
UCHAR KIRQL
Definition: env_spec_w32.h:591
FORCEINLINE BOOLEAN MiIsMemoryTypeInvisible(TYPE_OF_MEMORY MemoryType)
Definition: miarm.h:683
MMPFNENTRY e1
Definition: mm.h:329
PVOID MmSessionBase
Definition: init.c:33
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
USHORT CacheAttribute
Definition: mm.h:299
#define MiAddressToPte(x)
Definition: mmx86.c:19
ULONG PFN_NUMBER
Definition: ke.h:8
PVOID MmNonPagedSystemStart
Definition: init.c:23
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: IoEaTest.cpp:117
FORCEINLINE VOID MI_WRITE_VALID_PTE(IN PMMPTE PointerPte, IN MMPTE TempPte)
Definition: miarm.h:946
ULONG MmSystemViewSize
Definition: init.c:39
ULONG_PTR ShareCount
Definition: mm.h:322
#define MI_NUMBER_SYSTEM_PTES
Definition: mm.h:76
#define PDE_BASE
Definition: winldr.c:21
Definition: arc.h:130
PMMPTE MmFirstReservedMappingPte
Definition: hypermap.c:20
ULONG MmSessionViewSize
Definition: init.c:35
PVOID MiSystemViewStart
Definition: init.c:38
VOID NTAPI INIT_FUNCTION MiInitializeSessionSpaceLayout(VOID)
Definition: init.c:63
#define PsGetCurrentProcess
Definition: psfuncs.h:17
#define MI_HYPERSPACE_PTES
Definition: mm.h:78
unsigned char BOOLEAN
smooth NULL
Definition: ftsmooth.c:416
static WCHAR Address[46]
Definition: ping.c:68
void * PVOID
Definition: retypes.h:9
VOID NTAPI MiBuildPfnDatabaseFromPageTables(VOID)
Definition: init.c:429
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
#define PCHAR
Definition: match.c:90
#define PXE_SELFMAP
r l[0]
Definition: byte_order.h:167
MMPTE HyperTemplatePte
Definition: hypermap.c:22
#define MI_DEBUG_MAPPING
Definition: mm.h:20
FORCEINLINE PMMPTE MiAddressToPxe(PVOID Address)
Definition: mm.h:161
struct _LIST_ENTRY * Flink
Definition: typedefs.h:120
PVOID MiSessionViewEnd
Definition: init.c:47
#define MI_WORKING_SET_LIST
Definition: mm.h:48
BOOLEAN MiIncludeType[LoaderMaximum]
Definition: init.c:52
#define MI_MAPPING_RANGE_END
Definition: mm.h:45
MMPTE ValidKernelPteLocal
Definition: init.c:33
VOID NTAPI INIT_FUNCTION MiAddDescriptorToDatabase(PFN_NUMBER BasePage, PFN_NUMBER PageCount, TYPE_OF_MEMORY MemoryType)
Definition: init.c:530
ULONG64 Valid
Definition: mmtypes.h:150
struct _MMPTE * PMMPTE
PVOID MiSessionSpaceEnd
Definition: init.c:27
#define MI_SESSION_IMAGE_SIZE
Definition: mm.h:61
#define PTE_PER_PAGE
Definition: mm.h:20
VOID NTAPI INIT_FUNCTION MiBuildNonPagedPool(VOID)
Definition: init.c:272
PVOID MiSessionImageEnd
Definition: init.c:28
#define PPE_BASE
MMPTE ValidKernelPte
Definition: init.c:29
ULONG MmHighestPhysicalPage
Definition: init.c:48
BOOLEAN NTAPI MmIsAddressValid(IN PVOID VirtualAddress)
Definition: mmsup.c:174
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
#define MI_MIN_PAGES_FOR_NONPAGED_POOL_TUNING
Definition: mm.h:51
union _MMPFN::@1742 u1
INIT_FUNCTION VOID NTAPI MiInitializeNonPagedPoolThresholds(VOID)
Definition: pool.c:184
#define HYPER_SPACE_END
Definition: mm.h:15
unsigned __int64 ULONG64
Definition: imports.h:198
ULONG64 PageFrameNumber
Definition: mmtypes.h:78
PVOID MmHighestUserAddress
Definition: init.c:51
#define MI_MAPPING_RANGE_START
Definition: mm.h:44
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:790
#define MM_READWRITE
Definition: inbv.c:10
ULONG64 PageFileHigh
Definition: mmtypes.h:93
PFN_NUMBER MmMaximumNonPagedPoolInPages
Definition: mminit.c:30
union _MMPTE::@2251 u
PVOID MiSystemPteSpaceEnd
Definition: init.c:49
ULONG64 MxFreePageCount
Definition: init.c:54
Definition: mm.h:305
ULONG MmMinAdditionNonPagedPoolPerMb
Definition: mminit.c:40
FORCEINLINE PVOID MiPxeToAddress(PMMPTE PointerPxe)
Definition: mm.h:225
#define PAGE_SIZE
Definition: env_spec_w32.h:49
Definition: typedefs.h:118
__INTRIN_INLINE unsigned long __readcr4(void)
Definition: intrin_x86.h:1713
INIT_FUNCTION VOID NTAPI MiInitializeSystemPtes(IN PMMPTE StartingPte, IN ULONG NumberOfPtes, IN MMSYSTEM_PTE_POOL_TYPE PoolType)
Definition: syspte.c:399
FORCEINLINE PMMPFN MiGetPfnEntry(IN PFN_NUMBER Pfn)
Definition: mm.h:940
PMMWSL MmWorkingSetList
Definition: procsup.c:21
MMPTE ValidKernelPdeLocal
Definition: init.c:32
MMPTE ValidKernelPde
Definition: init.c:28
ULONG_PTR Long
Definition: mmtypes.h:215
PVOID MmPagedPoolStart
Definition: miarm.h:584
PVOID MmNonPagedPoolStart
Definition: init.c:24
ULONG MmSessionPoolSize
Definition: init.c:36
#define DISPATCH_LEVEL
Definition: env_spec_w32.h:696
union _MMPFN::@1743 u2
ULONG_PTR SIZE_T
Definition: typedefs.h:79
static VOID MiSetupPfnForPageTable(PFN_NUMBER PageFrameIndex, PMMPTE PointerPte)
Definition: init.c:395
MMPTE_HARDWARE Hard
Definition: mmtypes.h:217
#define PXE_BASE
SIZE_T MmDefaultMaximumNonPagedPool
Definition: mminit.c:41
INIT_FUNCTION VOID NTAPI MmInitializeBalancer(ULONG NrAvailablePages, ULONG NrSystemPages)
Definition: balance.c:53
PVOID MiSessionViewStart
Definition: init.c:30
#define IS_PAGE_ALIGNED(addr)
Definition: init.c:23
ULONG_PTR PteFrame
Definition: mm.h:350
FORCEINLINE PVOID MiPdeToAddress(PMMPTE PointerPde)
Definition: mm.h:207
ULONG MmMaximumNonPagedPoolInBytes
Definition: init.c:22
USHORT Rom
Definition: mm.h:300
PMMPTE PteAddress
Definition: mm.h:318
MMPTE_SOFTWARE Soft
Definition: mmtypes.h:219
MMPTE OriginalPte
Definition: mm.h:339
ULONG MmNumberOfPhysicalPages
Definition: init.c:48
MMPDE DemandZeroPde
Definition: init.c:36
#define MI_MAX_INIT_NONPAGED_POOL_SIZE
Definition: mm.h:56
#define MI_SESSION_VIEW_END
Definition: mm.h:24
ULONG MxPfnAllocation
Definition: init.c:43
ULONG64 Write
Definition: mmtypes.h:67
ULONG WsIndex
Definition: mm.h:310
FORCEINLINE BOOLEAN MiIsMemoryTypeFree(TYPE_OF_MEMORY MemoryType)
Definition: miarm.h:673
#define MI_SYSTEM_VIEW_SIZE
Definition: mm.h:58
#define MI_SESSION_SPACE_END
Definition: mm.h:25
#define HYPER_SPACE
Definition: mm.h:14
PVOID MiSessionPoolEnd
Definition: init.c:31
FORCEINLINE PVOID MiPpeToAddress(PMMPTE PointerPpe)
Definition: mm.h:216
PVOID MmHyperSpaceEnd
Definition: init.c:56
unsigned int ULONG
Definition: retypes.h:1
#define PFN_FROM_PXE(v)
Definition: mm.h:92
#define UNIMPLEMENTED
Definition: debug.h:114
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
ULONG64 PageFrameNumber
Definition: mmtypes.h:171
PMMPTE MiFirstReservedZeroingPte
Definition: hypermap.c:21
MMPTE DemandZeroPte
Definition: init.c:37
VOID NTAPI MiMapPPEs(PVOID StartAddress, PVOID EndAddress)
Definition: init.c:104
union _MMPFN::@1744 u3
#define MI_SESSION_VIEW_SIZE
Definition: mm.h:59
#define MI_SESSION_POOL_SIZE
Definition: mm.h:60
MEMORY_ALLOCATION_DESCRIPTOR MxOldFreeDescriptor
Definition: init.c:47
ULONG_PTR InPageError
Definition: mm.h:351
ULONG MmSizeOfNonPagedPoolInBytes
Definition: init.c:21
MMPTE MmDecommittedPte
Definition: init.c:44
FORCEINLINE PVOID MiPteToAddress(PMMPTE PointerPte)
Definition: mm.h:198
#define MI_ZERO_PTES
Definition: mm.h:79
INIT_FUNCTION VOID NTAPI MiInitializeColorTables(VOID)
Definition: mminit.c:562
return STATUS_SUCCESS
Definition: btrfs.c:2938
PMMPTE MmDebugPte
Definition: mmdbg.c:33
#define PFN_FROM_PTE(v)
Definition: mm.h:89
VOID NTAPI INIT_FUNCTION MiBuildPfnDatabase(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
Definition: init.c:602
int k
Definition: mpi.c:3369
#define MI_HIGHEST_SYSTEM_ADDRESS
Definition: mm.h:31
#define PFN_FROM_PPE(v)
Definition: mm.h:91
VOID NTAPI KeFlushCurrentTb(VOID)
Definition: cpu.c:322
VOID NTAPI INIT_FUNCTION MiBuildSystemPteSpace(VOID)
Definition: init.c:363
_In_ PSTORAGE_PROPERTY_ID _Outptr_ PSTORAGE_DESCRIPTOR_HEADER * Descriptor
Definition: classpnp.h:966