Sync to trunk head (r42241)
[reactos.git] / reactos / ntoskrnl / ke / freeldr.c
index f2cbbf2..d135743 100644 (file)
 #ifdef _M_PPC
 #include <ppcmmu/mmu.h>
 #define KERNEL_RVA(x) RVA(x,0x80800000)
-#define KERNEL_DESCRIPTOR_PAGE(x) (((ULONG_PTR)x + KernelBase) >> PAGE_SHIFT)
+#define KERNEL_DESCRIPTOR_PAGE(x) (((ULONG_PTR)(x) + KernelBase) >> PAGE_SHIFT)
 #else
 #define KERNEL_RVA(x) RVA(x,KSEG0_BASE)
-#define KERNEL_DESCRIPTOR_PAGE(x) (((ULONG_PTR)x &~ KSEG0_BASE) >> PAGE_SHIFT)
+#define KERNEL_DESCRIPTOR_PAGE(x) (((ULONG_PTR)(x) & ~KSEG0_BASE) >> PAGE_SHIFT)
 #endif
 
-ULONG MmFreeLdrPageDirectoryEnd;
-
 typedef struct _BIOS_MEMORY_DESCRIPTOR
 {
     ULONG BlockBase;
@@ -31,9 +29,12 @@ typedef struct _BIOS_MEMORY_DESCRIPTOR
 
 /* GLOBALS *******************************************************************/
 
+/* Function pointer for early debug prints */
+ULONG (*FrLdrDbgPrint)(const char *Format, ...);
+
 /* FreeLDR Loader Data */
 PROS_LOADER_PARAMETER_BLOCK KeRosLoaderBlock;
-BOOLEAN AcpiTableDetected;
+BOOLEAN AcpiTableDetected = FALSE;
 ADDRESS_RANGE KeMemoryMap[64];
 ULONG KeMemoryMapRangeCount;
 
@@ -61,12 +62,12 @@ ARC_DISK_SIGNATURE BldrDiskInfo[32];                    // 0x1413C
 CHAR BldrArcHwBuffer[16 * 1024];                        // 0x1843C
 
 /* BIOS Memory Map */
-BIOS_MEMORY_DESCRIPTOR BiosMemoryDescriptors[16] = {{0}};
+BIOS_MEMORY_DESCRIPTOR BiosMemoryDescriptors[16] = { { 0, 0 }, };
 PBIOS_MEMORY_DESCRIPTOR BiosMemoryDescriptorList = BiosMemoryDescriptors;
 
 /* ARC Memory Map */
 ULONG NumberDescriptors = 0;
-MEMORY_DESCRIPTOR MDArray[60] = {{0}};
+MEMORY_DESCRIPTOR MDArray[60] = { { 0, 0, 0 }, };
 
 /* FUNCTIONS *****************************************************************/
 
@@ -75,7 +76,7 @@ NTAPI
 KiRosGetMdFromArray(VOID)
 {
     /* Return the next MD from the list, but make sure we don't overflow */
-    if (BldrCurrentMd > 60) KEBUGCHECK(0);
+    if (BldrCurrentMd > 60) ASSERT(FALSE);
     return &BldrMemoryDescriptors[BldrCurrentMd++];
 }
 
@@ -311,7 +312,7 @@ KiRosConfigureArcDescriptor(IN ULONG PageBegin,
         }
 
         /* Check if the block matches us, and we haven't tried combining yet */
-        if ((BlockType == MemoryType) && !(Combined))
+        if (((TYPE_OF_MEMORY)BlockType == MemoryType) && !(Combined))
         {
             /* Check if it starts where we end */
             if (BlockBegin == PageEnd)
@@ -479,7 +480,7 @@ KiRosBuildOsMemoryMap(VOID)
 #endif
 
     /* Build an entry for the KPCR and KUSER_SHARED_DATA */
-    Status = KiRosAllocateArcDescriptor(1, 3, LoaderMemoryData);
+    Status = KiRosAllocateArcDescriptor(1, 3, LoaderStartupPcrPage);
     if (Status != STATUS_SUCCESS) return Status;
 
     /* Build an entry for the PDE and return the status */
@@ -773,7 +774,7 @@ KiRosAllocateNtDescriptor(IN TYPE_OF_MEMORY MemoryType,
         if (MdBlock)
         {
             /* If it contains our limit as well, break out early */
-            if ((MdBlock->PageCount + MdBlock->BasePage) > AlignedLimit) break;
+            if ((MdBlock->PageCount + MdBlock->BasePage) >= AlignedLimit) break;
         }
 
         /* Loop the memory list */
@@ -871,7 +872,7 @@ KiRosBuildArcMemoryList(VOID)
 VOID
 NTAPI
 KiRosFixupComponentTree(IN PCONFIGURATION_COMPONENT_DATA p,
-                        IN ULONG i)
+                        IN ULONG_PTR i)
 {
     PCONFIGURATION_COMPONENT pp;
 
@@ -922,8 +923,6 @@ KiRosFrldrLpbToNtLpb(IN PROS_LOADER_PARAMETER_BLOCK RosLoaderBlock,
 
     /* First get some kernel-loader globals */
     AcpiTableDetected = (RosLoaderBlock->Flags & MB_FLAGS_ACPI_TABLE) ? TRUE : FALSE;
-    MmFreeLdrPageDirectoryEnd = RosLoaderBlock->PageDirectoryEnd;
-    if (!MmFreeLdrPageDirectoryEnd) MmFreeLdrPageDirectoryEnd = 0x40000;
 
     /* Set the NT Loader block and initialize it */
     *NtLoaderBlock = KeLoaderBlock = LoaderBlock = &BldrLoaderBlock;
@@ -950,7 +949,7 @@ KiRosFrldrLpbToNtLpb(IN PROS_LOADER_PARAMETER_BLOCK RosLoaderBlock,
     /* Build entries for ReactOS memory ranges, which uses ARC Descriptors */
     KiRosBuildOsMemoryMap();
 
-#ifdef _M_IX86
+#if defined(_M_IX86) || defined(_M_AMD64)
     /* Build entries for the reserved map, which uses ARC Descriptors */
     KiRosBuildReservedMemoryMap();
 #endif
@@ -1148,10 +1147,25 @@ KiRosFrldrLpbToNtLpb(IN PROS_LOADER_PARAMETER_BLOCK RosLoaderBlock,
     /* Now mark the remainder of the FreeLDR 6MB area as "in use" */
     KiRosAllocateNtDescriptor(LoaderMemoryData,
                               KERNEL_DESCRIPTOR_PAGE(RosEntry->ModEnd),
-                              KERNEL_DESCRIPTOR_PAGE((0x80800000 + 0x600000)) -
+                              KERNEL_DESCRIPTOR_PAGE((RosLoaderBlock->KernelBase + 0x600000)) -
                               KERNEL_DESCRIPTOR_PAGE(RosEntry->ModEnd),
                               0,
                               &Base);
+    
+    //
+    // Check if we have a ramdisk
+    //
+    if ((RosLoaderBlock->RdAddr) && (RosLoaderBlock->RdLength))
+    {
+        //
+        // Build a descriptor for it
+        //
+        KiRosAllocateNtDescriptor(LoaderXIPRom,
+                                  KERNEL_DESCRIPTOR_PAGE(RosLoaderBlock->RdAddr),
+                                  (RosLoaderBlock->RdLength + PAGE_SIZE - 1) >> PAGE_SHIFT,
+                                  0,
+                                  &Base);
+    }
 
     /* Setup command line */
     LoaderBlock->LoadOptions = BldrCommandLine;
@@ -1163,6 +1177,9 @@ KiRosFrldrLpbToNtLpb(IN PROS_LOADER_PARAMETER_BLOCK RosLoaderBlock,
     LoaderBlock->Extension->MajorVersion = 5;
     LoaderBlock->Extension->MinorVersion = 2;
 
+
+// FIXME FIXME FIXME NOW!!!!
+
     /* FreeLDR hackllocates 1536 static pages for the initial boot images */
     LoaderBlock->Extension->LoaderPagesSpanned = 1536 * PAGE_SIZE;
 
@@ -1176,7 +1193,7 @@ KiRosFrldrLpbToNtLpb(IN PROS_LOADER_PARAMETER_BLOCK RosLoaderBlock,
     if (LoaderBlock->SetupLdrBlock)
     {
         /* All we'll setup right now is the flag for text-mode setup */
-        LoaderBlock->SetupLdrBlock->Flags = 1;
+        LoaderBlock->SetupLdrBlock->Flags = SETUPLDR_TEXT_MODE;
     }
 
     /* Make a copy of the command line */
@@ -1286,12 +1303,15 @@ KiRosPrepareForSystemStartup(IN ULONG Dummy,
     /* Save pointer to ROS Block */
     KeRosLoaderBlock = LoaderBlock;
 
+    /* Get debugging function */
+    FrLdrDbgPrint = LoaderBlock->FrLdrDbgPrint;
+
     /* Save memory manager data */
     KeMemoryMapRangeCount = 0;
     if (LoaderBlock->Flags & MB_FLAGS_MMAP_INFO)
     {
         /* We have a memory map from the nice BIOS */
-        ent = ((PULONG)(LoaderBlock->MmapAddr - sizeof(ULONG)));
+        ent = ((PULONG)(LoaderBlock->MmapAddr - sizeof(ULONG))); // FIXME: this is ugly
         size = *ent;
         i = 0;
 
@@ -1312,20 +1332,15 @@ KiRosPrepareForSystemStartup(IN ULONG Dummy,
 
         /* Save data */
         LoaderBlock->MmapLength = KeMemoryMapRangeCount * sizeof(ADDRESS_RANGE);
-        LoaderBlock->MmapAddr = (ULONG)KeMemoryMap;
+        LoaderBlock->MmapAddr = (ULONG_PTR)KeMemoryMap;
     }
     else
     {
         /* Nothing from BIOS */
         LoaderBlock->MmapLength = 0;
-        LoaderBlock->MmapAddr = (ULONG)KeMemoryMap;
+        LoaderBlock->MmapAddr = (ULONG_PTR)KeMemoryMap;
     }
 
-#if defined(_M_IX86)
-    /* Set up the VDM Data */
-    NtEarlyInitVdm();
-#endif
-
     /* Convert the loader block */
     KiRosFrldrLpbToNtLpb(KeRosLoaderBlock, &NtLoaderBlock);
 
@@ -1334,7 +1349,7 @@ KiRosPrepareForSystemStartup(IN ULONG Dummy,
 #endif
 
     /* Do general System Startup */
-    KiSystemStartup(NtLoaderBlock);
+    KiSystemStartupReal(NtLoaderBlock);
 }
 
 /* EOF */