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_FIXED_FLAG 0x40000
65 #define BL_MM_DESCRIPTOR_REQUIRES_COALESCING_FLAG 0x2000000
66 #define BL_MM_DESCRIPTOR_REQUIRES_UPDATING_FLAG 0x4000000
67 #define BL_MM_DESCRIPTOR_NEVER_USE_FIRMWARE_FLAG 0x8000000
68 #define BL_MM_DESCRIPTOR_SPECIAL_PAGES_FLAG 0x20000000
69 #define BL_MM_DESCRIPTOR_CAME_FROM_FIRMWARE_FLAG 0x80000000
71 #define BL_MM_REQUEST_DEFAULT_TYPE 1
72 #define BL_MM_REQUEST_TOP_DOWN_TYPE 2
74 #define BL_MM_REMOVE_VIRTUAL_REGION_FLAG 0x80000000
76 #define BL_LIBRARY_FLAG_REINITIALIZE 0x02
77 #define BL_LIBRARY_FLAG_REINITIALIZE_ALL 0x04
78 #define BL_LIBRARY_FLAG_ZERO_HEAP_ALLOCATIONS_ON_FREE 0x10
79 #define BL_LIBRARY_FLAG_INITIALIZATION_COMPLETED 0x20
81 #define BL_FS_REGISTER_AT_HEAD_FLAG 1
83 #define BL_MEMORY_CLASS_SHIFT 28
85 /* ENUMERATIONS **************************************************************/
87 typedef enum _BL_MEMORY_DESCRIPTOR_TYPE
91 } BL_MEMORY_DESCRIPTOR_TYPE
;
93 typedef enum _BL_TRANSLATION_TYPE
99 } BL_TRANSLATION_TYPE
;
101 typedef enum _BL_ARCH_MODE
110 typedef enum _BL_DEVICE_TYPE
119 // Local Device Types
121 typedef enum _BL_LOCAL_DEVICE_TYPE
126 } BL_LOCAL_DEVICE_TYPE
;
131 typedef enum _BL_PARTITION_TYPE
141 typedef enum _BL_PATH_TYPE
149 typedef enum _BL_MEMORY_CLASS
159 typedef enum _BL_MEMORY_TYPE
164 BlLoaderMemory
= 0xD0000002,
165 BlLoaderHeap
= 0xD0000005,
166 BlLoaderPageDirectory
= 0xD0000006,
167 BlLoaderReferencePage
= 0xD0000007,
168 BlLoaderRamDisk
= 0xD0000008,
169 BlLoaderData
= 0xD000000A,
170 BlLoaderSelfMap
= 0xD000000F,
173 // Application Memory
175 BlApplicationData
= 0xE0000004,
180 BlConventionalMemory
= 0xF0000001,
181 BlUnusableMemory
= 0xF0000002,
182 BlReservedMemory
= 0xF0000003,
183 BlEfiBootMemory
= 0xF0000004,
184 BlEfiRuntimeMemory
= 0xF0000006,
185 BlAcpiReclaimMemory
= 0xF0000008,
186 BlAcpiNvsMemory
= 0xF0000009,
187 BlDeviceIoMemory
= 0xF000000A,
188 BlDevicePortMemory
= 0xF000000B,
189 BlPalMemory
= 0xF000000C,
192 typedef enum _BL_MEMORY_ATTR
194 BlMemoryUncached
= 1,
195 BlMemoryWriteCombined
= 2,
196 BlMemoryWriteThrough
= 4,
197 BlMemoryWriteBack
= 8,
198 BlMemoryUncachedExported
= 0x10,
199 BlMemoryWriteProtected
= 0x100,
200 BlMemoryReadProtected
= 0x200,
201 BlMemoryExecuteProtected
= 0x400,
202 BlMemoryRuntime
= 0x1000000
205 /* CALLBACKS *****************************************************************/
209 (*PBL_FS_INIT_CALLBACK
) (
215 (*PBL_FS_DESTROY_CALLBACK
) (
221 (*PBL_FS_MOUNT_CALLBACK
) (
227 (*PBL_FS_PURGE_CALLBACK
) (
233 (*PBL_FILE_DESTROY_CALLBACK
) (
237 /* DATA STRUCTURES ***********************************************************/
239 typedef struct _BL_LIBRARY_PARAMETERS
242 ULONG TranslationType
;
243 ULONG MinimumAllocationCount
;
244 ULONG MinimumHeapSize
;
245 ULONG HeapAllocationAttributes
;
246 PWCHAR ApplicationBaseDirectory
;
247 ULONG DescriptorCount
;
248 PWCHAR FontBaseDirectory
;
249 } BL_LIBRARY_PARAMETERS
, *PBL_LIBRARY_PARAMETERS
;
251 /* This should eventually go into a more public header */
252 typedef struct _BOOT_APPLICATION_PARAMETER_BLOCK
254 /* This header tells the library what image we're dealing with */
259 ULONG MemoryTranslationType
;
261 /* Where is the image located */
265 /* Offset to BL_MEMORY_DATA */
266 ULONG MemoryDataOffset
;
268 /* Offset to BL_APPLICATION_ENTRY */
269 ULONG AppEntryOffset
;
271 /* Offset to BL_DEVICE_DESCRPIPTOR */
272 ULONG BootDeviceOffset
;
274 /* Offset to BL_FIRMWARE_PARAMETERS */
275 ULONG FirmwareParametersOffset
;
277 /* Offset to BL_RETURN_ARGUMENTS */
278 ULONG ReturnArgumentsOffset
;
279 } BOOT_APPLICATION_PARAMETER_BLOCK
, *PBOOT_APPLICATION_PARAMETER_BLOCK
;
281 typedef struct _BL_MEMORY_DATA
285 ULONG DescriptorCount
;
286 ULONG DescriptorSize
;
287 ULONG DescriptorOffset
;
288 } BL_MEMORY_DATA
, *PBL_MEMORY_DATA
;
290 typedef struct _BL_FIRMWARE_DESCRIPTOR
294 EFI_HANDLE ImageHandle
;
295 EFI_SYSTEM_TABLE
*SystemTable
;
296 } BL_FIRMWARE_DESCRIPTOR
, *PBL_FIRMWARE_DESCRIPTOR
;
298 typedef struct _BL_RETURN_ARGUMENTS
301 ULONG ReturnArgumentData
[6];
302 } BL_RETURN_ARGUMENTS
, *PBL_RETURN_ARGUMENTS
;
304 typedef struct _BL_MEMORY_DESCRIPTOR
306 LIST_ENTRY ListEntry
;
312 ULONGLONG VirtualPage
;
316 ULONGLONG BaseAddress
;
317 ULONGLONG VirtualAddress
;
323 } BL_MEMORY_DESCRIPTOR
, *PBL_MEMORY_DESCRIPTOR
;
325 typedef struct _BL_BCD_OPTION
331 ULONG NextEntryOffset
;
333 } BL_BCD_OPTION
, *PBL_BCD_OPTION
;
335 typedef struct _BL_APPLICATION_ENTRY
341 BL_BCD_OPTION BcdData
;
342 } BL_APPLICATION_ENTRY
, *PBL_APPLICATION_ENTRY
;
344 typedef struct _BL_HARDDISK_DEVICE
351 ULONG PartitionSignature
;
356 GUID PartitionSignature
;
364 } BL_HARDDISK_DEVICE
;
366 typedef struct _BL_LOCAL_DEVICE
376 BL_HARDDISK_DEVICE HardDisk
;
380 PHYSICAL_ADDRESS ImageBase
;
381 LARGE_INTEGER ImageSize
;
387 typedef struct _BL_DEVICE_DESCRIPTOR
391 DEVICE_TYPE DeviceType
;
395 BL_LOCAL_DEVICE Local
;
406 ULONG PartitionNumber
;
414 BL_LOCAL_DEVICE Disk
;
417 } BL_DEVICE_DESCRIPTOR
, *PBL_DEVICE_DESCRIPTOR
;
419 typedef struct _BL_FILE_PATH_DESCRIPTOR
424 UCHAR Path
[ANYSIZE_ARRAY
];
425 } BL_FILE_PATH_DESCRIPTOR
, *PBL_FILE_PATH_DESCRIPTOR
;
427 typedef struct _BL_WINDOWS_LOAD_OPTIONS
433 WCHAR LoadOptions
[ANYSIZE_ARRAY
];
434 } BL_WINDOWS_LOAD_OPTIONS
, *PBL_WINDOWS_LOAD_OPTIONS
;
436 typedef struct _BL_ARCH_CONTEXT
439 BL_TRANSLATION_TYPE TranslationType
;
441 } BL_ARCH_CONTEXT
, *PBL_ARCH_CONTEXT
;
443 typedef struct _BL_MEMORY_DESCRIPTOR_LIST
449 } BL_MEMORY_DESCRIPTOR_LIST
, *PBL_MEMORY_DESCRIPTOR_LIST
;
451 typedef struct _BL_ADDRESS_RANGE
455 } BL_ADDRESS_RANGE
, *PBL_ADDRESS_RANGE
;
457 typedef struct _BL_FILE_ENTRY
460 PBL_FILE_DESTROY_CALLBACK DestroyCallback
;
461 } BL_FILE_ENTRY
, *PBL_FILE_ENTRY
;
463 typedef struct _BL_DEVICE_ENTRY
465 ULONG ReferenceCount
;
466 } BL_DEVICE_ENTRY
, *PBL_DEVICE_ENTRY
;
468 typedef struct _BL_FILE_SYSTEM_ENTRY
470 LIST_ENTRY ListEntry
;
471 PBL_FS_INIT_CALLBACK InitCallback
;
472 PBL_FS_DESTROY_CALLBACK DestroyCallback
;
473 PBL_FS_MOUNT_CALLBACK MountCallback
;
474 PBL_FS_PURGE_CALLBACK PurgeCallback
;
475 } BL_FILE_SYSTEM_ENTRY
, *PBL_FILE_SYSTEM_ENTRY
;
477 typedef struct _BL_FILE_SYSTEM_REGISTRATION_TABLE
479 PBL_FS_INIT_CALLBACK Init
;
480 PBL_FS_DESTROY_CALLBACK Destroy
;
481 PBL_FS_MOUNT_CALLBACK Mount
;
482 PBL_FS_PURGE_CALLBACK Purge
;
483 } BL_FILE_SYSTEM_REGISTRATION_TABLE
;
485 /* INLINE ROUTINES ***********************************************************/
489 BlSetupDefaultParameters (
490 _Out_ PBL_LIBRARY_PARAMETERS LibraryParameters
493 BL_LIBRARY_PARAMETERS DefaultParameters
=
505 /* Copy the defaults */
506 RtlCopyMemory(LibraryParameters
, &DefaultParameters
, sizeof(*LibraryParameters
));
511 MmMdInitializeListHead (
512 _In_ PBL_MEMORY_DESCRIPTOR_LIST List
515 /* Initialize the list */
516 InitializeListHead(&List
->ListHead
);
517 List
->First
= &List
->ListHead
;
521 /* INITIALIZATION ROUTINES ***************************************************/
525 _In_ PBOOT_APPLICATION_PARAMETER_BLOCK BootAppParameters
,
526 _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
537 _In_ PBL_FIRMWARE_DESCRIPTOR FirmwareParameters
542 _In_ PBL_MEMORY_DATA MemoryData
,
543 _In_ BL_TRANSLATION_TYPE TranslationType
,
544 _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
554 _In_ PBL_MEMORY_DATA MemoryData
,
555 _In_ ULONG MinimumPages
561 _In_ PBL_MEMORY_DATA MemoryData
,
562 _In_ BL_TRANSLATION_TYPE TranslationType
,
563 _In_ BL_TRANSLATION_TYPE LibraryTranslationType
569 _In_ ULONG HeapAttributes
575 _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
579 BlpDeviceInitialize (
598 /* FIRMWARE ROUTINES *********************************************************/
604 _Inout_ EFI_PHYSICAL_ADDRESS
* Memory
612 /* PLATFORM TIMER ROUTINES ***************************************************/
615 BlpTimeCalibratePerformanceCounter (
619 /* UTILITY ROUTINES **********************************************************/
628 _In_ EFI_STATUS EfiStatus
636 /* BCD ROUTINES **************************************************************/
639 BlGetBootOptionSize (
640 _In_ PBL_BCD_OPTION BcdOption
643 /* CONTEXT ROUTINES **********************************************************/
646 BlpArchSwitchContext (
647 _In_ BL_ARCH_MODE NewMode
650 /* MEMORY DESCRIPTOR ROUTINES ************************************************/
654 _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList
657 PBL_MEMORY_DESCRIPTOR
658 MmMdInitByteGranularDescriptor (
660 _In_ BL_MEMORY_TYPE Type
,
661 _In_ ULONGLONG BasePage
,
662 _In_ ULONGLONG VirtualPage
,
663 _In_ ULONGLONG PageCount
667 MmMdFreeGlobalDescriptors (
672 MmMdAddDescriptorToList (
673 _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList
,
674 _In_ PBL_MEMORY_DESCRIPTOR MemoryDescriptor
,
679 MmMdRemoveDescriptorFromList (
680 _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList
,
681 _In_ PBL_MEMORY_DESCRIPTOR Entry
685 MmMdFindSatisfyingRegion (
686 _In_ PBL_MEMORY_DESCRIPTOR Descriptor
,
687 _Out_ PBL_MEMORY_DESCRIPTOR NewDescriptor
,
688 _In_ ULONGLONG Pages
,
689 _In_ PBL_ADDRESS_RANGE BaseRange
,
690 _In_ PBL_ADDRESS_RANGE VirtualRange
,
691 _In_ BOOLEAN TopDown
,
692 _In_ BL_MEMORY_TYPE MemoryType
,
698 MmMdRemoveRegionFromMdlEx (
699 __in PBL_MEMORY_DESCRIPTOR_LIST MdList
,
701 __in ULONGLONG BasePage
,
702 __in ULONGLONG PageCount
,
703 __in PBL_MEMORY_DESCRIPTOR_LIST NewMdList
708 _In_ PBL_MEMORY_DESCRIPTOR MemoryDescriptor
711 /* PAGE ALLOCATOR ROUTINES ***************************************************/
714 MmPapAllocatePagesInRange (
715 _Inout_ PULONG PhysicalAddress
,
716 _In_ BL_MEMORY_TYPE MemoryType
,
717 _In_ ULONGLONG Pages
,
718 _In_ ULONG Attributes
,
719 _In_ ULONG Alignment
,
720 _In_opt_ PBL_ADDRESS_RANGE Range
,
726 _Out_ PBL_MEMORY_DESCRIPTOR_LIST MemoryMap
,
730 /* HEAP ALLOCATOR ROUTINES ***************************************************/
742 extern ULONG MmDescriptorCallTreeCount
;
743 extern ULONG BlpApplicationFlags
;
744 extern BL_LIBRARY_PARAMETERS BlpLibraryParameters
;
745 extern BL_TRANSLATION_TYPE MmTranslationType
;
746 extern PBL_ARCH_CONTEXT CurrentExecutionContext
;
747 extern PBL_DEVICE_DESCRIPTOR BlpBootDevice
;