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_MM_REMOVE_VIRTUAL_REGION_FLAG 0x80000000
69 #define BL_LIBRARY_FLAG_REINITIALIZE 0x02
70 #define BL_LIBRARY_FLAG_REINITIALIZE_ALL 0x04
71 #define BL_LIBRARY_FLAG_INITIALIZATION_COMPLETED 0x20
73 #define BL_MEMORY_CLASS_SHIFT 28
75 /* ENUMERATIONS **************************************************************/
77 typedef enum _BL_MEMORY_DESCRIPTOR_TYPE
81 } BL_MEMORY_DESCRIPTOR_TYPE
;
83 typedef enum _BL_TRANSLATION_TYPE
89 } BL_TRANSLATION_TYPE
;
91 typedef enum _BL_ARCH_MODE
100 typedef enum _BL_DEVICE_TYPE
109 // Local Device Types
111 typedef enum _BL_LOCAL_DEVICE_TYPE
116 } BL_LOCAL_DEVICE_TYPE
;
121 typedef enum _BL_PARTITION_TYPE
131 typedef enum _BL_PATH_TYPE
139 typedef enum _BL_MEMORY_CLASS
149 typedef enum _BL_MEMORY_TYPE
154 BlLoaderMemory
= 0xD0000002,
155 BlLoaderHeap
= 0xD0000005,
156 BlLoaderPageDirectory
= 0xD0000006,
157 BlLoaderReferencePage
= 0xD0000007,
158 BlLoaderRamDisk
= 0xD0000008,
159 BlLoaderData
= 0xD000000A,
160 BlLoaderSelfMap
= 0xD000000F,
163 // Application Memory
165 BlApplicationData
= 0xE0000004,
170 BlConventionalMemory
= 0xF0000001,
171 BlUnusableMemory
= 0xF0000002,
172 BlReservedMemory
= 0xF0000003,
173 BlEfiBootMemory
= 0xF0000004,
174 BlEfiRuntimeMemory
= 0xF0000006,
175 BlAcpiReclaimMemory
= 0xF0000008,
176 BlAcpiNvsMemory
= 0xF0000009,
177 BlDeviceIoMemory
= 0xF000000A,
178 BlDevicePortMemory
= 0xF000000B,
179 BlPalMemory
= 0xF000000C,
182 typedef enum _BL_MEMORY_ATTR
184 BlMemoryUncached
= 1,
185 BlMemoryWriteCombined
= 2,
186 BlMemoryWriteThrough
= 4,
187 BlMemoryWriteBack
= 8,
188 BlMemoryUncachedExported
= 0x10,
189 BlMemoryWriteProtected
= 0x100,
190 BlMemoryReadProtected
= 0x200,
191 BlMemoryExecuteProtected
= 0x400,
192 BlMemoryRuntime
= 0x1000000
195 /* DATA STRUCTURES ***********************************************************/
197 typedef struct _BL_LIBRARY_PARAMETERS
200 ULONG TranslationType
;
201 ULONG MinimumAllocationCount
;
202 ULONG MinimumHeapSize
;
203 ULONG HeapAllocationAttributes
;
204 PWCHAR ApplicationBaseDirectory
;
205 ULONG DescriptorCount
;
206 PWCHAR FontBaseDirectory
;
207 } BL_LIBRARY_PARAMETERS
, *PBL_LIBRARY_PARAMETERS
;
209 /* This should eventually go into a more public header */
210 typedef struct _BOOT_APPLICATION_PARAMETER_BLOCK
212 /* This header tells the library what image we're dealing with */
217 ULONG MemoryTranslationType
;
219 /* Where is the image located */
223 /* Offset to BL_MEMORY_DATA */
224 ULONG MemoryDataOffset
;
226 /* Offset to BL_APPLICATION_ENTRY */
227 ULONG AppEntryOffset
;
229 /* Offset to BL_DEVICE_DESCRPIPTOR */
230 ULONG BootDeviceOffset
;
232 /* Offset to BL_FIRMWARE_PARAMETERS */
233 ULONG FirmwareParametersOffset
;
235 /* Offset to BL_RETURN_ARGUMENTS */
236 ULONG ReturnArgumentsOffset
;
237 } BOOT_APPLICATION_PARAMETER_BLOCK
, *PBOOT_APPLICATION_PARAMETER_BLOCK
;
239 typedef struct _BL_MEMORY_DATA
243 ULONG DescriptorCount
;
244 ULONG DescriptorSize
;
245 ULONG DescriptorOffset
;
246 } BL_MEMORY_DATA
, *PBL_MEMORY_DATA
;
248 typedef struct _BL_FIRMWARE_DESCRIPTOR
252 EFI_HANDLE ImageHandle
;
253 EFI_SYSTEM_TABLE
*SystemTable
;
254 } BL_FIRMWARE_DESCRIPTOR
, *PBL_FIRMWARE_DESCRIPTOR
;
256 typedef struct _BL_RETURN_ARGUMENTS
259 ULONG ReturnArgumentData
[6];
260 } BL_RETURN_ARGUMENTS
, *PBL_RETURN_ARGUMENTS
;
262 typedef struct _BL_MEMORY_DESCRIPTOR
264 LIST_ENTRY ListEntry
;
270 ULONGLONG VirtualPage
;
274 ULONGLONG BaseAddress
;
275 ULONGLONG VirtualAddress
;
281 } BL_MEMORY_DESCRIPTOR
, *PBL_MEMORY_DESCRIPTOR
;
283 typedef struct _BL_BCD_OPTION
289 ULONG NextEntryOffset
;
291 } BL_BCD_OPTION
, *PBL_BCD_OPTION
;
293 typedef struct _BL_APPLICATION_ENTRY
299 BL_BCD_OPTION BcdData
;
300 } BL_APPLICATION_ENTRY
, *PBL_APPLICATION_ENTRY
;
302 typedef struct _BL_HARDDISK_DEVICE
309 ULONG PartitionSignature
;
314 GUID PartitionSignature
;
322 } BL_HARDDISK_DEVICE
;
324 typedef struct _BL_LOCAL_DEVICE
334 BL_HARDDISK_DEVICE HardDisk
;
338 PHYSICAL_ADDRESS ImageBase
;
339 LARGE_INTEGER ImageSize
;
345 typedef struct _BL_DEVICE_DESCRIPTOR
349 DEVICE_TYPE DeviceType
;
353 BL_LOCAL_DEVICE Local
;
364 ULONG PartitionNumber
;
372 BL_LOCAL_DEVICE Disk
;
375 } BL_DEVICE_DESCRIPTOR
, *PBL_DEVICE_DESCRIPTOR
;
377 typedef struct _BL_FILE_PATH_DESCRIPTOR
382 UCHAR Path
[ANYSIZE_ARRAY
];
383 } BL_FILE_PATH_DESCRIPTOR
, *PBL_FILE_PATH_DESCRIPTOR
;
385 typedef struct _BL_WINDOWS_LOAD_OPTIONS
391 WCHAR LoadOptions
[ANYSIZE_ARRAY
];
392 } BL_WINDOWS_LOAD_OPTIONS
, *PBL_WINDOWS_LOAD_OPTIONS
;
394 typedef struct _BL_ARCH_CONTEXT
397 BL_TRANSLATION_TYPE TranslationType
;
399 } BL_ARCH_CONTEXT
, *PBL_ARCH_CONTEXT
;
401 typedef struct _BL_MEMORY_DESCRIPTOR_LIST
407 } BL_MEMORY_DESCRIPTOR_LIST
, *PBL_MEMORY_DESCRIPTOR_LIST
;
409 typedef struct _BL_ADDRESS_RANGE
413 } BL_ADDRESS_RANGE
, *PBL_ADDRESS_RANGE
;
415 /* INLINE ROUTINES ***********************************************************/
419 BlSetupDefaultParameters (
420 _Out_ PBL_LIBRARY_PARAMETERS LibraryParameters
423 BL_LIBRARY_PARAMETERS DefaultParameters
=
435 /* Copy the defaults */
436 RtlCopyMemory(LibraryParameters
, &DefaultParameters
, sizeof(*LibraryParameters
));
441 MmMdInitializeListHead (
442 _In_ PBL_MEMORY_DESCRIPTOR_LIST List
445 /* Initialize the list */
446 InitializeListHead(&List
->ListHead
);
447 List
->First
= &List
->ListHead
;
451 /* INITIALIZATION ROUTINES ***************************************************/
455 _In_ PBOOT_APPLICATION_PARAMETER_BLOCK BootAppParameters
,
456 _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
467 _In_ PBL_FIRMWARE_DESCRIPTOR FirmwareParameters
472 _In_ PBL_MEMORY_DATA MemoryData
,
473 _In_ BL_TRANSLATION_TYPE TranslationType
,
474 _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
477 /* UTILITY ROUTINES **********************************************************/
486 _In_ EFI_STATUS EfiStatus
489 /* BCD ROUTINES **************************************************************/
492 BlGetBootOptionSize (
493 _In_ PBL_BCD_OPTION BcdOption
496 /* CONTEXT ROUTINES **********************************************************/
499 BlpArchSwitchContext (
500 _In_ BL_ARCH_MODE NewMode
503 /* MEMORY MANAGER ROUTINES ***************************************************/
512 _In_ PBL_MEMORY_DATA MemoryData
,
513 _In_ ULONG MinimumPages
519 _In_ PBL_MEMORY_DATA MemoryData
,
520 _In_ BL_TRANSLATION_TYPE TranslationType
,
521 _In_ BL_TRANSLATION_TYPE LibraryTranslationType
527 _In_ ULONG HeapAttributes
533 _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
538 _Out_ PBL_MEMORY_DESCRIPTOR_LIST MemoryMap
,
544 _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList
547 PBL_MEMORY_DESCRIPTOR
548 MmMdInitByteGranularDescriptor (
550 _In_ BL_MEMORY_TYPE Type
,
551 _In_ ULONGLONG BasePage
,
552 _In_ ULONGLONG VirtualPage
,
553 _In_ ULONGLONG PageCount
557 MmMdAddDescriptorToList (
558 _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList
,
559 _In_ PBL_MEMORY_DESCRIPTOR MemoryDescriptor
,
564 MmMdRemoveRegionFromMdlEx (
565 __in PBL_MEMORY_DESCRIPTOR_LIST MdList
,
567 __in ULONGLONG BasePage
,
568 __in ULONGLONG PageCount
,
569 __in PBL_MEMORY_DESCRIPTOR_LIST NewMdList
573 MmPapAllocatePagesInRange (
574 _Inout_ PULONG PhysicalAddress
,
575 _In_ BL_MEMORY_TYPE MemoryType
,
576 _In_ ULONGLONG Pages
,
577 _In_ ULONG Attributes
,
578 _In_ ULONG Alignment
,
579 _In_opt_ PBL_ADDRESS_RANGE Range
,
583 extern ULONG MmDescriptorCallTreeCount
;
584 extern ULONG BlpApplicationFlags
;
585 extern BL_LIBRARY_PARAMETERS BlpLibraryParameters
;
586 extern BL_TRANSLATION_TYPE MmTranslationType
;
587 extern PBL_ARCH_CONTEXT CurrentExecutionContext
;
588 extern PBL_DEVICE_DESCRIPTOR BlpBootDevice
;