2 * PROJECT: ReactOS Boot Loader
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: boot/armllb/os/loader.c
5 * PURPOSE: OS Loader Code for LLB
6 * PROGRAMMERS: ReactOS Portable Systems Group
11 BIOS_MEMORY_MAP MemoryMap
[32];
12 ARM_BOARD_CONFIGURATION_BLOCK ArmBlock
;
13 POSLOADER_INIT LoaderInit
;
17 LlbAllocateMemoryEntry(IN BIOS_MEMORY_TYPE Type
,
21 PBIOS_MEMORY_MAP Entry
;
23 /* Get the next memory entry */
25 while (Entry
->Length
) Entry
++;
28 Entry
->Length
= Length
;
29 Entry
->BaseAddress
= BaseAddress
;
33 ArmBlock
.MemoryMapEntryCount
++;
38 LlbSetCommandLine(IN PCHAR CommandLine
)
40 /* Copy the command line in the ARM block */
41 strcpy(ArmBlock
.CommandLine
, CommandLine
);
46 LlbBuildArmBlock(VOID
)
48 /* Write version number */
49 ArmBlock
.MajorVersion
= ARM_BOARD_CONFIGURATION_MAJOR_VERSION
;
50 ArmBlock
.MinorVersion
= ARM_BOARD_CONFIGURATION_MINOR_VERSION
;
53 ArmBlock
.BoardType
= LlbHwGetBoardType();
55 /* Get peripheral clock rate */
56 ArmBlock
.ClockRate
= LlbHwGetPClk();
58 /* Get timer and serial port base addresses */
59 ArmBlock
.TimerRegisterBase
= LlbHwGetTmr0Base();
60 ArmBlock
.UartRegisterBase
= LlbHwGetUartBase(LlbHwGetSerialUart());
63 DbgPrint("Machine Identifier: %lx\nPCLK: %d\nTIMER 0: %p\nSERIAL UART: %p\n",
66 ArmBlock
.TimerRegisterBase
,
67 ArmBlock
.UartRegisterBase
);
69 /* Now load the memory map */
70 ArmBlock
.MemoryMap
= MemoryMap
;
72 /* Write firmware callbacks */
73 ArmBlock
.ConsPutChar
= LlbFwPutChar
;
74 ArmBlock
.ConsKbHit
= LlbFwKbHit
;
75 ArmBlock
.ConsGetCh
= LlbFwGetCh
;
76 ArmBlock
.VideoClearScreen
= LlbFwVideoClearScreen
;
77 ArmBlock
.VideoSetDisplayMode
= LlbFwVideoSetDisplayMode
;
78 ArmBlock
.VideoGetDisplaySize
= LlbFwVideoGetDisplaySize
;
79 ArmBlock
.VideoGetBufferSize
= LlbFwVideoGetBufferSize
;
80 ArmBlock
.VideoSetTextCursorPosition
= LlbFwVideoSetTextCursorPosition
;
81 ArmBlock
.VideoSetTextCursorPosition
= LlbFwVideoSetTextCursorPosition
;
82 ArmBlock
.VideoHideShowTextCursor
= LlbFwVideoHideShowTextCursor
;
83 ArmBlock
.VideoPutChar
= LlbFwVideoPutChar
;
84 ArmBlock
.VideoCopyOffScreenBufferToVRAM
= LlbFwVideoCopyOffScreenBufferToVRAM
;
85 ArmBlock
.VideoIsPaletteFixed
= LlbFwVideoIsPaletteFixed
;
86 ArmBlock
.VideoSetPaletteColor
= LlbFwVideoSetPaletteColor
;
87 ArmBlock
.VideoGetPaletteColor
= LlbFwVideoGetPaletteColor
;
88 ArmBlock
.VideoSync
= LlbFwVideoSync
;
89 ArmBlock
.GetTime
= LlbFwGetTime
;
94 LlbBuildMemoryMap(VOID
)
96 /* Zero out the memory map */
97 memset(MemoryMap
, 0, sizeof(MemoryMap
));
99 /* Call the hardware-specific function for hardware-defined regions */
100 LlbHwBuildMemoryMap(MemoryMap
);
105 LlbLoadOsLoader(VOID
)
109 /* Read the current boot device */
110 BootDevice
= LlbEnvRead("boot-device");
111 printf("Loading OS Loader from: %s...\n", BootDevice
);
112 if (!strcmp(BootDevice
, "NAND"))
116 else if (!strcmp(BootDevice
, "RAMDISK"))
118 /* Call the hardware-specific function */
119 LoaderInit
= LlbHwLoadOsLoaderFromRam();
121 else if (!strcmp(BootDevice
, "MMC") ||
122 !strcmp(BootDevice
, "SD"))
126 else if (!strcmp(BootDevice
, "HDD"))
130 printf("OS Loader loaded at 0x%p...JUMP!\n\n\n\n\n", LoaderInit
);
137 /* Setup the ARM block */
140 /* Build the memory map */
143 /* Load the OS loader */
146 /* Jump to the OS Loader (FreeLDR in this case) */
147 LoaderInit(&ArmBlock
);