2 * COPYRIGHT: See COPYING.ARM in the top level directory
3 * PROJECT: ReactOS UEFI Boot Library
4 * FILE: boot/environ/include/bl.h
5 * PURPOSE: Main Boot Library Header
6 * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org)
12 /* INCLUDES ******************************************************************/
27 #include <DevicePath.h>
28 #include <LoadedImage.h>
31 EarlyPrint(_In_ PWCHAR Format
, ...);
33 /* DEFINES *******************************************************************/
35 #define BL_APPLICATION_FLAG_CONVERTED_FROM_EFI 0x01
37 #define BL_APP_ENTRY_SIGNATURE "BTAPENT"
39 #define BOOT_APPLICATION_SIGNATURE_1 'TOOB'
40 #define BOOT_APPLICATION_SIGNATURE_2 ' PPA'
42 #define BOOT_MEMORY_TRANSLATION_TYPE_PHYSICAL 0
43 #define BOOT_MEMORY_TRANSLATION_TYPE_VIRTUAL 1
45 #define BOOT_APPLICATION_VERSION 2
46 #define BL_MEMORY_DATA_VERSION 1
47 #define BL_RETURN_ARGUMENTS_VERSION 1
48 #define BL_FIRMWARE_DESCRIPTOR_VERSION 2
50 #define BL_APPLICATION_ENTRY_FLAG_NO_GUID 0x01
52 #define BL_CONTEXT_PAGING_ON 1
53 #define BL_CONTEXT_INTERRUPTS_ON 2
55 #define BL_MM_FLAG_USE_FIRMWARE_FOR_MEMORY_MAP_BUFFERS 0x01
56 #define BL_MM_FLAG_REQUEST_COALESCING 0x02
58 #define BL_MM_ADD_DESCRIPTOR_COALESCE_FLAG 0x01
59 #define BL_MM_ADD_DESCRIPTOR_TRUNCATE_FLAG 0x02
60 #define BL_MM_ADD_DESCRIPTOR_NEVER_COALESCE_FLAG 0x10
61 #define BL_MM_ADD_DESCRIPTOR_NEVER_TRUNCATE_FLAG 0x20
62 #define BL_MM_ADD_DESCRIPTOR_UPDATE_LIST_POINTER_FLAG 0x2000
64 #define BL_MM_DESCRIPTOR_REQUIRES_COALESCING_FLAG 0x2000000
65 #define BL_MM_DESCRIPTOR_REQUIRES_UPDATING_FLAG 0x4000000
67 #define BL_LIBRARY_FLAG_REINITIALIZE 0x02
68 #define BL_LIBRARY_FLAG_REINITIALIZE_ALL 0x04
69 #define BL_LIBRARY_FLAG_INITIALIZATION_COMPLETED 0x20
71 #define BL_MEMORY_CLASS_SHIFT 28
73 /* ENUMERATIONS **************************************************************/
75 typedef enum _BL_TRANSLATION_TYPE
81 } BL_TRANSLATION_TYPE
;
83 typedef enum _BL_ARCH_MODE
92 typedef enum _BL_DEVICE_TYPE
101 // Local Device Types
103 typedef enum _BL_LOCAL_DEVICE_TYPE
108 } BL_LOCAL_DEVICE_TYPE
;
113 typedef enum _BL_PARTITION_TYPE
123 typedef enum _BL_PATH_TYPE
131 typedef enum _BL_MEMORY_CLASS
141 typedef enum _BL_MEMORY_TYPE
146 BlLoaderMemory
= 0xD0000002,
147 BlLoaderPageDirectory
= 0xD0000006,
148 BlLoaderReferencePage
= 0xD0000007,
149 BlLoaderRamDisk
= 0xD0000008,
150 BlLoaderData
= 0xD000000A,
151 BlLoaderSelfMap
= 0xD000000F,
154 // Application Memory
156 BlApplicationData
= 0xE0000004,
161 BlConventionalMemory
= 0xF0000001,
162 BlUnusableMemory
= 0xF0000002,
163 BlReservedMemory
= 0xF0000003,
164 BlEfiBootMemory
= 0xF0000004,
165 BlEfiRuntimeMemory
= 0xF0000006,
166 BlAcpiReclaimMemory
= 0xF0000008,
167 BlAcpiNvsMemory
= 0xF0000009,
168 BlDeviceIoMemory
= 0xF000000A,
169 BlDevicePortMemory
= 0xF000000B,
170 BlPalMemory
= 0xF000000C,
173 typedef enum _BL_MEMORY_ATTR
175 BlMemoryUncached
= 1,
176 BlMemoryWriteCombined
= 2,
177 BlMemoryWriteThrough
= 4,
178 BlMemoryWriteBack
= 8,
179 BlMemoryUncachedExported
= 0x10,
180 BlMemoryWriteProtected
= 0x100,
181 BlMemoryReadProtected
= 0x200,
182 BlMemoryExecuteProtected
= 0x400,
183 BlMemoryRuntime
= 0x1000000
186 /* DATA STRUCTURES ***********************************************************/
188 typedef struct _BL_LIBRARY_PARAMETERS
191 ULONG TranslationType
;
192 ULONG MinimumAllocationCount
;
193 ULONG MinimumHeapSize
;
194 ULONG HeapAllocationAttributes
;
195 PWCHAR ApplicationBaseDirectory
;
196 ULONG DescriptorCount
;
197 PWCHAR FontBaseDirectory
;
198 } BL_LIBRARY_PARAMETERS
, *PBL_LIBRARY_PARAMETERS
;
200 /* This should eventually go into a more public header */
201 typedef struct _BOOT_APPLICATION_PARAMETER_BLOCK
203 /* This header tells the library what image we're dealing with */
208 ULONG MemoryTranslationType
;
210 /* Where is the image located */
214 /* Offset to BL_MEMORY_DATA */
215 ULONG MemoryDataOffset
;
217 /* Offset to BL_APPLICATION_ENTRY */
218 ULONG AppEntryOffset
;
220 /* Offset to BL_DEVICE_DESCRPIPTOR */
221 ULONG BootDeviceOffset
;
223 /* Offset to BL_FIRMWARE_PARAMETERS */
224 ULONG FirmwareParametersOffset
;
226 /* Offset to BL_RETURN_ARGUMENTS */
227 ULONG ReturnArgumentsOffset
;
228 } BOOT_APPLICATION_PARAMETER_BLOCK
, *PBOOT_APPLICATION_PARAMETER_BLOCK
;
230 typedef struct _BL_MEMORY_DATA
234 ULONG DescriptorCount
;
235 ULONG DescriptorSize
;
236 ULONG DescriptorOffset
;
237 } BL_MEMORY_DATA
, *PBL_MEMORY_DATA
;
239 typedef struct _BL_FIRMWARE_DESCRIPTOR
243 EFI_HANDLE ImageHandle
;
244 EFI_SYSTEM_TABLE
*SystemTable
;
245 } BL_FIRMWARE_DESCRIPTOR
, *PBL_FIRMWARE_DESCRIPTOR
;
247 typedef struct _BL_RETURN_ARGUMENTS
250 ULONG ReturnArgumentData
[6];
251 } BL_RETURN_ARGUMENTS
, *PBL_RETURN_ARGUMENTS
;
253 typedef struct _BL_MEMORY_DESCRIPTOR
255 LIST_ENTRY ListEntry
;
261 ULONGLONG VirtualPage
;
265 ULONGLONG BaseAddress
;
266 ULONGLONG VirtualAddress
;
272 } BL_MEMORY_DESCRIPTOR
, *PBL_MEMORY_DESCRIPTOR
;
274 typedef struct _BL_BCD_OPTION
280 ULONG NextEntryOffset
;
282 } BL_BCD_OPTION
, *PBL_BCD_OPTION
;
284 typedef struct _BL_APPLICATION_ENTRY
290 BL_BCD_OPTION BcdData
;
291 } BL_APPLICATION_ENTRY
, *PBL_APPLICATION_ENTRY
;
293 typedef struct _BL_HARDDISK_DEVICE
300 ULONG PartitionSignature
;
305 GUID PartitionSignature
;
313 } BL_HARDDISK_DEVICE
;
315 typedef struct _BL_LOCAL_DEVICE
325 BL_HARDDISK_DEVICE HardDisk
;
329 PHYSICAL_ADDRESS ImageBase
;
330 LARGE_INTEGER ImageSize
;
336 typedef struct _BL_DEVICE_DESCRIPTOR
340 DEVICE_TYPE DeviceType
;
344 BL_LOCAL_DEVICE Local
;
355 ULONG PartitionNumber
;
363 BL_LOCAL_DEVICE Disk
;
366 } BL_DEVICE_DESCRIPTOR
, *PBL_DEVICE_DESCRIPTOR
;
368 typedef struct _BL_FILE_PATH_DESCRIPTOR
373 UCHAR Path
[ANYSIZE_ARRAY
];
374 } BL_FILE_PATH_DESCRIPTOR
, *PBL_FILE_PATH_DESCRIPTOR
;
376 typedef struct _BL_WINDOWS_LOAD_OPTIONS
382 WCHAR LoadOptions
[ANYSIZE_ARRAY
];
383 } BL_WINDOWS_LOAD_OPTIONS
, *PBL_WINDOWS_LOAD_OPTIONS
;
385 typedef struct _BL_ARCH_CONTEXT
388 BL_TRANSLATION_TYPE TranslationType
;
390 } BL_ARCH_CONTEXT
, *PBL_ARCH_CONTEXT
;
392 typedef struct _BL_MEMORY_DESCRIPTOR_LIST
398 } BL_MEMORY_DESCRIPTOR_LIST
, *PBL_MEMORY_DESCRIPTOR_LIST
;
400 /* INLINE ROUTINES ***********************************************************/
404 BlSetupDefaultParameters (
405 _Out_ PBL_LIBRARY_PARAMETERS LibraryParameters
408 BL_LIBRARY_PARAMETERS DefaultParameters
=
420 /* Copy the defaults */
421 RtlCopyMemory(LibraryParameters
, &DefaultParameters
, sizeof(*LibraryParameters
));
426 MmMdInitializeListHead (
427 _In_ PBL_MEMORY_DESCRIPTOR_LIST List
430 /* Initialize the list */
431 InitializeListHead(&List
->ListHead
);
432 List
->First
= &List
->ListHead
;
436 /* INITIALIZATION ROUTINES ***************************************************/
440 _In_ PBOOT_APPLICATION_PARAMETER_BLOCK BootAppParameters
,
441 _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
452 _In_ PBL_FIRMWARE_DESCRIPTOR FirmwareParameters
457 _In_ PBL_MEMORY_DATA MemoryData
,
458 _In_ BL_TRANSLATION_TYPE TranslationType
,
459 _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
462 /* UTILITY ROUTINES **********************************************************/
471 _In_ EFI_STATUS EfiStatus
474 /* BCD ROUTINES **************************************************************/
477 BlGetBootOptionSize (
478 _In_ PBL_BCD_OPTION BcdOption
481 /* CONTEXT ROUTINES **********************************************************/
484 BlpArchSwitchContext (
485 _In_ BL_ARCH_MODE NewMode
488 /* MEMORY MANAGER ROUTINES ***************************************************/
497 _In_ PBL_MEMORY_DATA MemoryData
,
498 _In_ ULONG MinimumPages
504 _In_ PBL_MEMORY_DATA MemoryData
,
505 _In_ BL_TRANSLATION_TYPE TranslationType
,
506 _In_ BL_TRANSLATION_TYPE LibraryTranslationType
512 _In_ ULONG HeapAttributes
518 _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
523 _Out_ PBL_MEMORY_DESCRIPTOR_LIST MemoryMap
,
529 _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList
532 PBL_MEMORY_DESCRIPTOR
533 MmMdInitByteGranularDescriptor (
535 _In_ BL_MEMORY_TYPE Type
,
536 _In_ ULONGLONG BasePage
,
537 _In_ ULONGLONG VirtualPage
,
538 _In_ ULONGLONG PageCount
542 MmMdAddDescriptorToList (
543 _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList
,
544 _In_ PBL_MEMORY_DESCRIPTOR MemoryDescriptor
,
549 MmMdRemoveRegionFromMdlEx (
550 __in PBL_MEMORY_DESCRIPTOR_LIST MdList
,
552 __in ULONGLONG BasePage
,
553 __in ULONGLONG PageCount
,
554 __in PBL_MEMORY_DESCRIPTOR_LIST NewMdList
557 extern ULONG MmDescriptorCallTreeCount
;
558 extern ULONG BlpApplicationFlags
;
559 extern BL_LIBRARY_PARAMETERS BlpLibraryParameters
;
560 extern BL_TRANSLATION_TYPE MmTranslationType
;
561 extern PBL_ARCH_CONTEXT CurrentExecutionContext
;
562 extern PBL_DEVICE_DESCRIPTOR BlpBootDevice
;