#define NDEBUG
#include <debug.h>
+#ifdef _M_PPC
+#include <ppcmmu/mmu.h>
+#endif
+
typedef struct _BIOS_MEMORY_DESCRIPTOR
{
ULONG BlockBase;
/* If anything failed until now, return error code */
if (Status != STATUS_SUCCESS) return Status;
+#ifdef _M_IX86
/* Set the top 16MB region as reserved */
Status = KiRosConfigureArcDescriptor(0xFC0, 0x1000, MemorySpecialMemory);
if (Status != STATUS_SUCCESS) return Status;
/* Build an entry for the IVT */
Status = KiRosAllocateArcDescriptor(0, 1, MemoryFirmwarePermanent);
if (Status != STATUS_SUCCESS) return Status;
+#endif
/* Build an entry for the KPCR and KUSER_SHARED_DATA */
Status = KiRosAllocateArcDescriptor(1, 3, LoaderMemoryData);
/* Find a descriptor that already contains our base address */
MdBlock = KiRosFindNtDescriptor(BasePage);
+
if (MdBlock)
{
/* If it contains our limit as well, break out early */
WCHAR PathSetup[] = L"\\SystemRoot\\";
CHAR DriverNameLow[256];
ULONG Base;
+#ifdef _M_PPC
+ ULONG KernelBase = RosLoaderBlock->ModsAddr[0].ModStart;
+#endif
/* First get some kernel-loader globals */
AcpiTableDetected = (RosLoaderBlock->Flags & MB_FLAGS_ACPI_TABLE) ? TRUE : FALSE;
/* Build entries for ReactOS memory ranges, which uses ARC Descriptors */
KiRosBuildOsMemoryMap();
+#ifdef _M_IX86
/* Build entries for the reserved map, which uses ARC Descriptors */
KiRosBuildReservedMemoryMap();
+#endif
/* Now convert the BIOS and ARC Descriptors into NT Memory Descirptors */
KiRosBuildArcMemoryList();
&Base);
}
+#ifdef _M_PPC
+ ModStart = (PVOID)((ULONG)ModStart + 0x80800000 - KernelBase);
+#endif
+
/* Lowercase the drivername so we can check its extension later */
strcpy(DriverNameLow, DriverName);
_strlwr(DriverNameLow);
InsertTailList(&LoaderBlock->ArcDiskInformation->DiskSignatureListHead,
&ArcDiskInfo->ListEntry);
}
-
+
/* Copy the ARC Hardware Tree */
RtlCopyMemory(BldrArcHwBuffer, (PVOID)RosLoaderBlock->ArchExtra, 16 * 1024);
LoaderBlock->ConfigurationRoot = (PVOID)BldrArcHwBuffer;
IN PROS_LOADER_PARAMETER_BLOCK LoaderBlock)
{
PLOADER_PARAMETER_BLOCK NtLoaderBlock;
- ULONG size, i;
+ ULONG size, i = 0, *ent;
#if defined(_M_IX86)
PKTSS Tss;
PKGDTENTRY TssEntry;
#endif
#if defined(_M_PPC)
+ // Zero bats. We might have residual bats set that will interfere with
+ // our mapping of ofwldr.
+ for (i = 0; i < 4; i++)
+ {
+ SetBat(i, 0, 0, 0); SetBat(i, 1, 0, 0);
+ }
KiSetupSyscallHandler();
+ DbgPrint("Kernel Power (%08x)\n", LoaderBlock);
+ DbgPrint("ArchExtra (%08x)!\n", LoaderBlock->ArchExtra);
#endif
/* Save pointer to ROS Block */
ModsAddr[KeRosLoaderBlock->
ModsCount - 1].
ModEnd);
+#if defined(_M_PPC)
+ MmFreeLdrFirstKrnlPhysAddr = KeRosLoaderBlock->ModsAddr[0].ModStart;
+ MmFreeLdrLastKrnlPhysAddr = MmFreeLdrLastKernelAddress;
+ DbgPrint("kernel phys = %08x-%08x\n",
+ MmFreeLdrFirstKrnlPhysAddr,
+ MmFreeLdrLastKrnlPhysAddr);
+#else
MmFreeLdrFirstKrnlPhysAddr = KeRosLoaderBlock->ModsAddr[0].ModStart -
KSEG0_BASE;
MmFreeLdrLastKrnlPhysAddr = MmFreeLdrLastKernelAddress - KSEG0_BASE;
+#endif
/* Save memory manager data */
KeMemoryMapRangeCount = 0;
if (LoaderBlock->Flags & MB_FLAGS_MMAP_INFO)
{
/* We have a memory map from the nice BIOS */
- size = *((PULONG)(LoaderBlock->MmapAddr - sizeof(ULONG)));
+ ent = ((PULONG)(LoaderBlock->MmapAddr - sizeof(ULONG)));
+ size = *ent;
i = 0;
/* Map it until we run out of size */
/* Convert the loader block */
KiRosFrldrLpbToNtLpb(KeRosLoaderBlock, &NtLoaderBlock);
+#if defined(_M_PPC)
+ DbgPrint("Finished KiRosFrldrLpbToNtLpb\n");
+#endif
+
/* Do general System Startup */
KiSystemStartup(NtLoaderBlock);
}