7c705caad2c4e460b468fb4d56bcbd1f53ab4144
[reactos.git] / reactos / boot / armllb / os / loader.c
1 /*
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
7 */
8
9 #include "precomp.h"
10
11 BIOS_MEMORY_MAP MemoryMap[32];
12 ARM_BOARD_CONFIGURATION_BLOCK ArmBlock;
13 POSLOADER_INIT LoaderInit;
14
15 VOID
16 NTAPI
17 LlbAllocateMemoryEntry(IN BIOS_MEMORY_TYPE Type,
18 IN ULONG BaseAddress,
19 IN ULONG Length)
20 {
21 PBIOS_MEMORY_MAP Entry;
22
23 /* Get the next memory entry */
24 Entry = MemoryMap;
25 while (Entry->Length) Entry++;
26
27 /* Fill it out */
28 Entry->Length = Length;
29 Entry->BaseAddress = BaseAddress;
30 Entry->Type = Type;
31
32 /* Block count */
33 ArmBlock.MemoryMapEntryCount++;
34 }
35
36 VOID
37 NTAPI
38 LlbSetCommandLine(IN PCHAR CommandLine)
39 {
40 /* Copy the command line in the ARM block */
41 strcpy(ArmBlock.CommandLine, CommandLine);
42 }
43
44 VOID
45 NTAPI
46 LlbBuildArmBlock(VOID)
47 {
48 /* Write version number */
49 ArmBlock.MajorVersion = ARM_BOARD_CONFIGURATION_MAJOR_VERSION;
50 ArmBlock.MinorVersion = ARM_BOARD_CONFIGURATION_MINOR_VERSION;
51
52 /* Get arch type */
53 ArmBlock.BoardType = LlbHwGetBoardType();
54
55 /* Get peripheral clock rate */
56 ArmBlock.ClockRate = LlbHwGetPClk();
57
58 /* Get timer and serial port base addresses */
59 ArmBlock.TimerRegisterBase = LlbHwGetTmr0Base();
60 ArmBlock.UartRegisterBase = LlbHwGetUartBase(LlbHwGetSerialUart());
61
62 /* Debug */
63 DbgPrint("Machine Identifier: %lx\nPCLK: %d\nTIMER 0: %p\nSERIAL UART: %p\n",
64 ArmBlock.BoardType,
65 ArmBlock.ClockRate,
66 ArmBlock.TimerRegisterBase,
67 ArmBlock.UartRegisterBase);
68
69 /* Now load the memory map */
70 ArmBlock.MemoryMap = MemoryMap;
71
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 }
90
91 VOID
92 NTAPI
93 LlbBuildMemoryMap(VOID)
94 {
95 ULONG Base, Size;
96
97 /* Zero out the memory map */
98 memset(MemoryMap, 0, sizeof(MemoryMap));
99
100 /* Query memory information */
101 LlbEnvGetMemoryInformation(&Base, &Size);
102
103 /* Don't use memory that the RAMDISK is using */
104 /* HACK HACK */
105 Base += 32 * 1024 * 1024;
106 Size -= 32 * 1024 * 1024;
107
108 /* Allocate an entry for it */
109 LlbAllocateMemoryEntry(BiosMemoryUsable, Base, Size);
110
111 /* Call the hardware-specific function for hardware-defined regions */
112 LlbHwBuildMemoryMap(MemoryMap);
113 }
114
115 VOID
116 NTAPI
117 LlbLoadOsLoader(VOID)
118 {
119 PCHAR BootDevice;
120
121 /* Read the current boot device */
122 BootDevice = LlbEnvRead("boot-device");
123 printf("Loading OS Loader from: %s...\n", BootDevice);
124 if (!strcmp(BootDevice, "NAND"))
125 {
126 // todo
127 }
128 else if (!strcmp(BootDevice, "RAMDISK"))
129 {
130 /* Call the hardware-specific function */
131 LoaderInit = LlbHwLoadOsLoaderFromRam();
132 }
133 else if (!strcmp(BootDevice, "MMC") ||
134 !strcmp(BootDevice, "SD"))
135 {
136 //todo
137 }
138 else if (!strcmp(BootDevice, "HDD"))
139 {
140 //todo
141 }
142 printf("OS Loader loaded at 0x%p...JUMP!\n\n\n\n\n", LoaderInit);
143 }
144
145 VOID
146 NTAPI
147 LlbBoot(VOID)
148 {
149 /* Setup the ARM block */
150 LlbBuildArmBlock();
151
152 /* Build the memory map */
153 LlbBuildMemoryMap();
154
155 /* Load the OS loader */
156 LlbLoadOsLoader();
157
158 /* Jump to the OS Loader (FreeLDR in this case) */
159 LoaderInit(&ArmBlock);
160 }
161
162 /* EOF */