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_MEMORY_CLASS_SHIFT 28
83 /* ENUMERATIONS **************************************************************/
85 typedef enum _BL_MEMORY_DESCRIPTOR_TYPE
89 } BL_MEMORY_DESCRIPTOR_TYPE
;
91 typedef enum _BL_TRANSLATION_TYPE
97 } BL_TRANSLATION_TYPE
;
99 typedef enum _BL_ARCH_MODE
108 typedef enum _BL_DEVICE_TYPE
117 // Local Device Types
119 typedef enum _BL_LOCAL_DEVICE_TYPE
124 } BL_LOCAL_DEVICE_TYPE
;
129 typedef enum _BL_PARTITION_TYPE
139 typedef enum _BL_PATH_TYPE
147 typedef enum _BL_MEMORY_CLASS
157 typedef enum _BL_MEMORY_TYPE
162 BlLoaderMemory
= 0xD0000002,
163 BlLoaderHeap
= 0xD0000005,
164 BlLoaderPageDirectory
= 0xD0000006,
165 BlLoaderReferencePage
= 0xD0000007,
166 BlLoaderRamDisk
= 0xD0000008,
167 BlLoaderData
= 0xD000000A,
168 BlLoaderSelfMap
= 0xD000000F,
171 // Application Memory
173 BlApplicationData
= 0xE0000004,
178 BlConventionalMemory
= 0xF0000001,
179 BlUnusableMemory
= 0xF0000002,
180 BlReservedMemory
= 0xF0000003,
181 BlEfiBootMemory
= 0xF0000004,
182 BlEfiRuntimeMemory
= 0xF0000006,
183 BlAcpiReclaimMemory
= 0xF0000008,
184 BlAcpiNvsMemory
= 0xF0000009,
185 BlDeviceIoMemory
= 0xF000000A,
186 BlDevicePortMemory
= 0xF000000B,
187 BlPalMemory
= 0xF000000C,
190 typedef enum _BL_MEMORY_ATTR
192 BlMemoryUncached
= 1,
193 BlMemoryWriteCombined
= 2,
194 BlMemoryWriteThrough
= 4,
195 BlMemoryWriteBack
= 8,
196 BlMemoryUncachedExported
= 0x10,
197 BlMemoryWriteProtected
= 0x100,
198 BlMemoryReadProtected
= 0x200,
199 BlMemoryExecuteProtected
= 0x400,
200 BlMemoryRuntime
= 0x1000000
203 /* DATA STRUCTURES ***********************************************************/
205 typedef struct _BL_LIBRARY_PARAMETERS
208 ULONG TranslationType
;
209 ULONG MinimumAllocationCount
;
210 ULONG MinimumHeapSize
;
211 ULONG HeapAllocationAttributes
;
212 PWCHAR ApplicationBaseDirectory
;
213 ULONG DescriptorCount
;
214 PWCHAR FontBaseDirectory
;
215 } BL_LIBRARY_PARAMETERS
, *PBL_LIBRARY_PARAMETERS
;
217 /* This should eventually go into a more public header */
218 typedef struct _BOOT_APPLICATION_PARAMETER_BLOCK
220 /* This header tells the library what image we're dealing with */
225 ULONG MemoryTranslationType
;
227 /* Where is the image located */
231 /* Offset to BL_MEMORY_DATA */
232 ULONG MemoryDataOffset
;
234 /* Offset to BL_APPLICATION_ENTRY */
235 ULONG AppEntryOffset
;
237 /* Offset to BL_DEVICE_DESCRPIPTOR */
238 ULONG BootDeviceOffset
;
240 /* Offset to BL_FIRMWARE_PARAMETERS */
241 ULONG FirmwareParametersOffset
;
243 /* Offset to BL_RETURN_ARGUMENTS */
244 ULONG ReturnArgumentsOffset
;
245 } BOOT_APPLICATION_PARAMETER_BLOCK
, *PBOOT_APPLICATION_PARAMETER_BLOCK
;
247 typedef struct _BL_MEMORY_DATA
251 ULONG DescriptorCount
;
252 ULONG DescriptorSize
;
253 ULONG DescriptorOffset
;
254 } BL_MEMORY_DATA
, *PBL_MEMORY_DATA
;
256 typedef struct _BL_FIRMWARE_DESCRIPTOR
260 EFI_HANDLE ImageHandle
;
261 EFI_SYSTEM_TABLE
*SystemTable
;
262 } BL_FIRMWARE_DESCRIPTOR
, *PBL_FIRMWARE_DESCRIPTOR
;
264 typedef struct _BL_RETURN_ARGUMENTS
267 ULONG ReturnArgumentData
[6];
268 } BL_RETURN_ARGUMENTS
, *PBL_RETURN_ARGUMENTS
;
270 typedef struct _BL_MEMORY_DESCRIPTOR
272 LIST_ENTRY ListEntry
;
278 ULONGLONG VirtualPage
;
282 ULONGLONG BaseAddress
;
283 ULONGLONG VirtualAddress
;
289 } BL_MEMORY_DESCRIPTOR
, *PBL_MEMORY_DESCRIPTOR
;
291 typedef struct _BL_BCD_OPTION
297 ULONG NextEntryOffset
;
299 } BL_BCD_OPTION
, *PBL_BCD_OPTION
;
301 typedef struct _BL_APPLICATION_ENTRY
307 BL_BCD_OPTION BcdData
;
308 } BL_APPLICATION_ENTRY
, *PBL_APPLICATION_ENTRY
;
310 typedef struct _BL_HARDDISK_DEVICE
317 ULONG PartitionSignature
;
322 GUID PartitionSignature
;
330 } BL_HARDDISK_DEVICE
;
332 typedef struct _BL_LOCAL_DEVICE
342 BL_HARDDISK_DEVICE HardDisk
;
346 PHYSICAL_ADDRESS ImageBase
;
347 LARGE_INTEGER ImageSize
;
353 typedef struct _BL_DEVICE_DESCRIPTOR
357 DEVICE_TYPE DeviceType
;
361 BL_LOCAL_DEVICE Local
;
372 ULONG PartitionNumber
;
380 BL_LOCAL_DEVICE Disk
;
383 } BL_DEVICE_DESCRIPTOR
, *PBL_DEVICE_DESCRIPTOR
;
385 typedef struct _BL_FILE_PATH_DESCRIPTOR
390 UCHAR Path
[ANYSIZE_ARRAY
];
391 } BL_FILE_PATH_DESCRIPTOR
, *PBL_FILE_PATH_DESCRIPTOR
;
393 typedef struct _BL_WINDOWS_LOAD_OPTIONS
399 WCHAR LoadOptions
[ANYSIZE_ARRAY
];
400 } BL_WINDOWS_LOAD_OPTIONS
, *PBL_WINDOWS_LOAD_OPTIONS
;
402 typedef struct _BL_ARCH_CONTEXT
405 BL_TRANSLATION_TYPE TranslationType
;
407 } BL_ARCH_CONTEXT
, *PBL_ARCH_CONTEXT
;
409 typedef struct _BL_MEMORY_DESCRIPTOR_LIST
415 } BL_MEMORY_DESCRIPTOR_LIST
, *PBL_MEMORY_DESCRIPTOR_LIST
;
417 typedef struct _BL_ADDRESS_RANGE
421 } BL_ADDRESS_RANGE
, *PBL_ADDRESS_RANGE
;
423 /* INLINE ROUTINES ***********************************************************/
427 BlSetupDefaultParameters (
428 _Out_ PBL_LIBRARY_PARAMETERS LibraryParameters
431 BL_LIBRARY_PARAMETERS DefaultParameters
=
443 /* Copy the defaults */
444 RtlCopyMemory(LibraryParameters
, &DefaultParameters
, sizeof(*LibraryParameters
));
449 MmMdInitializeListHead (
450 _In_ PBL_MEMORY_DESCRIPTOR_LIST List
453 /* Initialize the list */
454 InitializeListHead(&List
->ListHead
);
455 List
->First
= &List
->ListHead
;
459 /* INITIALIZATION ROUTINES ***************************************************/
463 _In_ PBOOT_APPLICATION_PARAMETER_BLOCK BootAppParameters
,
464 _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
475 _In_ PBL_FIRMWARE_DESCRIPTOR FirmwareParameters
480 _In_ PBL_MEMORY_DATA MemoryData
,
481 _In_ BL_TRANSLATION_TYPE TranslationType
,
482 _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
492 _In_ PBL_MEMORY_DATA MemoryData
,
493 _In_ ULONG MinimumPages
499 _In_ PBL_MEMORY_DATA MemoryData
,
500 _In_ BL_TRANSLATION_TYPE TranslationType
,
501 _In_ BL_TRANSLATION_TYPE LibraryTranslationType
507 _In_ ULONG HeapAttributes
513 _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
516 /* FIRMWARE ROUTINES *********************************************************/
522 _Inout_ EFI_PHYSICAL_ADDRESS
* Memory
525 /* UTILITY ROUTINES **********************************************************/
534 _In_ EFI_STATUS EfiStatus
537 /* BCD ROUTINES **************************************************************/
540 BlGetBootOptionSize (
541 _In_ PBL_BCD_OPTION BcdOption
544 /* CONTEXT ROUTINES **********************************************************/
547 BlpArchSwitchContext (
548 _In_ BL_ARCH_MODE NewMode
551 /* MEMORY DESCRIPTOR ROUTINES ************************************************/
555 _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList
558 PBL_MEMORY_DESCRIPTOR
559 MmMdInitByteGranularDescriptor (
561 _In_ BL_MEMORY_TYPE Type
,
562 _In_ ULONGLONG BasePage
,
563 _In_ ULONGLONG VirtualPage
,
564 _In_ ULONGLONG PageCount
568 MmMdFreeGlobalDescriptors (
573 MmMdAddDescriptorToList (
574 _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList
,
575 _In_ PBL_MEMORY_DESCRIPTOR MemoryDescriptor
,
580 MmMdRemoveDescriptorFromList (
581 _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList
,
582 _In_ PBL_MEMORY_DESCRIPTOR Entry
586 MmMdFindSatisfyingRegion (
587 _In_ PBL_MEMORY_DESCRIPTOR Descriptor
,
588 _Out_ PBL_MEMORY_DESCRIPTOR NewDescriptor
,
589 _In_ ULONGLONG Pages
,
590 _In_ PBL_ADDRESS_RANGE BaseRange
,
591 _In_ PBL_ADDRESS_RANGE VirtualRange
,
592 _In_ BOOLEAN TopDown
,
593 _In_ BL_MEMORY_TYPE MemoryType
,
599 MmMdRemoveRegionFromMdlEx (
600 __in PBL_MEMORY_DESCRIPTOR_LIST MdList
,
602 __in ULONGLONG BasePage
,
603 __in ULONGLONG PageCount
,
604 __in PBL_MEMORY_DESCRIPTOR_LIST NewMdList
609 _In_ PBL_MEMORY_DESCRIPTOR MemoryDescriptor
612 /* PAGE ALLOCATOR ROUTINES ***************************************************/
615 MmPapAllocatePagesInRange (
616 _Inout_ PULONG PhysicalAddress
,
617 _In_ BL_MEMORY_TYPE MemoryType
,
618 _In_ ULONGLONG Pages
,
619 _In_ ULONG Attributes
,
620 _In_ ULONG Alignment
,
621 _In_opt_ PBL_ADDRESS_RANGE Range
,
627 _Out_ PBL_MEMORY_DESCRIPTOR_LIST MemoryMap
,
631 /* HEAP ALLOCATOR ROUTINES ***************************************************/
638 extern ULONG MmDescriptorCallTreeCount
;
639 extern ULONG BlpApplicationFlags
;
640 extern BL_LIBRARY_PARAMETERS BlpLibraryParameters
;
641 extern BL_TRANSLATION_TYPE MmTranslationType
;
642 extern PBL_ARCH_CONTEXT CurrentExecutionContext
;
643 extern PBL_DEVICE_DESCRIPTOR BlpBootDevice
;