#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,
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;
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
* 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;
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)
{
/*
* 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
*/
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
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);
/*
*/
if (!FrLdrLoadNlsFiles(szBootPath, MsgBuffer))
{
- UiMessageBox(MsgBuffer);
+ UiMessageBox(MsgBuffer);
return;
}
UiDrawProgressBarCenter(30, 100, szLoadingMsg);
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