reactos/boot/armllb/os/loader.c

179 lines
4.3 KiB
C

/*
* 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;
/* Get the next memory entry */
Entry = MemoryMap;
while (Entry->Length) Entry++;
/* Fill it out */
Entry->Length = Length;
Entry->BaseAddress = BaseAddress;
Entry->Type = Type;
/* Block count */
ArmBlock.MemoryMapEntryCount++;
}
VOID
NTAPI
LlbSetCommandLine(IN PCHAR CommandLine)
{
/* Copy the command line in the ARM block */
strcpy(ArmBlock.CommandLine, CommandLine);
}
VOID
NTAPI
LlbBuildArmBlock(VOID)
{
/* Write version number */
ArmBlock.MajorVersion = ARM_BOARD_CONFIGURATION_MAJOR_VERSION;
ArmBlock.MinorVersion = ARM_BOARD_CONFIGURATION_MINOR_VERSION;
/* Get arch type */
ArmBlock.BoardType = LlbHwGetBoardType();
/* Get peripheral clock rate */
ArmBlock.ClockRate = LlbHwGetPClk();
/* Get timer and serial port base addresses */
ArmBlock.TimerRegisterBase = LlbHwGetTmr0Base();
ArmBlock.UartRegisterBase = LlbHwGetUartBase(LlbHwGetSerialUart());
/* Debug */
DbgPrint("Machine Identifier: %lx\nPCLK: %d\nTIMER 0: %p\nSERIAL UART: %p\n",
ArmBlock.BoardType,
ArmBlock.ClockRate,
ArmBlock.TimerRegisterBase,
ArmBlock.UartRegisterBase);
/* Now load the memory map */
ArmBlock.MemoryMap = MemoryMap;
/* Write firmware callbacks */
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)
{
/* Zero out the memory map */
memset(MemoryMap, 0, sizeof(MemoryMap));
/* Call the hardware-specific function for hardware-defined regions */
LlbHwBuildMemoryMap(MemoryMap);
}
//
// Should go to hwdev.c
//
POSLOADER_INIT
NTAPI
LlbHwLoadOsLoaderFromRam(VOID)
{
ULONG Base, RootFs, Size;
PCHAR Offset;
CHAR CommandLine[64];
/* On versatile we load the RAMDISK with initrd */
LlbEnvGetRamDiskInformation(&RootFs, &Size);
DbgPrint("Root fs: %lx, size: %lx\n", RootFs, Size);
/* The OS Loader is at 0x20000, always */
Base = 0x20000;
/* Read image offset */
Offset = LlbEnvRead("rdoffset");
/* Set parameters for the OS loader */
snprintf(CommandLine,
sizeof(CommandLine),
"rdbase=0x%lx rdsize=0x%lx rdoffset=%s",
RootFs, Size, Offset);
LlbSetCommandLine(CommandLine);
/* Return the OS loader base address */
return (POSLOADER_INIT)Base;
}
VOID
NTAPI
LlbLoadOsLoader(VOID)
{
PCHAR BootDevice;
/* Read the current boot device */
BootDevice = LlbEnvRead("boot-device");
printf("Loading OS Loader from: %s...\n", BootDevice);
if (!strcmp(BootDevice, "NAND"))
{
// todo
}
else if (!strcmp(BootDevice, "RAMDISK"))
{
/* Call the hardware-specific function */
LoaderInit = LlbHwLoadOsLoaderFromRam();
}
else if (!strcmp(BootDevice, "MMC") ||
!strcmp(BootDevice, "SD"))
{
//todo
}
else if (!strcmp(BootDevice, "HDD"))
{
//todo
}
LoaderInit = (PVOID)0x80000000;
#ifdef _ZOOM2_ // need something better than this...
LoaderInit = (PVOID)0x81070000;
#endif
printf("OS Loader loaded at 0x%p...JUMP!\n\n\n\n\n", LoaderInit);
}
VOID
NTAPI
LlbBoot(VOID)
{
/* Setup the ARM block */
LlbBuildArmBlock();
/* Build the memory map */
LlbBuildMemoryMap();
/* Load the OS loader */
LlbLoadOsLoader();
/* Jump to the OS Loader (FreeLDR in this case) */
LoaderInit(&ArmBlock);
}
/* EOF */