Commit in reactos/ntoskrnl on MAIN
mm/freelist.c+153-1981.78 -> 1.79
ke/i386/multiboot.S+11-411.23 -> 1.24
+164-239
2 modified files
- Rewrote MmInitializePageList. It isn't necessary to setup the pde's 
  for the largest memory configuration at boot time. 
- Made the parts of the page directory map inaccessible from user mode 
  which are setup at boot time.

reactos/ntoskrnl/mm
freelist.c 1.78 -> 1.79
diff -u -r1.78 -r1.79
--- freelist.c	15 Aug 2004 16:39:06 -0000	1.78
+++ freelist.c	19 Aug 2004 22:14:30 -0000	1.79
@@ -241,92 +241,47 @@
    return start;
 }
 
-VOID INIT_FUNCTION
-MiParseRangeToFreeList(PADDRESS_RANGE Range)
-{
-   ULONG i, first, last;
-
-   /* FIXME: Not 64-bit ready */
-
-   DPRINT("Range going to free list (Base 0x%X, Length 0x%X, Type 0x%X)\n",
-          Range->BaseAddrLow,
-          Range->LengthLow,
-          Range->Type);
-
-   first = (Range->BaseAddrLow + PAGE_SIZE - 1) / PAGE_SIZE;
-   last = first + ((Range->LengthLow + PAGE_SIZE - 1) / PAGE_SIZE);
-   for (i = first; i < last && i < MmPageArraySize; i++)
-   {
-      if (MmPageArray[i].Flags.Type == 0)
-      {
-         MmPageArray[i].Flags.Type = MM_PHYSICAL_PAGE_FREE;
-	 MmPageArray[i].Flags.Zero = 0;
-         MmPageArray[i].ReferenceCount = 0;
-         InsertTailList(&FreeUnzeroedPageListHead,
-                        &MmPageArray[i].ListEntry);
-	 MmStats.NrFreePages++;
-         UnzeroedPageCount++;
-      }
-   }
-}
-
-VOID INIT_FUNCTION
-MiParseRangeToBiosList(PADDRESS_RANGE Range)
-{
-   ULONG i, first, last;
-
-   /* FIXME: Not 64-bit ready */
-
-   DPRINT("Range going to bios list (Base 0x%X, Length 0x%X, Type 0x%X)\n",
-          Range->BaseAddrLow,
-          Range->LengthLow,
-          Range->Type);
-
-   first = (Range->BaseAddrLow + PAGE_SIZE - 1) / PAGE_SIZE;
-   last = first + ((Range->LengthLow + PAGE_SIZE - 1) / PAGE_SIZE);
-   for (i = first; i < last && i < MmPageArraySize; i++)
-   {
-      /* Remove the page from the free list if it is there */
-      if (MmPageArray[i].Flags.Type == MM_PHYSICAL_PAGE_FREE)
-      {
-         RemoveEntryList(&MmPageArray[i].ListEntry);
-	 UnzeroedPageCount--;
-	 MmStats.NrFreePages--;
-
-      }
-
-      if (MmPageArray[i].Flags.Type != MM_PHYSICAL_PAGE_BIOS)
-      {
-         MmPageArray[i].Flags.Type = MM_PHYSICAL_PAGE_BIOS;
-         MmPageArray[i].Flags.Consumer = MC_NPPOOL;
-         MmPageArray[i].ReferenceCount = 1;
-         InsertTailList(&BiosPageListHead,
-                        &MmPageArray[i].ListEntry);
-         MmStats.NrSystemPages++;
-      }
-   }
-}
 
-VOID INIT_FUNCTION
-MiParseBIOSMemoryMap(PADDRESS_RANGE BIOSMemoryMap,
-                     ULONG AddressRangeCount)
-{
-   PADDRESS_RANGE p;
+BOOLEAN
+MiIsPfnRam(PADDRESS_RANGE BIOSMemoryMap,
+           ULONG AddressRangeCount,
+	   PFN_TYPE Pfn)
+{
+   BOOLEAN IsUsable;
+   LARGE_INTEGER BaseAddress;
+   LARGE_INTEGER EndAddress;
    ULONG i;
-
-   p = BIOSMemoryMap;
-   for (i = 0; i < AddressRangeCount; i++, p++)
+   if (BIOSMemoryMap != NULL && AddressRangeCount > 0)
    {
-      if (p->Type == 1)
-      {
-         MiParseRangeToFreeList(p);
-      }
-      else
+      IsUsable = FALSE;
+      for (i = 0; i < AddressRangeCount; i++)
       {
-         MiParseRangeToBiosList(p);
+	 BaseAddress.u.LowPart = BIOSMemoryMap[i].BaseAddrLow;
+	 BaseAddress.u.HighPart = BIOSMemoryMap[i].BaseAddrHigh;
+	 EndAddress.u.LowPart = BIOSMemoryMap[i].LengthLow;
+	 EndAddress.u.HighPart = BIOSMemoryMap[i].LengthHigh;
+	 EndAddress.QuadPart += BaseAddress.QuadPart;
+	 BaseAddress.QuadPart = PAGE_ROUND_DOWN(BaseAddress.QuadPart);
+         EndAddress.QuadPart = PAGE_ROUND_UP(EndAddress.QuadPart);
+
+	 if ((BaseAddress.QuadPart >> PAGE_SHIFT) <= Pfn &&
+	     Pfn < (EndAddress.QuadPart >> PAGE_SHIFT))
+	 {
+	    if (BIOSMemoryMap[i].Type == 1)
+	    {
+	       IsUsable = TRUE;
+	    }
+	    else
+	    {
+	       return FALSE;
+	    }
+	 }
       }
+      return IsUsable;
    }
+   return TRUE;
 }
+         
 
 PVOID INIT_FUNCTION
 MmInitializePageList(PVOID FirstPhysKernelAddress,
@@ -339,7 +294,6 @@
  * FUNCTION: Initializes the page list with all pages free
  * except those known to be reserved and those used by the kernel
  * ARGUMENTS:
- *         PageBuffer = Page sized buffer
  *         FirstKernelAddress = First physical address used by the kernel
  *         LastKernelAddress = Last physical address used by the kernel
  */
@@ -347,6 +301,8 @@
    ULONG i;
    ULONG Reserved;
    NTSTATUS Status;
+   PFN_TYPE LastPage;
+   PFN_TYPE FirstUninitializedPage;
 
    DPRINT("MmInitializePageList(FirstPhysKernelAddress %x, "
           "LastPhysKernelAddress %x, "
@@ -386,64 +342,133 @@
    MmStats.NrFreePages = 0;
    MmStats.NrLockedPages = 0;
 
+   /* Preinitialize the Balancer because we need some pages for pte's */
+   MmInitializeBalancer(MemorySizeInPages, 0);
+
+   FirstUninitializedPage = (ULONG_PTR)LastPhysKernelAddress / PAGE_SIZE;
+   LastPage = MmPageArraySize;
    for (i = 0; i < Reserved; i++)
    {
       PVOID Address = (char*)(ULONG)MmPageArray + (i * PAGE_SIZE);
+      ULONG j, start, end;
       if (!MmIsPagePresent(NULL, Address))
       {
-         ULONG Pfn = ((ULONG_PTR)LastPhysKernelAddress >> PAGE_SHIFT) - Reserved + i;
-         Status =
-            MmCreateVirtualMappingUnsafe(NULL,
-                                         Address,
-                                         PAGE_READWRITE,
-					 &Pfn,
-					 1);
+         PFN_TYPE Pfn;
+         Pfn = 0;
+	 while (Pfn == 0 && LastPage > FirstUninitializedPage)
+	 {
+            /* Allocate the page from the upper end of the RAM */
+            if (MiIsPfnRam(BIOSMemoryMap, AddressRangeCount, --LastPage))
+	    {
+	       Pfn = LastPage;
+	    }
+	 }
+	 if (Pfn == 0)
+	 {
+	    Pfn = MmAllocPage(MC_NPPOOL, 0);
+            if (Pfn == 0)
+	    {
+	       KEBUGCHECK(0);
+	    }
+	 }
+         Status = MmCreateVirtualMappingForKernel(Address,
+                                                  PAGE_READWRITE,
+					          &Pfn,
+					          1);
          if (!NT_SUCCESS(Status))
          {
             DbgPrint("Unable to create virtual mapping\n");
             KEBUGCHECK(0);
          }
       }
-      memset((char*)MmPageArray + (i * PAGE_SIZE), 0, PAGE_SIZE);
-   }
-
+      memset(Address, 0, PAGE_SIZE);
+      
+      start = ((ULONG_PTR)Address - (ULONG_PTR)MmPageArray) / sizeof(PHYSICAL_PAGE);
+      end = ((ULONG_PTR)Address - (ULONG_PTR)MmPageArray + PAGE_SIZE) / sizeof(PHYSICAL_PAGE);
+
+      for (j = start; j < end && j < LastPage; j++)
+      {
+         if (MiIsPfnRam(BIOSMemoryMap, AddressRangeCount, j))
+	 {
+	    if (j == 0)
+	    {
+               /*
+                * Page zero is reserved
+                */
+               MmPageArray[0].Flags.Type = MM_PHYSICAL_PAGE_BIOS;
+               MmPageArray[0].Flags.Consumer = MC_NPPOOL;
+               MmPageArray[0].Flags.Zero = 0;
+               MmPageArray[0].ReferenceCount = 0;
+               InsertTailList(&BiosPageListHead,
+                              &MmPageArray[0].ListEntry);
+	       MmStats.NrReservedPages++;
+	    }
+	    else if (j == 1)
+	    {
+
+               /*
+                * Page one is reserved for the initial KPCR
+                */
+               MmPageArray[1].Flags.Type = MM_PHYSICAL_PAGE_BIOS;
+               MmPageArray[1].Flags.Consumer = MC_NPPOOL;
+               MmPageArray[1].Flags.Zero = 0;
+               MmPageArray[1].ReferenceCount = 0;
+               InsertTailList(&BiosPageListHead,
+                              &MmPageArray[1].ListEntry);
+	       MmStats.NrReservedPages++;
+	    }
+	    else if (j >= 0xa0000 / PAGE_SIZE && j < 0x100000 / PAGE_SIZE)
+	    {
+               MmPageArray[j].Flags.Type = MM_PHYSICAL_PAGE_BIOS;
+               MmPageArray[j].Flags.Zero = 0;
+               MmPageArray[j].Flags.Consumer = MC_NPPOOL;
+               MmPageArray[j].ReferenceCount = 1;
+               InsertTailList(&BiosPageListHead,
+                              &MmPageArray[j].ListEntry);
+	       MmStats.NrReservedPages++;
+	    }
+	    else if (j >= (ULONG)FirstPhysKernelAddress/PAGE_SIZE &&
+		     j < (ULONG)LastPhysKernelAddress/PAGE_SIZE)
+	    {
+               MmPageArray[j].Flags.Type = MM_PHYSICAL_PAGE_USED;
+               MmPageArray[j].Flags.Zero = 0;
+               MmPageArray[j].Flags.Consumer = MC_NPPOOL;
+               MmPageArray[j].ReferenceCount = 1;
+               MmPageArray[j].MapCount = 1;
+               InsertTailList(&UsedPageListHeads[MC_NPPOOL],
+                              &MmPageArray[j].ListEntry);
+	       MmStats.NrSystemPages++;
+	    }
+	    else
+	    {
+               MmPageArray[j].Flags.Type = MM_PHYSICAL_PAGE_FREE;
+               MmPageArray[j].Flags.Zero = 0;
+               MmPageArray[j].ReferenceCount = 0;
+               InsertTailList(&FreeUnzeroedPageListHead,
+                              &MmPageArray[j].ListEntry);
+               UnzeroedPageCount++;
+	       MmStats.NrFreePages++;
+	    }
+	 }
+	 else
+	 {
+            MmPageArray[j].Flags.Type = MM_PHYSICAL_PAGE_BIOS;
+            MmPageArray[j].Flags.Consumer = MC_NPPOOL;
+            MmPageArray[j].Flags.Zero = 0;
+            MmPageArray[j].ReferenceCount = 0;
+            InsertTailList(&BiosPageListHead,
+                           &MmPageArray[j].ListEntry);
+	    MmStats.NrReservedPages++;
+	 }
+      }
+      FirstUninitializedPage = j;
 
-   /*
-    * Page zero is reserved
-    */
-   MmPageArray[0].Flags.Type = MM_PHYSICAL_PAGE_BIOS;
-   MmPageArray[0].Flags.Consumer = MC_NPPOOL;
-   MmPageArray[0].Flags.Zero = 0;
-   MmPageArray[0].ReferenceCount = 0;
-   InsertTailList(&BiosPageListHead,
-                  &MmPageArray[0].ListEntry);
-
-   /*
-    * Page one is reserved for the initial KPCR
-    */
-   MmPageArray[1].Flags.Type = MM_PHYSICAL_PAGE_BIOS;
-   MmPageArray[1].Flags.Consumer = MC_NPPOOL;
-   MmPageArray[1].Flags.Zero = 0;
-   MmPageArray[1].ReferenceCount = 0;
-   InsertTailList(&BiosPageListHead,
-                  &MmPageArray[1].ListEntry);
+   }
 
-   i = 2;
-   if ((ULONG)FirstPhysKernelAddress < 0xa0000)
+   /* Add the pages from the upper end to the list */
+   for (i = LastPage; i < MmPageArraySize; i++)
    {
-      MmStats.NrFreePages += (((ULONG)FirstPhysKernelAddress/PAGE_SIZE) - 2);
-      for (; i<((ULONG)FirstPhysKernelAddress/PAGE_SIZE); i++)
-      {
-         MmPageArray[i].Flags.Type = MM_PHYSICAL_PAGE_FREE;
-	 MmPageArray[i].Flags.Zero = 0;
-         MmPageArray[i].ReferenceCount = 0;
-         InsertTailList(&FreeUnzeroedPageListHead,
-                        &MmPageArray[i].ListEntry);
-         UnzeroedPageCount++;
-      }
-      MmStats.NrSystemPages +=
-         ((((ULONG)LastPhysKernelAddress) / PAGE_SIZE) - i);
-      for (; i<((ULONG)LastPhysKernelAddress / PAGE_SIZE); i++)
+      if (MiIsPfnRam(BIOSMemoryMap, AddressRangeCount, i))
       {
          MmPageArray[i].Flags.Type = MM_PHYSICAL_PAGE_USED;
          MmPageArray[i].Flags.Zero = 0;
@@ -452,91 +477,21 @@
          MmPageArray[i].MapCount = 1;
          InsertTailList(&UsedPageListHeads[MC_NPPOOL],
                         &MmPageArray[i].ListEntry);
+	 MmStats.NrSystemPages++;
       }
-      MmStats.NrFreePages += ((0xa0000/PAGE_SIZE) - i);
-      for (; i<(0xa0000/PAGE_SIZE); i++)
-      {
-         MmPageArray[i].Flags.Type = MM_PHYSICAL_PAGE_FREE;
-	 MmPageArray[i].Flags.Zero = 0;
-         MmPageArray[i].ReferenceCount = 0;
-         InsertTailList(&FreeUnzeroedPageListHead,
-                        &MmPageArray[i].ListEntry);
-         UnzeroedPageCount++;
-      }
-      MmStats.NrReservedPages += ((0x100000/PAGE_SIZE) - i);
-      for (; i<(0x100000 / PAGE_SIZE); i++)
+      else
       {
          MmPageArray[i].Flags.Type = MM_PHYSICAL_PAGE_BIOS;
-         MmPageArray[i].Flags.Zero = 0;
          MmPageArray[i].Flags.Consumer = MC_NPPOOL;
-         MmPageArray[i].ReferenceCount = 1;
-         InsertTailList(&BiosPageListHead,
-                        &MmPageArray[i].ListEntry);
-      }
-   }
-   else
-   {
-      MmStats.NrFreePages += ((0xa0000 / PAGE_SIZE) - 2);
-      for (; i<(0xa0000 / PAGE_SIZE); i++)
-      {
-         MmPageArray[i].Flags.Type = MM_PHYSICAL_PAGE_FREE;
-	 MmPageArray[i].Flags.Zero = 0;
-         MmPageArray[i].ReferenceCount = 0;
-         InsertTailList(&FreeUnzeroedPageListHead,
-                        &MmPageArray[i].ListEntry);
-         UnzeroedPageCount++;
-      }
-      MmStats.NrReservedPages += (0x60000 / PAGE_SIZE);
-      for (; i<(0x100000 / PAGE_SIZE); i++)
-      {
-         MmPageArray[i].Flags.Type = MM_PHYSICAL_PAGE_BIOS;
          MmPageArray[i].Flags.Zero = 0;
-         MmPageArray[i].Flags.Consumer = MC_NPPOOL;
-         MmPageArray[i].ReferenceCount = 1;
-         InsertTailList(&BiosPageListHead,
-                        &MmPageArray[i].ListEntry);
-      }
-      MmStats.NrFreePages += (((ULONG)FirstPhysKernelAddress/PAGE_SIZE) - i);
-      for (; i<((ULONG)FirstPhysKernelAddress/PAGE_SIZE); i++)
-      {
-         MmPageArray[i].Flags.Type = MM_PHYSICAL_PAGE_FREE;
-	 MmPageArray[i].Flags.Zero = 0;
          MmPageArray[i].ReferenceCount = 0;
-         InsertTailList(&FreeUnzeroedPageListHead,
-                        &MmPageArray[i].ListEntry);
-         UnzeroedPageCount++;
-      }
-      MmStats.NrSystemPages +=
-         (((ULONG)LastPhysKernelAddress/PAGE_SIZE) - i);
-      for (; i<((ULONG)LastPhysKernelAddress/PAGE_SIZE); i++)
-      {
-         MmPageArray[i].Flags.Type = MM_PHYSICAL_PAGE_USED;
-         MmPageArray[i].Flags.Zero = 0;
-         MmPageArray[i].Flags.Consumer = MC_NPPOOL;
-         MmPageArray[i].ReferenceCount = 1;
-         MmPageArray[i].MapCount = 1;
-         InsertTailList(&UsedPageListHeads[MC_NPPOOL],
+         InsertTailList(&BiosPageListHead,
                         &MmPageArray[i].ListEntry);
+	 MmStats.NrReservedPages++;
       }
    }
 
-   MmStats.NrFreePages += (MemorySizeInPages - i);
-   for (; i<MemorySizeInPages; i++)
-   {
-      MmPageArray[i].Flags.Type = MM_PHYSICAL_PAGE_FREE;
-      MmPageArray[i].Flags.Zero = 0;
-      MmPageArray[i].ReferenceCount = 0;
-      InsertTailList(&FreeUnzeroedPageListHead,
-                     &MmPageArray[i].ListEntry);
-      UnzeroedPageCount++;
-   }
 
-   if ((BIOSMemoryMap != NULL) && (AddressRangeCount > 0))
-   {
-      MiParseBIOSMemoryMap(
-         BIOSMemoryMap,
-         AddressRangeCount);
-   }
 
    KeInitializeEvent(&ZeroPageThreadEvent, NotificationEvent, TRUE);
 

reactos/ntoskrnl/ke/i386
multiboot.S 1.23 -> 1.24
diff -u -r1.23 -r1.24
--- multiboot.S	14 Aug 2004 09:17:05 -0000	1.23
+++ multiboot.S	19 Aug 2004 22:14:31 -0000	1.24
@@ -107,46 +107,16 @@
 	 * Initialize the page directory
 	 */
 	movl	$V2P(startup_pagedirectory), %esi
-	movl	$(V2P(lowmem_pagetable) + 0x7), 0x0(%esi)
-	movl	$(V2P(kernel_pagetable) + 0x7), 0xC00(%esi)
-	movl	$(V2P(kernel_pagetable+4096) + 0x7), 0xC04(%esi)
-	movl	$(V2P(kernel_pagetable+2*4096) + 0x7), 0xC08(%esi)
-	movl	$(V2P(kernel_pagetable+3*4096) + 0x7), 0xC0c(%esi)
-	movl	$(V2P(kernel_pagetable+4*4096) + 0x7), 0xC10(%esi)
-	movl	$(V2P(kernel_pagetable+5*4096) + 0x7), 0xC14(%esi)
-	movl	$(V2P(kernel_pagetable+6*4096) + 0x7), 0xC18(%esi)
-	movl	$(V2P(kernel_pagetable+7*4096) + 0x7), 0xC1c(%esi)
-	movl	$(V2P(kernel_pagetable+8*4096) + 0x7), 0xC20(%esi)
-	movl	$(V2P(kernel_pagetable+9*4096) + 0x7), 0xC24(%esi)
-	movl	$(V2P(kernel_pagetable+10*4096) + 0x7), 0xC28(%esi)
-	movl	$(V2P(kernel_pagetable+11*4096) + 0x7), 0xC2c(%esi)
-	movl	$(V2P(kernel_pagetable+12*4096) + 0x7), 0xC30(%esi)
-	movl	$(V2P(kernel_pagetable+13*4096) + 0x7), 0xC34(%esi)
-	movl	$(V2P(kernel_pagetable+14*4096) + 0x7), 0xC38(%esi)
-	movl	$(V2P(kernel_pagetable+15*4096) + 0x7), 0xC3c(%esi)
-	movl	$(V2P(kernel_pagetable+16*4096) + 0x7), 0xC40(%esi)
-	movl	$(V2P(kernel_pagetable+17*4096) + 0x7), 0xC44(%esi)
-	movl	$(V2P(kernel_pagetable+18*4096) + 0x7), 0xC48(%esi)
-	movl	$(V2P(kernel_pagetable+19*4096) + 0x7), 0xC4c(%esi)
-	movl	$(V2P(kernel_pagetable+20*4096) + 0x7), 0xC50(%esi)
-	movl	$(V2P(kernel_pagetable+21*4096) + 0x7), 0xC54(%esi)
-	movl	$(V2P(kernel_pagetable+22*4096) + 0x7), 0xC58(%esi)
-	movl	$(V2P(kernel_pagetable+23*4096) + 0x7), 0xC5c(%esi)
-	movl	$(V2P(kernel_pagetable+24*4096) + 0x7), 0xC60(%esi)
-	movl	$(V2P(kernel_pagetable+25*4096) + 0x7), 0xC64(%esi)
-	movl	$(V2P(kernel_pagetable+26*4096) + 0x7), 0xC68(%esi)
-	movl	$(V2P(kernel_pagetable+27*4096) + 0x7), 0xC6c(%esi)
-	movl	$(V2P(kernel_pagetable+28*4096) + 0x7), 0xC70(%esi)
-	movl	$(V2P(kernel_pagetable+29*4096) + 0x7), 0xC74(%esi)
-	movl	$(V2P(kernel_pagetable+30*4096) + 0x7), 0xC78(%esi)
-	movl	$(V2P(kernel_pagetable+31*4096) + 0x7), 0xC7c(%esi)
+	movl	$(V2P(lowmem_pagetable) + 0x3), 0x0(%esi)
+	movl	$(V2P(kernel_pagetable) + 0x3), 0xC00(%esi)
+	movl	$(V2P(kernel_pagetable+4096) + 0x3), 0xC04(%esi)
 
-	movl	$(V2P(startup_pagedirectory) + 0x7), 0xF00(%esi) 
-	movl	$(V2P(kernelmap_pagetable) + 0x7), 0xF0C(%esi)
+	movl	$(V2P(startup_pagedirectory) + 0x3), 0xF00(%esi) 
+	movl	$(V2P(kernelmap_pagetable) + 0x3), 0xF0C(%esi)
 #ifdef MP
-	movl	$(V2P(apic_pagetable) + 0x7), 0xFEC(%esi)
+	movl	$(V2P(apic_pagetable) + 0x3), 0xFEC(%esi)
 #endif /* MP */
-	movl	$(V2P(kpcr_pagetable) + 0x7), 0xFF0(%esi)
+	movl	$(V2P(kpcr_pagetable) + 0x3), 0xFF0(%esi)
 
 	/*
 	 * Initialize the page table that maps low memory
@@ -165,7 +135,7 @@
 	 * Initialize the page table that maps kernel memory
 	 */
 	movl	$V2P(kernel_pagetable), %esi
-	movl	$0x200007, %eax
+	movl	$0x200003, %eax
 	movl	$0, %edi
 .l4:
 	movl	%eax, (%esi, %edi)
@@ -199,13 +169,13 @@
 	 */
 	movl	$V2P(kpcr_pagetable), %esi
 	movl	$0, %edi
-	movl	$0x1007, %eax
+	movl	$0x1003, %eax
 	movl	%eax, (%esi, %edi)
 
 	/*
 	 * Initialize a part of the same pagetable to map the vga frame buffer (at FF3A0000).
 	 */
-	movl	$0xa0007, %eax
+	movl	$0xa0003, %eax
 	movl	$0x20, %ecx
 	movl	$0xE80, %edi
 .l9:	
@@ -355,7 +325,7 @@
 	.fill 4096, 1, 0
 
 kernel_pagetable:
-	.fill 32*4096, 1, 0	
+	.fill 2*4096, 1, 0	
 
 kernelmap_pagetable:
 	.fill 4096, 1, 0
CVSspam 0.2.8