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
);
95 // Should go to hwdev.c
99 LlbHwLoadOsLoaderFromRam(VOID
)
101 ULONG Base
, RootFs
, Size
;
103 CHAR CommandLine
[64];
105 /* On versatile we load the RAMDISK with initrd */
106 LlbEnvGetRamDiskInformation(&RootFs
, &Size
);
107 DbgPrint("Root fs: %lx, size: %lx\n", RootFs
, Size
);
109 /* The OS Loader is at 0x20000, always */
112 /* Read image offset */
113 Offset
= LlbEnvRead("rdoffset");
115 /* Set parameters for the OS loader */
116 snprintf(CommandLine
,
118 "rdbase=0x%x rdsize=0x%x rdoffset=%s",
119 RootFs
, Size
, Offset
);
120 LlbSetCommandLine(CommandLine
);
122 /* Return the OS loader base address */
123 return (POSLOADER_INIT
)Base
;
128 LlbLoadOsLoader(VOID
)
132 /* Read the current boot device */
133 BootDevice
= LlbEnvRead("boot-device");
134 printf("Loading OS Loader from: %s...\n", BootDevice
);
135 if (!strcmp(BootDevice
, "NAND"))
139 else if (!strcmp(BootDevice
, "RAMDISK"))
141 /* Call the hardware-specific function */
142 LoaderInit
= LlbHwLoadOsLoaderFromRam();
144 else if (!strcmp(BootDevice
, "MMC") ||
145 !strcmp(BootDevice
, "SD"))
149 else if (!strcmp(BootDevice
, "HDD"))
154 LoaderInit
= (PVOID
)0x80000000;
155 #ifdef _ZOOM2_ // need something better than this...
156 LoaderInit
= (PVOID
)0x81070000;
158 printf("OS Loader loaded at 0x%p...JUMP!\n\n\n\n\n", LoaderInit
);
165 /* Setup the ARM block */
168 /* Build the memory map */
171 /* Load the OS loader */
174 /* Jump to the OS Loader (FreeLDR in this case) */
175 LoaderInit(&ArmBlock
);