2 * COPYRIGHT: See COPYING.ARM in the top level directory
3 * PROJECT: ReactOS UEFI Boot Library
4 * FILE: boot/environ/lib/bootlib.c
5 * PURPOSE: Boot Library Initialization
6 * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org)
9 /* INCLUDES ******************************************************************/
13 /* DATA VARIABLES ************************************************************/
15 BL_LIBRARY_PARAMETERS BlpLibraryParameters
;
16 PBL_DEVICE_DESCRIPTOR BlpBootDevice
;
17 PWCHAR BlpApplicationBaseDirectory
;
18 PBOOT_APPLICATION_PARAMETER_BLOCK BlpApplicationParameters
;
19 BL_APPLICATION_ENTRY BlpApplicationEntry
;
20 BOOLEAN BlpLibraryParametersInitialized
;
22 ULONG PdPersistAllocations
;
23 LIST_ENTRY BlBadpListHead
;
25 /* FUNCTIONS *****************************************************************/
28 EFI_SYSTEM_TABLE
* g_SystemTable
;
31 EarlyPrint(_In_ PWCHAR Format
, ...)
36 va_start(args
, Format
);
38 vswprintf(buffer
, Format
, args
);
40 g_SystemTable
->ConOut
->OutputString(g_SystemTable
->ConOut
, L
"\r");
41 g_SystemTable
->ConOut
->OutputString(g_SystemTable
->ConOut
, buffer
);
43 g_SystemTable
->BootServices
->Stall(200000);
50 * @name InitializeLibrary
52 * The InitializeLibrary function initializes the Boot Library.
54 * @param BootParameters
55 * Pointer to the Boot Application Parameter Block.
57 * @param LibraryParameters
58 * Pointer to the Boot Library Parameters.
60 * @return NT_SUCCESS if the boot library was loaded correctly, relevant error
66 _In_ PBOOT_APPLICATION_PARAMETER_BLOCK BootAppParameters
,
67 _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
71 PBL_MEMORY_DATA MemoryData
;
72 PBL_APPLICATION_ENTRY AppEntry
;
73 PBL_FIRMWARE_DESCRIPTOR FirmwareDescriptor
;
74 ULONG_PTR ParamPointer
= (ULONG_PTR
)BootAppParameters
;
76 /* Validate correct Boot Application data */
77 if (!(BootAppParameters
) ||
78 (BootAppParameters
->Signature
[0] != BOOT_APPLICATION_SIGNATURE_1
) ||
79 (BootAppParameters
->Signature
[1] != BOOT_APPLICATION_SIGNATURE_2
) ||
80 (BootAppParameters
->Size
< sizeof(*BootAppParameters
)))
82 Status
= STATUS_INVALID_PARAMETER
;
86 /* Get sub-structures */
87 MemoryData
= (PBL_MEMORY_DATA
)(ParamPointer
+ BootAppParameters
->MemoryDataOffset
);
88 FirmwareDescriptor
= (PBL_FIRMWARE_DESCRIPTOR
)(ParamPointer
+ BootAppParameters
->FirmwareParametersOffset
);
89 AppEntry
= (PBL_APPLICATION_ENTRY
)(ParamPointer
+ BootAppParameters
->AppEntryOffset
);
90 BlpBootDevice
= (PBL_DEVICE_DESCRIPTOR
)(ParamPointer
+ BootAppParameters
->BootDeviceOffset
);
91 BlpApplicationBaseDirectory
= LibraryParameters
->ApplicationBaseDirectory
;
93 /* Initialize the firmware table */
94 Status
= BlpFwInitialize(0, FirmwareDescriptor
);
95 if (!NT_SUCCESS(Status
))
100 /* Find boot application entry */
101 if (strncmp(AppEntry
->Signature
, BL_APP_ENTRY_SIGNATURE
, 7))
103 Status
= STATUS_INVALID_PARAMETER_9
;
107 /* Read parameters */
108 BlpApplicationParameters
= BootAppParameters
;
109 BlpLibraryParameters
= *LibraryParameters
;
111 /* Save the application entry */
112 if (AppEntry
->Flags
& 2)
114 AppEntry
->Flags
= (AppEntry
->Flags
& ~0x2) | 0x80;
116 BlpApplicationEntry
= *AppEntry
;
118 /* Everything has been captured */
119 BlpLibraryParametersInitialized
= TRUE
;
121 /* Initialize the architecture (PM or RM) switching */
122 Status
= BlpArchInitialize(0);
123 if (!NT_SUCCESS(Status
))
128 /* Initialize the memory manager */
129 Status
= BlpMmInitialize(MemoryData
,
130 BootAppParameters
->MemoryTranslationType
,
132 if (!NT_SUCCESS(Status
))
134 EarlyPrint(L
"MM init failed!\n");
138 /* Initialize firmware now that the heap, etc works */
139 Status
= BlpFwInitialize(1, FirmwareDescriptor
);
140 if (!NT_SUCCESS(Status
))
142 /* Destroy memory manager in phase 1 */
144 EarlyPrint(L
"Firmware2 init failed!\n");
149 /* Modern systems have an undocumented BCD system for the boot frequency */
150 Status
= BlGetBootOptionInteger(BlpApplicationEntry
.BcdData
,
153 if (NT_SUCCESS(Status
) && (BootFrequency
))
155 /* Use it if present */
156 BlpTimePerformanceFrequency
= BootFrequency
;
161 /* Use the TSC for calibration */
162 Status
= BlpTimeCalibratePerformanceCounter();
163 if (!NT_SUCCESS(Status
))
165 /* Destroy memory manager in phase 1 */
166 EarlyPrint(L
"TSC calibration failed\n");
172 /* Now setup the rest of the architecture (IDT, etc) */
173 Status
= BlpArchInitialize(1);
174 if (!NT_SUCCESS(Status
))
176 /* Destroy memory manager in phase 1 */
177 EarlyPrint(L
"Arch2 init failed\n");
182 #ifdef BL_TPM_SUPPORT
183 /* Initialize support for Trusted Platform Module v1.2 */
187 #ifdef BL_TPM_SUPPORT
188 /* Initialize the event manager */
189 EnSubsystemInitialized
= 1;
190 InitializeListHead(&EnEventNotificationList
);
193 /* Initialize the I/O Manager */
194 Status
= BlpIoInitialize();
195 if (!NT_SUCCESS(Status
))
197 /* Destroy memory manager in phase 1 and the event manager */
198 EarlyPrint(L
"IO init failed\n");
199 #ifdef BL_TPM_SUPPORT
200 if (EnSubsystemInitialized
)
209 #ifdef BL_NET_SUPPORT
210 /* Initialize the network stack */
211 Status
= BlNetInitialize();
212 if (!NT_SUCCESS(Status
))
214 /* Destroy the I/O, event, and memory managers in phase 1 */
216 #ifdef BL_TPM_SUPPORT
217 if (EnSubsystemInitialized
)
227 /* Initialize the utility library */
228 Status
= BlUtlInitialize();
229 if (!NT_SUCCESS(Status
))
231 /* Destroy the network, I/O, event, and memory managers in phase 1 */
232 #ifdef BL_NET_SUPPORT
236 #ifdef BL_TPM_SUPPORT
237 if (EnSubsystemInitialized
)
243 EarlyPrint(L
"Util init failed\n");
248 /* Initialize PCI Platform Support */
249 PltInitializePciConfiguration();
252 #ifdef BL_SECURE_BOOT_SUPPORT
253 /* Read the current SecureBoot Policy*/
254 Status
= BlSecureBootSetActivePolicyFromPersistedData();
255 if (!NT_SUCCESS(Status
))
257 /* Destroy everything that we've currently set up */
259 PltDestroyPciConfiguration();
261 #ifdef BL_NET_SUPPORT
265 #ifdef BL_TPM_SUPPORT
266 if (EnSubsystemInitialized
)
276 #ifdef BL_TPM_SUPPORT
277 /* Initialize phase 0 of the security subsystem */
278 SipInitializePhase0();
282 /* Bring up the boot debugger, now that SecureBoot has been processed */
286 #ifdef BL_ETW_SUPPORT
287 /* Initialize internal logging */
291 /* Are graphics enabled? */
292 if (!(LibraryParameters
->LibraryFlags
& BL_LIBRARY_FLAG_NO_DISPLAY
))
294 /* Initialize the graphics library */
295 BlpDisplayInitialize(LibraryParameters
->LibraryFlags
);
298 /* Initialize the boot application persistent data */
299 PdPersistAllocations
= 0;
300 InitializeListHead(&BlBadpListHead
);
302 #ifdef BL_TPM_SUPPORT
303 /* Now setup the security subsystem in phase 1 */
308 /* Setup the text, UI and font resources */
309 Status
= BlpResourceInitialize();
310 if (!NT_SUCCESS(Status
))
312 /* Tear down everything if this failed */
313 if (!(LibraryParameters
->LibraryFlags
& BL_LIBRARY_FLAG_TEXT_MODE
))
315 // BlpDisplayDestroy();
319 PltDestroyPciConfiguration();
321 #ifdef BL_NET_SUPPORT
325 #ifdef BL_TPM_SUPPORT
326 if (EnSubsystemInitialized
)
336 #if BL_BITLOCKER_SUPPORT
337 /* Setup the boot cryptography library */
338 g_pEnvironmentData
= &SymCryptEnvironmentWindowsBootLibrary
;
339 if (SymCryptEnvWindowsBootLibInit
)
341 SymCryptEnvWindowsBootLibInit();
345 /* We are fully initialized, remember this and exit with success */
346 BlpLibraryParameters
.LibraryFlags
|= BL_LIBRARY_FLAG_INITIALIZATION_COMPLETED
;
347 Status
= STATUS_SUCCESS
;
350 EarlyPrint(L
"Exiting init: %lx\n", Status
);
355 * @name BlInitializeLibrary
357 * The BlInitializeLibrary function initializes, or re-initializes, the
360 * @param BootParameters
361 * Pointer to the Boot Application Parameter Block.
363 * @param LibraryParameters
364 * Pointer to the Boot Library Parameters.
366 * @return NT_SUCCESS if the boot library was loaded correctly, relevant error
372 _In_ PBOOT_APPLICATION_PARAMETER_BLOCK BootAppParameters
,
373 _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
378 /* Are we re-initializing the library? */
379 if (LibraryParameters
->LibraryFlags
& BL_LIBRARY_FLAG_REINITIALIZE
)
382 BlpLibraryParameters
= *LibraryParameters
;
383 if (LibraryParameters
->LibraryFlags
& BL_LIBRARY_FLAG_REINITIALIZE_ALL
)
386 /* Initialize all the core modules again */
389 BlMmRemoveBadMemory();
390 BlpMmInitializeConstraints();
392 /* Redraw the graphics console as needed */
393 BlpDisplayInitialize(LibraryParameters
->LibraryFlags
);
394 BlpResourceInitialize();
398 /* Nothing to do, we're done */
399 Status
= STATUS_SUCCESS
;
403 /* Nope, this is first time initialization */
404 Status
= InitializeLibrary(BootAppParameters
, LibraryParameters
);
407 /* Return initialization status */