* PROJECT: ReactOS Boot Loader
* LICENSE: BSD - See COPYING.ARM in the top level directory
* FILE: boot/armllb/os/loader.c
* PURPOSE: OS Loader Code for LLB
* PROGRAMMERS: ReactOS Portable Systems Group
*/
#include "precomp.h"
BIOS_MEMORY_MAP MemoryMap[32];
ARM_BOARD_CONFIGURATION_BLOCK ArmBlock;
POSLOADER_INIT LoaderInit;
VOID
NTAPI
LlbAllocateMemoryEntry(IN BIOS_MEMORY_TYPE Type,
IN ULONG BaseAddress,
IN ULONG Length)
{
PBIOS_MEMORY_MAP Entry;
Entry = MemoryMap;
while (Entry->Length) Entry++;
Entry->Length = Length;
Entry->BaseAddress = BaseAddress;
Entry->Type = Type;
ArmBlock.MemoryMapEntryCount++;
}
VOID
NTAPI
LlbSetCommandLine(IN PCHAR CommandLine)
{
strcpy(ArmBlock.CommandLine, CommandLine);
}
VOID
NTAPI
LlbBuildArmBlock(VOID)
{
ArmBlock.MajorVersion = ARM_BOARD_CONFIGURATION_MAJOR_VERSION;
ArmBlock.MinorVersion = ARM_BOARD_CONFIGURATION_MINOR_VERSION;
ArmBlock.BoardType = LlbHwGetBoardType();
ArmBlock.ClockRate = LlbHwGetPClk();
ArmBlock.TimerRegisterBase = LlbHwGetTmr0Base();
ArmBlock.UartRegisterBase = LlbHwGetUartBase(LlbHwGetSerialUart());
DbgPrint("Machine Identifier: %lx\nPCLK: %d\nTIMER 0: %p\nSERIAL UART: %p\n",
ArmBlock.BoardType,
ArmBlock.ClockRate,
ArmBlock.TimerRegisterBase,
ArmBlock.UartRegisterBase);
ArmBlock.MemoryMap = MemoryMap;
ArmBlock.ConsPutChar = LlbFwPutChar;
ArmBlock.ConsKbHit = LlbFwKbHit;
ArmBlock.ConsGetCh = LlbFwGetCh;
ArmBlock.VideoClearScreen = LlbFwVideoClearScreen;
ArmBlock.VideoSetDisplayMode = LlbFwVideoSetDisplayMode;
ArmBlock.VideoGetDisplaySize = LlbFwVideoGetDisplaySize;
ArmBlock.VideoPutChar = LlbFwVideoPutChar;
ArmBlock.GetTime = LlbFwGetTime;
}
VOID
NTAPI
LlbBuildMemoryMap(VOID)
{
memset(MemoryMap, 0, sizeof(MemoryMap));
LlbHwBuildMemoryMap(MemoryMap);
}
POSLOADER_INIT
NTAPI
LlbHwLoadOsLoaderFromRam(VOID)
{
ULONG Base, RootFs, Size;
PCHAR Offset;
CHAR CommandLine[64];
LlbEnvGetRamDiskInformation(&RootFs, &Size);
DbgPrint("Root fs: %lx, size: %lx\n", RootFs, Size);
Base = 0x20000;
Offset = LlbEnvRead("rdoffset");
snprintf(CommandLine,
sizeof(CommandLine),
"rdbase=0x%lx rdsize=0x%lx rdoffset=%s",
RootFs, Size, Offset);
LlbSetCommandLine(CommandLine);
return (POSLOADER_INIT)Base;
}
VOID
NTAPI
LlbLoadOsLoader(VOID)
{
PCHAR BootDevice;
BootDevice = LlbEnvRead("boot-device");
printf("Loading OS Loader from: %s...\n", BootDevice);
if (!strcmp(BootDevice, "NAND"))
{
}
else if (!strcmp(BootDevice, "RAMDISK"))
{
LoaderInit = LlbHwLoadOsLoaderFromRam();
}
else if (!strcmp(BootDevice, "MMC") ||
!strcmp(BootDevice, "SD"))
{
}
else if (!strcmp(BootDevice, "HDD"))
{
}
LoaderInit = (PVOID)0x80000000;
#ifdef _ZOOM2_
LoaderInit = (PVOID)0x81070000;
#endif
printf("OS Loader loaded at 0x%p...JUMP!\n\n\n\n\n", LoaderInit);
}
VOID
NTAPI
LlbBoot(VOID)
{
LlbBuildArmBlock();
LlbBuildMemoryMap();
LlbLoadOsLoader();
LoaderInit(&ArmBlock);
}