Fix a couple of problems with FreeLDR portability.
[reactos.git] / reactos / boot / freeldr / freeldr / reactos / reactos.c
index 412ebca..87e6414 100644 (file)
 #include <freeldr.h>
 #include <debug.h>
 
+extern ULONG PageDirectoryStart;
+extern ULONG PageDirectoryEnd;
+
 ROS_LOADER_PARAMETER_BLOCK LoaderBlock;
 char                                   reactos_kernel_cmdline[255];    // Command line passed to kernel
 LOADER_MODULE                  reactos_modules[64];            // Array to hold boot module info loaded for the kernel
 char                                   reactos_module_strings[64][256];        // Array to hold module names
-unsigned long                  reactos_memory_map_descriptor_size;
-memory_map_t                   reactos_memory_map[32];         // Memory map
+// Make this a single struct to guarantee that these elements are nearby in
+// memory.  
+reactos_mem_data_t reactos_mem_data;
 ARC_DISK_SIGNATURE      reactos_arc_disk_info[32]; // ARC Disk Information
 char                    reactos_arc_strings[32][256];
 unsigned long           reactos_disk_count = 0;
+char reactos_arc_hardware_data[HW_MAX_ARC_HEAP_SIZE] = {0};
+
 CHAR szHalName[255];
 CHAR szBootPath[255];
 CHAR SystemRoot[255];
 static CHAR szLoadingMsg[] = "Loading ReactOS...";
 BOOLEAN FrLdrBootType;
-extern ULONG_PTR KernelBase, KernelEntry;
+ULONG_PTR KernelBase;
+ROS_KERNEL_ENTRY_POINT KernelEntryPoint;
 
 BOOLEAN
 FrLdrLoadDriver(PCHAR szFileName,
@@ -406,7 +413,7 @@ FrLdrLoadBootDrivers(PCHAR szSystemRoot,
         if (rc != ERROR_SUCCESS) OrderList[0] = 0;
 
         /* enumerate all drivers */
-        for (TagIndex = 1; TagIndex <= OrderList[0]; TagIndex++) {
+        for (TagIndex = 1; TagIndex <= SWAPD(OrderList[0]); TagIndex++) {
 
             Index = 0;
 
@@ -567,12 +574,9 @@ LoadAndBootReactOS(PCSTR OperatingSystemName)
        ULONG SectionId;
     PIMAGE_NT_HEADERS NtHeader;
     PVOID LoadBase;
-
        ULONG_PTR Base;
        ULONG Size;
 
-       extern BOOLEAN AcpiPresent;
-
        //
        // Open the operating system section
        // specified in the .ini file
@@ -592,6 +596,8 @@ LoadAndBootReactOS(PCSTR OperatingSystemName)
         * Setup multiboot information structure
         */
        LoaderBlock.CommandLine = reactos_kernel_cmdline;
+       LoaderBlock.PageDirectoryStart = (ULONG)&PageDirectoryStart;
+       LoaderBlock.PageDirectoryEnd = (ULONG)&PageDirectoryEnd;
        LoaderBlock.ModsCount = 0;
        LoaderBlock.ModsAddr = reactos_modules;
     LoaderBlock.DrivesAddr = reactos_arc_disk_info;
@@ -599,11 +605,30 @@ LoadAndBootReactOS(PCSTR OperatingSystemName)
     if (LoaderBlock.MmapLength)
     {
         ULONG i;
-
+        LoaderBlock.Flags |= MB_FLAGS_MEM_INFO | MB_FLAGS_MMAP_INFO;
         LoaderBlock.MmapAddr = (unsigned long)&reactos_memory_map;
         reactos_memory_map_descriptor_size = sizeof(memory_map_t); // GetBiosMemoryMap uses a fixed value of 24
         for (i=0; i<(LoaderBlock.MmapLength/sizeof(memory_map_t)); i++)
         {
+#ifdef _M_PPC
+            ULONG tmp;
+            /* Also swap from long long to high/low
+             * We also have unusable memory that will be available to kernel
+             * land.  Mark it here.
+             */
+            if (BiosMemoryAcpiReclaim == reactos_memory_map[i].type)
+            {
+                reactos_memory_map[i].type = BiosMemoryUsable;
+            }
+
+            tmp = reactos_memory_map[i].base_addr_low;
+            reactos_memory_map[i].base_addr_low = reactos_memory_map[i].base_addr_high;
+            reactos_memory_map[i].base_addr_high = tmp;
+            tmp = reactos_memory_map[i].length_low;
+            reactos_memory_map[i].length_low = reactos_memory_map[i].length_high;
+            reactos_memory_map[i].length_high = tmp;
+#endif
+
             if (BiosMemoryUsable == reactos_memory_map[i].type &&
                 0 == reactos_memory_map[i].base_addr_low)
             {
@@ -671,14 +696,22 @@ LoadAndBootReactOS(PCSTR OperatingSystemName)
        /*
         * Detect hardware
         */
-       MachHwDetect();
+       LoaderBlock.ArchExtra = (ULONG)MachHwDetect();
     UiDrawProgressBarCenter(5, 100, szLoadingMsg);
 
-       if (AcpiPresent) LoaderBlock.Flags |= MB_FLAGS_ACPI_TABLE;
     LoaderBlock.DrivesCount = reactos_disk_count;
 
        UiDrawStatusText("Loading...");
 
+       //
+       // If we have a ramdisk, this will switch to the ramdisk disk routines
+       // which read from memory instead of using the firmware. This has to be done
+       // after hardware detection, since hardware detection will require using the
+       // real routines in order to perform disk-detection (just because we're on a
+       // ram-boot doesn't mean the user doesn't have actual disks installed too!)
+       //
+       RamDiskSwitchFromBios();
+
        /*
         * Try to open system drive
         */
@@ -752,15 +785,15 @@ LoadAndBootReactOS(PCSTR OperatingSystemName)
                strcat(szHalName, value);
        }
 
-    /* Load the kernel */
-    LoadBase = FrLdrLoadImage(szKernelName, 5, 1);
-    if (!LoadBase) return;
+       /* Load the kernel */
+       LoadBase = FrLdrLoadImage(szKernelName, 5, 1);
+       if (!LoadBase) return;
 
-    /* Get the NT header, kernel base and kernel entry */
-    NtHeader = RtlImageNtHeader(LoadBase);
-    KernelBase = NtHeader->OptionalHeader.ImageBase;
-    KernelEntry = RaToPa(NtHeader->OptionalHeader.AddressOfEntryPoint);
-    LoaderBlock.KernelBase = KernelBase;
+       /* Get the NT header, kernel base and kernel entry */
+       NtHeader = RtlImageNtHeader(LoadBase);
+       KernelBase = SWAPD(NtHeader->OptionalHeader.ImageBase);
+       KernelEntryPoint = (ROS_KERNEL_ENTRY_POINT)(KernelBase + SWAPD(NtHeader->OptionalHeader.AddressOfEntryPoint));
+       LoaderBlock.KernelBase = KernelBase;
 
        /*
         * Load the System hive from disk
@@ -809,13 +842,6 @@ LoadAndBootReactOS(PCSTR OperatingSystemName)
 
        UiDrawProgressBarCenter(15, 100, szLoadingMsg);
 
-       /*
-        * Export the hardware hive
-        */
-       Base = FrLdrCreateModule ("HARDWARE");
-       RegExportBinaryHive (L"\\Registry\\Machine\\HARDWARE", (PCHAR)Base, &Size);
-       FrLdrCloseModule (Base, Size);
-
        UiDrawProgressBarCenter(20, 100, szLoadingMsg);
 
        /*
@@ -823,7 +849,7 @@ LoadAndBootReactOS(PCSTR OperatingSystemName)
         */
        if (!FrLdrLoadNlsFiles(szBootPath, MsgBuffer))
        {
-               UiMessageBox(MsgBuffer);
+               UiMessageBox(MsgBuffer);
                return;
        }
        UiDrawProgressBarCenter(30, 100, szLoadingMsg);
@@ -834,12 +860,15 @@ LoadAndBootReactOS(PCSTR OperatingSystemName)
        FrLdrLoadBootDrivers(szBootPath, 40);
        //UiUnInitialize("Booting ReactOS...");
 
-       /*
-        * Now boot the kernel
-        */
-       DiskStopFloppyMotor();
-    MachVideoPrepareForReactOS(FALSE);
-    FrLdrStartup(0x2badb002);
+    //
+    // Perform architecture-specific pre-boot configuration
+    //
+    MachPrepareForReactOS(FALSE);
+
+    //
+    // Setup paging and jump to kernel
+    //
+       FrLdrStartup(0x2badb002);
 }
 
 #undef DbgPrint