#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;
/* 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;
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 *****************************************************************/
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++];
}
}
/* 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)
#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 */
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 */
VOID
NTAPI
KiRosFixupComponentTree(IN PCONFIGURATION_COMPONENT_DATA p,
- IN ULONG i)
+ IN ULONG_PTR i)
{
PCONFIGURATION_COMPONENT pp;
/* 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;
/* 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
/* 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;
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;
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 */
/* 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;
/* 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);
#endif
/* Do general System Startup */
- KiSystemStartup(NtLoaderBlock);
+ KiSystemStartupReal(NtLoaderBlock);
}
/* EOF */