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
.VideoPutChar
= LlbFwVideoPutChar
;
80 ArmBlock
.GetTime
= LlbFwGetTime
;
85 LlbBuildMemoryMap(VOID
)
87 /* Zero out the memory map */
88 memset(MemoryMap
, 0, sizeof(MemoryMap
));
90 /* Call the hardware-specific function for hardware-defined regions */
91 LlbHwBuildMemoryMap(MemoryMap
);
100 /* Read the current boot device */
101 BootDevice
= LlbEnvRead("boot-device");
102 printf("Loading OS Loader from: %s...\n", BootDevice
);
103 if (!strcmp(BootDevice
, "NAND"))
107 else if (!strcmp(BootDevice
, "RAMDISK"))
109 /* Call the hardware-specific function */
110 LoaderInit
= LlbHwLoadOsLoaderFromRam();
112 else if (!strcmp(BootDevice
, "MMC") ||
113 !strcmp(BootDevice
, "SD"))
117 else if (!strcmp(BootDevice
, "HDD"))
121 printf("OS Loader loaded at 0x%p...JUMP!\n\n\n\n\n", LoaderInit
);
128 /* Setup the ARM block */
131 /* Build the memory map */
134 /* Load the OS loader */
137 /* Jump to the OS Loader (FreeLDR in this case) */
138 LoaderInit(&ArmBlock
);