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_NO_DISPLAY 0x01
77 #define BL_LIBRARY_FLAG_REINITIALIZE 0x02
78 #define BL_LIBRARY_FLAG_REINITIALIZE_ALL 0x04
79 #define BL_LIBRARY_FLAG_ZERO_HEAP_ALLOCATIONS_ON_FREE 0x10
80 #define BL_LIBRARY_FLAG_INITIALIZATION_COMPLETED 0x20
81 #define BL_LIBRARY_FLAG_NO_GRAPHICS_CONSOLE 0x800
83 #define BL_FS_REGISTER_AT_HEAD_FLAG 1
85 #define BL_MEMORY_CLASS_SHIFT 28
87 /* ENUMERATIONS **************************************************************/
89 typedef enum _BL_MEMORY_DESCRIPTOR_TYPE
93 } BL_MEMORY_DESCRIPTOR_TYPE
;
95 typedef enum _BL_TRANSLATION_TYPE
101 } BL_TRANSLATION_TYPE
;
103 typedef enum _BL_ARCH_MODE
112 typedef enum _BL_DEVICE_TYPE
121 // Local Device Types
123 typedef enum _BL_LOCAL_DEVICE_TYPE
128 } BL_LOCAL_DEVICE_TYPE
;
133 typedef enum _BL_PARTITION_TYPE
143 typedef enum _BL_PATH_TYPE
151 typedef enum _BL_MEMORY_CLASS
161 typedef enum _BL_MEMORY_TYPE
166 BlLoaderMemory
= 0xD0000002,
167 BlLoaderHeap
= 0xD0000005,
168 BlLoaderPageDirectory
= 0xD0000006,
169 BlLoaderReferencePage
= 0xD0000007,
170 BlLoaderRamDisk
= 0xD0000008,
171 BlLoaderData
= 0xD000000A,
172 BlLoaderSelfMap
= 0xD000000F,
175 // Application Memory
177 BlApplicationData
= 0xE0000004,
182 BlConventionalMemory
= 0xF0000001,
183 BlUnusableMemory
= 0xF0000002,
184 BlReservedMemory
= 0xF0000003,
185 BlEfiBootMemory
= 0xF0000004,
186 BlEfiRuntimeMemory
= 0xF0000006,
187 BlAcpiReclaimMemory
= 0xF0000008,
188 BlAcpiNvsMemory
= 0xF0000009,
189 BlDeviceIoMemory
= 0xF000000A,
190 BlDevicePortMemory
= 0xF000000B,
191 BlPalMemory
= 0xF000000C,
194 typedef enum _BL_MEMORY_ATTR
196 BlMemoryUncached
= 1,
197 BlMemoryWriteCombined
= 2,
198 BlMemoryWriteThrough
= 4,
199 BlMemoryWriteBack
= 8,
200 BlMemoryUncachedExported
= 0x10,
201 BlMemoryWriteProtected
= 0x100,
202 BlMemoryReadProtected
= 0x200,
203 BlMemoryExecuteProtected
= 0x400,
204 BlMemoryRuntime
= 0x1000000
207 /* CALLBACKS *****************************************************************/
211 (*PBL_FS_INIT_CALLBACK
) (
217 (*PBL_FS_DESTROY_CALLBACK
) (
223 (*PBL_FS_MOUNT_CALLBACK
) (
229 (*PBL_FS_PURGE_CALLBACK
) (
235 (*PBL_FILE_DESTROY_CALLBACK
) (
239 /* DATA STRUCTURES ***********************************************************/
241 typedef struct _BL_LIBRARY_PARAMETERS
244 ULONG TranslationType
;
245 ULONG MinimumAllocationCount
;
246 ULONG MinimumHeapSize
;
247 ULONG HeapAllocationAttributes
;
248 PWCHAR ApplicationBaseDirectory
;
249 ULONG DescriptorCount
;
250 PWCHAR FontBaseDirectory
;
251 } BL_LIBRARY_PARAMETERS
, *PBL_LIBRARY_PARAMETERS
;
253 /* This should eventually go into a more public header */
254 typedef struct _BOOT_APPLICATION_PARAMETER_BLOCK
256 /* This header tells the library what image we're dealing with */
261 ULONG MemoryTranslationType
;
263 /* Where is the image located */
267 /* Offset to BL_MEMORY_DATA */
268 ULONG MemoryDataOffset
;
270 /* Offset to BL_APPLICATION_ENTRY */
271 ULONG AppEntryOffset
;
273 /* Offset to BL_DEVICE_DESCRPIPTOR */
274 ULONG BootDeviceOffset
;
276 /* Offset to BL_FIRMWARE_PARAMETERS */
277 ULONG FirmwareParametersOffset
;
279 /* Offset to BL_RETURN_ARGUMENTS */
280 ULONG ReturnArgumentsOffset
;
281 } BOOT_APPLICATION_PARAMETER_BLOCK
, *PBOOT_APPLICATION_PARAMETER_BLOCK
;
283 typedef struct _BL_MEMORY_DATA
287 ULONG DescriptorCount
;
288 ULONG DescriptorSize
;
289 ULONG DescriptorOffset
;
290 } BL_MEMORY_DATA
, *PBL_MEMORY_DATA
;
292 typedef struct _BL_FIRMWARE_DESCRIPTOR
296 EFI_HANDLE ImageHandle
;
297 EFI_SYSTEM_TABLE
*SystemTable
;
298 } BL_FIRMWARE_DESCRIPTOR
, *PBL_FIRMWARE_DESCRIPTOR
;
300 typedef struct _BL_RETURN_ARGUMENTS
303 ULONG ReturnArgumentData
[6];
304 } BL_RETURN_ARGUMENTS
, *PBL_RETURN_ARGUMENTS
;
306 typedef struct _BL_MEMORY_DESCRIPTOR
308 LIST_ENTRY ListEntry
;
314 ULONGLONG VirtualPage
;
318 ULONGLONG BaseAddress
;
319 ULONGLONG VirtualAddress
;
325 } BL_MEMORY_DESCRIPTOR
, *PBL_MEMORY_DESCRIPTOR
;
327 typedef struct _BL_BCD_OPTION
333 ULONG NextEntryOffset
;
335 } BL_BCD_OPTION
, *PBL_BCD_OPTION
;
337 typedef struct _BL_APPLICATION_ENTRY
343 BL_BCD_OPTION BcdData
;
344 } BL_APPLICATION_ENTRY
, *PBL_APPLICATION_ENTRY
;
346 typedef struct _BL_HARDDISK_DEVICE
353 ULONG PartitionSignature
;
358 GUID PartitionSignature
;
366 } BL_HARDDISK_DEVICE
;
368 typedef struct _BL_LOCAL_DEVICE
378 BL_HARDDISK_DEVICE HardDisk
;
382 PHYSICAL_ADDRESS ImageBase
;
383 LARGE_INTEGER ImageSize
;
389 typedef struct _BL_DEVICE_DESCRIPTOR
393 DEVICE_TYPE DeviceType
;
397 BL_LOCAL_DEVICE Local
;
408 ULONG PartitionNumber
;
416 BL_LOCAL_DEVICE Disk
;
419 } BL_DEVICE_DESCRIPTOR
, *PBL_DEVICE_DESCRIPTOR
;
421 typedef struct _BL_FILE_PATH_DESCRIPTOR
426 UCHAR Path
[ANYSIZE_ARRAY
];
427 } BL_FILE_PATH_DESCRIPTOR
, *PBL_FILE_PATH_DESCRIPTOR
;
429 typedef struct _BL_WINDOWS_LOAD_OPTIONS
435 WCHAR LoadOptions
[ANYSIZE_ARRAY
];
436 } BL_WINDOWS_LOAD_OPTIONS
, *PBL_WINDOWS_LOAD_OPTIONS
;
438 typedef struct _BL_ARCH_CONTEXT
441 BL_TRANSLATION_TYPE TranslationType
;
443 } BL_ARCH_CONTEXT
, *PBL_ARCH_CONTEXT
;
445 typedef struct _BL_MEMORY_DESCRIPTOR_LIST
451 } BL_MEMORY_DESCRIPTOR_LIST
, *PBL_MEMORY_DESCRIPTOR_LIST
;
453 typedef struct _BL_ADDRESS_RANGE
457 } BL_ADDRESS_RANGE
, *PBL_ADDRESS_RANGE
;
459 typedef struct _BL_FILE_ENTRY
462 PBL_FILE_DESTROY_CALLBACK DestroyCallback
;
463 } BL_FILE_ENTRY
, *PBL_FILE_ENTRY
;
465 typedef struct _BL_DEVICE_ENTRY
467 ULONG ReferenceCount
;
468 } BL_DEVICE_ENTRY
, *PBL_DEVICE_ENTRY
;
470 typedef struct _BL_FILE_SYSTEM_ENTRY
472 LIST_ENTRY ListEntry
;
473 PBL_FS_INIT_CALLBACK InitCallback
;
474 PBL_FS_DESTROY_CALLBACK DestroyCallback
;
475 PBL_FS_MOUNT_CALLBACK MountCallback
;
476 PBL_FS_PURGE_CALLBACK PurgeCallback
;
477 } BL_FILE_SYSTEM_ENTRY
, *PBL_FILE_SYSTEM_ENTRY
;
479 typedef struct _BL_FILE_SYSTEM_REGISTRATION_TABLE
481 PBL_FS_INIT_CALLBACK Init
;
482 PBL_FS_DESTROY_CALLBACK Destroy
;
483 PBL_FS_MOUNT_CALLBACK Mount
;
484 PBL_FS_PURGE_CALLBACK Purge
;
485 } BL_FILE_SYSTEM_REGISTRATION_TABLE
;
487 /* INLINE ROUTINES ***********************************************************/
491 BlSetupDefaultParameters (
492 _Out_ PBL_LIBRARY_PARAMETERS LibraryParameters
495 BL_LIBRARY_PARAMETERS DefaultParameters
=
507 /* Copy the defaults */
508 RtlCopyMemory(LibraryParameters
, &DefaultParameters
, sizeof(*LibraryParameters
));
513 MmMdInitializeListHead (
514 _In_ PBL_MEMORY_DESCRIPTOR_LIST List
517 /* Initialize the list */
518 InitializeListHead(&List
->ListHead
);
519 List
->First
= &List
->ListHead
;
523 /* INITIALIZATION ROUTINES ***************************************************/
527 _In_ PBOOT_APPLICATION_PARAMETER_BLOCK BootAppParameters
,
528 _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
539 _In_ PBL_FIRMWARE_DESCRIPTOR FirmwareParameters
544 _In_ PBL_MEMORY_DATA MemoryData
,
545 _In_ BL_TRANSLATION_TYPE TranslationType
,
546 _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
556 _In_ PBL_MEMORY_DATA MemoryData
,
557 _In_ ULONG MinimumPages
563 _In_ PBL_MEMORY_DATA MemoryData
,
564 _In_ BL_TRANSLATION_TYPE TranslationType
,
565 _In_ BL_TRANSLATION_TYPE LibraryTranslationType
571 _In_ ULONG HeapAttributes
577 _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
581 BlpDeviceInitialize (
601 BlpDisplayInitialize (
605 /* FIRMWARE ROUTINES *********************************************************/
611 _Inout_ EFI_PHYSICAL_ADDRESS
* Memory
621 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE
*TextInterface
,
629 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE
*TextInterface
,
634 EfiConOutReadCurrentMode (
635 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE
*TextInterface
,
636 _Out_ EFI_SIMPLE_TEXT_OUTPUT_MODE
* Mode
640 EfiConOutSetAttribute (
641 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE
*TextInterface
,
646 EfiConOutSetCursorPosition (
647 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE
*TextInterface
,
653 EfiConOutEnableCursor (
654 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE
*TextInterface
,
658 /* PLATFORM TIMER ROUTINES ***************************************************/
661 BlpTimeCalibratePerformanceCounter (
665 /* UTILITY ROUTINES **********************************************************/
674 _In_ EFI_STATUS EfiStatus
682 /* BCD ROUTINES **************************************************************/
685 BlGetBootOptionSize (
686 _In_ PBL_BCD_OPTION BcdOption
689 /* CONTEXT ROUTINES **********************************************************/
692 BlpArchSwitchContext (
693 _In_ BL_ARCH_MODE NewMode
696 /* MEMORY DESCRIPTOR ROUTINES ************************************************/
700 _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList
703 PBL_MEMORY_DESCRIPTOR
704 MmMdInitByteGranularDescriptor (
706 _In_ BL_MEMORY_TYPE Type
,
707 _In_ ULONGLONG BasePage
,
708 _In_ ULONGLONG VirtualPage
,
709 _In_ ULONGLONG PageCount
713 MmMdFreeGlobalDescriptors (
718 MmMdAddDescriptorToList (
719 _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList
,
720 _In_ PBL_MEMORY_DESCRIPTOR MemoryDescriptor
,
725 MmMdRemoveDescriptorFromList (
726 _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList
,
727 _In_ PBL_MEMORY_DESCRIPTOR Entry
731 MmMdFindSatisfyingRegion (
732 _In_ PBL_MEMORY_DESCRIPTOR Descriptor
,
733 _Out_ PBL_MEMORY_DESCRIPTOR NewDescriptor
,
734 _In_ ULONGLONG Pages
,
735 _In_ PBL_ADDRESS_RANGE BaseRange
,
736 _In_ PBL_ADDRESS_RANGE VirtualRange
,
737 _In_ BOOLEAN TopDown
,
738 _In_ BL_MEMORY_TYPE MemoryType
,
744 MmMdRemoveRegionFromMdlEx (
745 __in PBL_MEMORY_DESCRIPTOR_LIST MdList
,
747 __in ULONGLONG BasePage
,
748 __in ULONGLONG PageCount
,
749 __in PBL_MEMORY_DESCRIPTOR_LIST NewMdList
754 _In_ PBL_MEMORY_DESCRIPTOR MemoryDescriptor
757 /* PAGE ALLOCATOR ROUTINES ***************************************************/
760 MmPapAllocatePagesInRange (
761 _Inout_ PULONG PhysicalAddress
,
762 _In_ BL_MEMORY_TYPE MemoryType
,
763 _In_ ULONGLONG Pages
,
764 _In_ ULONG Attributes
,
765 _In_ ULONG Alignment
,
766 _In_opt_ PBL_ADDRESS_RANGE Range
,
772 _Out_ PBL_MEMORY_DESCRIPTOR_LIST MemoryMap
,
776 /* HEAP ALLOCATOR ROUTINES ***************************************************/
788 /* DISPLAY ROUTINES **********************************************************/
791 BlDisplayGetTextCellResolution (
792 _Out_ PULONG TextWidth
,
793 _Out_ PULONG TextHeight
796 extern ULONG MmDescriptorCallTreeCount
;
797 extern ULONG BlpApplicationFlags
;
798 extern BL_LIBRARY_PARAMETERS BlpLibraryParameters
;
799 extern BL_TRANSLATION_TYPE MmTranslationType
;
800 extern PBL_ARCH_CONTEXT CurrentExecutionContext
;
801 extern PBL_DEVICE_DESCRIPTOR BlpBootDevice
;
802 extern BL_APPLICATION_ENTRY BlpApplicationEntry
;
803 extern SIMPLE_TEXT_OUTPUT_INTERFACE
*EfiConOut
;