[ros-diffs] [akorotaev] 31568: Merge that too. Now it links, but asserts at early boot phase.

akorotaev at svn.reactos.org akorotaev at svn.reactos.org
Wed Jan 2 20:36:11 CET 2008


Author: akorotaev
Date: Wed Jan  2 22:36:10 2008
New Revision: 31568

URL: http://svn.reactos.org/svn/reactos?rev=31568&view=rev
Log:
Merge that too. Now it links, but asserts at early boot phase.

Modified:
    branches/cache_manager_rewrite/mm/i386/page.c

Modified: branches/cache_manager_rewrite/mm/i386/page.c
URL: http://svn.reactos.org/svn/reactos/branches/cache_manager_rewrite/mm/i386/page.c?rev=31568&r1=31567&r2=31568&view=diff
==============================================================================
--- branches/cache_manager_rewrite/mm/i386/page.c (original)
+++ branches/cache_manager_rewrite/mm/i386/page.c Wed Jan  2 22:36:10 2008
@@ -75,22 +75,23 @@
 
 BOOLEAN MmUnmapPageTable(PULONG Pt);
 
-VOID
-STDCALL
-MiFlushTlbIpiRoutine(PVOID Address)
-{
-   if (Address == (PVOID)0xffffffff)
+ULONG_PTR
+NTAPI
+MiFlushTlbIpiRoutine(ULONG_PTR Address)
+{
+   if (Address == (ULONG_PTR)-1)
    {
       KeFlushCurrentTb();
    }
-   else if (Address == (PVOID)0xfffffffe)
+   else if (Address == (ULONG_PTR)-2)
    {
       KeFlushCurrentTb();
    }
    else
    {
-       __invlpg(Address);
-   }
+       __invlpg((PVOID)Address);
+   }
+   return 0;
 }
 
 VOID
@@ -101,13 +102,13 @@
    {
       MmUnmapPageTable(Pt);
    }
-   if (KeNumberProcessors>1)
-   {
-      KeIpiGenericCall(MiFlushTlbIpiRoutine, Address);
-   }
-   else
-   {
-      MiFlushTlbIpiRoutine(Address);
+   if (KeNumberProcessors > 1)
+   {
+      KeIpiGenericCall(MiFlushTlbIpiRoutine, (ULONG_PTR)Address);
+   }
+   else
+   {
+      MiFlushTlbIpiRoutine((ULONG_PTR)Address);
    }
 #else
    if ((Pt && MmUnmapPageTable(Pt)) || Address >= MmSystemRangeStart)
@@ -325,17 +326,33 @@
 }
 
 NTSTATUS
+NTAPI
+MmInitializeHandBuiltProcess(IN PEPROCESS Process,
+                             IN PLARGE_INTEGER DirectoryTableBase)
+{
+    /* Share the directory base with the idle process */
+    *DirectoryTableBase = PsGetCurrentProcess()->Pcb.DirectoryTableBase;
+    
+    /* Initialize the Addresss Space */
+    MmInitializeAddressSpace(Process, (PMADDRESS_SPACE)&Process->VadRoot);
+    
+    /* The process now has an address space */
+    Process->HasAddressSpace = TRUE;
+    return STATUS_SUCCESS;
+}
+
+BOOLEAN
 STDCALL
-MmCopyMmInfo(PEPROCESS Src,
-             PEPROCESS Dest,
-             PPHYSICAL_ADDRESS DirectoryTableBase)
+MmCreateProcessAddressSpace(IN ULONG MinWs,
+                            IN PEPROCESS Process,
+                            IN PLARGE_INTEGER DirectoryTableBase)
 {
    NTSTATUS Status;
    ULONG i, j;
    PFN_TYPE Pfn[7];
    ULONG Count;
 
-   DPRINT("MmCopyMmInfo(Src %x, Dest %x)\n", Src, Dest);
+   DPRINT("MmCopyMmInfo(Src %x, Dest %x)\n", MinWs, Process);
 
    Count = Ke386Pae ? 7 : 2;
 
@@ -344,11 +361,12 @@
       Status = MmRequestPageMemoryConsumer(MC_NPPOOL, FALSE, &Pfn[i]);
       if (!NT_SUCCESS(Status))
       {
-	 for (j = 0; j < i; j++)
-	 {
-	    MmReleasePageMemoryConsumer(MC_NPPOOL, Pfn[j]);
-	 }
-	 return Status;
+          for (j = 0; j < i; j++)
+          {
+              MmReleasePageMemoryConsumer(MC_NPPOOL, Pfn[j]);
+          }
+          
+          return FALSE;
       }
    }
 
@@ -400,7 +418,7 @@
 
    DirectoryTableBase->QuadPart = PFN_TO_PTE(Pfn[0]);
    DPRINT("Finished MmCopyMmInfo(): %I64x\n", DirectoryTableBase->QuadPart);
-   return(STATUS_SUCCESS);
+   return TRUE;
 }
 
 VOID
@@ -625,7 +643,7 @@
 
    if (Address < MmSystemRangeStart && Process && Process != PsGetCurrentProcess())
    {
-      PageDir = MmCreateHyperspaceMapping(PTE_TO_PFN(Process->Pcb.DirectoryTableBase.QuadPart));
+      PageDir = MmCreateHyperspaceMapping(PTE_TO_PFN(Process->Pcb.DirectoryTableBase.LowPart));
       if (PageDir == NULL)
       {
          KEBUGCHECK(0);
@@ -1925,8 +1943,16 @@
    {
       if (!MmIsUsablePage(Pages[i]))
       {
-         DPRINT1("Page at address %x not usable\n", PFN_TO_PTE(Pages[i]));
-         KEBUGCHECK(0);
+          /* Is this an attempt to map KUSER_SHARED_DATA? */
+         if ((Address == (PVOID)0x7FFE0000) && (PageCount == 1) && (Pages[0] == 2))
+         {
+            // allow
+         }
+         else
+         {
+            DPRINT1("Page at address %x not usable\n", PFN_TO_PTE(Pages[i]));
+            KEBUGCHECK(0);
+         }
       }
    }
 




More information about the Ros-diffs mailing list