da0456bb2994d9a0352171782453b41dd0f97859
[reactos.git] / reactos / boot / environ / include / bl.h
1 /*
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)
7 */
8
9 #ifndef _BL_H
10 #define _BL_H
11
12 /* INCLUDES ******************************************************************/
13
14 /* C Headers */
15 #include <stdlib.h>
16 #include <stdio.h>
17 #include <wchar.h>
18
19 /* NT Base Headers */
20 #include <ntifs.h>
21
22 /* NDK Headers */
23 #include <ntndk.h>
24
25 /* UEFI Headers */
26 #include <Uefi.h>
27 #include <DevicePath.h>
28 #include <LoadedImage.h>
29
30 VOID
31 EarlyPrint(_In_ PWCHAR Format, ...);
32
33 /* DEFINES *******************************************************************/
34
35 #define BL_APPLICATION_FLAG_CONVERTED_FROM_EFI 0x01
36
37 #define BL_APP_ENTRY_SIGNATURE "BTAPENT"
38
39 #define BOOT_APPLICATION_SIGNATURE_1 'TOOB'
40 #define BOOT_APPLICATION_SIGNATURE_2 ' PPA'
41
42 #define BOOT_MEMORY_TRANSLATION_TYPE_PHYSICAL 0
43 #define BOOT_MEMORY_TRANSLATION_TYPE_VIRTUAL 1
44
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
49
50 #define BL_APPLICATION_ENTRY_FLAG_NO_GUID 0x01
51
52 #define BL_CONTEXT_PAGING_ON 1
53 #define BL_CONTEXT_INTERRUPTS_ON 2
54
55 #define BL_MM_FLAG_USE_FIRMWARE_FOR_MEMORY_MAP_BUFFERS 0x01
56 #define BL_MM_FLAG_REQUEST_COALESCING 0x02
57
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
63
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
70
71 #define BL_MM_REQUEST_DEFAULT_TYPE 1
72 #define BL_MM_REQUEST_TOP_DOWN_TYPE 2
73
74 #define BL_MM_REMOVE_VIRTUAL_REGION_FLAG 0x80000000
75
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
82
83 #define BL_FS_REGISTER_AT_HEAD_FLAG 1
84
85 #define BL_MEMORY_CLASS_SHIFT 28
86
87 /* ENUMERATIONS **************************************************************/
88
89 typedef enum _BL_MEMORY_DESCRIPTOR_TYPE
90 {
91 BlMdPhysical,
92 BlMdVirtual,
93 } BL_MEMORY_DESCRIPTOR_TYPE;
94
95 typedef enum _BL_TRANSLATION_TYPE
96 {
97 BlNone,
98 BlVirtual,
99 BlPae,
100 BlMax
101 } BL_TRANSLATION_TYPE;
102
103 typedef enum _BL_ARCH_MODE
104 {
105 BlProtectedMode,
106 BlRealMode
107 } BL_ARCH_MODE;
108
109 //
110 // Boot Device Types
111 //
112 typedef enum _BL_DEVICE_TYPE
113 {
114 LocalDevice = 0,
115 PartitionDevice = 2,
116 UdpDevice = 4,
117 HardDiskDevice = 6
118 } BL_DEVICE_TYPE;
119
120 //
121 // Local Device Types
122 //
123 typedef enum _BL_LOCAL_DEVICE_TYPE
124 {
125 FloppyDevice = 1,
126 CdRomDevice = 2,
127 RamDiskDevice = 3,
128 } BL_LOCAL_DEVICE_TYPE;
129
130 //
131 // Partition types
132 //
133 typedef enum _BL_PARTITION_TYPE
134 {
135 GptPartition,
136 MbrPartition,
137 RawPartition,
138 } BL_PARTITION_TYPE;
139
140 //
141 // File Path Types
142 //
143 typedef enum _BL_PATH_TYPE
144 {
145 EfiPath = 4
146 } BL_PATH_TYPE;
147
148 //
149 // Classes of Memory
150 //
151 typedef enum _BL_MEMORY_CLASS
152 {
153 BlLoaderClass = 0xD,
154 BlApplicationClass,
155 BlSystemClass
156 } BL_MEMORY_CLASS;
157
158 //
159 // Types of Memory
160 //
161 typedef enum _BL_MEMORY_TYPE
162 {
163 //
164 // Loader Memory
165 //
166 BlLoaderMemory = 0xD0000002,
167 BlLoaderHeap = 0xD0000005,
168 BlLoaderPageDirectory = 0xD0000006,
169 BlLoaderReferencePage = 0xD0000007,
170 BlLoaderRamDisk = 0xD0000008,
171 BlLoaderData = 0xD000000A,
172 BlLoaderSelfMap = 0xD000000F,
173
174 //
175 // Application Memory
176 //
177 BlApplicationData = 0xE0000004,
178
179 //
180 // System Memory
181 //
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,
192 } BL_MEMORY_TYPE;
193
194 typedef enum _BL_MEMORY_ATTR
195 {
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
205 } BL_MEMORY_ATTR;
206
207 /* CALLBACKS *****************************************************************/
208
209 typedef
210 NTSTATUS
211 (*PBL_FS_INIT_CALLBACK) (
212 VOID
213 );
214
215 typedef
216 NTSTATUS
217 (*PBL_FS_DESTROY_CALLBACK) (
218 VOID
219 );
220
221 typedef
222 NTSTATUS
223 (*PBL_FS_MOUNT_CALLBACK) (
224 VOID
225 );
226
227 typedef
228 NTSTATUS
229 (*PBL_FS_PURGE_CALLBACK) (
230 VOID
231 );
232
233 typedef
234 NTSTATUS
235 (*PBL_FILE_DESTROY_CALLBACK) (
236 _In_ PVOID Entry
237 );
238
239 /* DATA STRUCTURES ***********************************************************/
240
241 typedef struct _BL_LIBRARY_PARAMETERS
242 {
243 ULONG LibraryFlags;
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;
252
253 /* This should eventually go into a more public header */
254 typedef struct _BOOT_APPLICATION_PARAMETER_BLOCK
255 {
256 /* This header tells the library what image we're dealing with */
257 ULONG Signature[2];
258 ULONG Version;
259 ULONG Size;
260 ULONG ImageType;
261 ULONG MemoryTranslationType;
262
263 /* Where is the image located */
264 ULONGLONG ImageBase;
265 ULONG ImageSize;
266
267 /* Offset to BL_MEMORY_DATA */
268 ULONG MemoryDataOffset;
269
270 /* Offset to BL_APPLICATION_ENTRY */
271 ULONG AppEntryOffset;
272
273 /* Offset to BL_DEVICE_DESCRPIPTOR */
274 ULONG BootDeviceOffset;
275
276 /* Offset to BL_FIRMWARE_PARAMETERS */
277 ULONG FirmwareParametersOffset;
278
279 /* Offset to BL_RETURN_ARGUMENTS */
280 ULONG ReturnArgumentsOffset;
281 } BOOT_APPLICATION_PARAMETER_BLOCK, *PBOOT_APPLICATION_PARAMETER_BLOCK;
282
283 typedef struct _BL_MEMORY_DATA
284 {
285 ULONG Version;
286 ULONG MdListOffset;
287 ULONG DescriptorCount;
288 ULONG DescriptorSize;
289 ULONG DescriptorOffset;
290 } BL_MEMORY_DATA, *PBL_MEMORY_DATA;
291
292 typedef struct _BL_FIRMWARE_DESCRIPTOR
293 {
294 ULONG Version;
295 ULONG Unknown;
296 EFI_HANDLE ImageHandle;
297 EFI_SYSTEM_TABLE *SystemTable;
298 } BL_FIRMWARE_DESCRIPTOR, *PBL_FIRMWARE_DESCRIPTOR;
299
300 typedef struct _BL_RETURN_ARGUMENTS
301 {
302 ULONG Version;
303 ULONG ReturnArgumentData[6];
304 } BL_RETURN_ARGUMENTS, *PBL_RETURN_ARGUMENTS;
305
306 typedef struct _BL_MEMORY_DESCRIPTOR
307 {
308 LIST_ENTRY ListEntry;
309 union
310 {
311 struct
312 {
313 ULONGLONG BasePage;
314 ULONGLONG VirtualPage;
315 };
316 struct
317 {
318 ULONGLONG BaseAddress;
319 ULONGLONG VirtualAddress;
320 };
321 };
322 ULONGLONG PageCount;
323 ULONG Flags;
324 BL_MEMORY_TYPE Type;
325 } BL_MEMORY_DESCRIPTOR, *PBL_MEMORY_DESCRIPTOR;
326
327 typedef struct _BL_BCD_OPTION
328 {
329 ULONG Type;
330 ULONG DataOffset;
331 ULONG DataSize;
332 ULONG ListOffset;
333 ULONG NextEntryOffset;
334 ULONG Empty;
335 } BL_BCD_OPTION, *PBL_BCD_OPTION;
336
337 typedef struct _BL_APPLICATION_ENTRY
338 {
339 CHAR Signature[8];
340 ULONG Flags;
341 GUID Guid;
342 ULONG Unknown[4];
343 BL_BCD_OPTION BcdData;
344 } BL_APPLICATION_ENTRY, *PBL_APPLICATION_ENTRY;
345
346 typedef struct _BL_HARDDISK_DEVICE
347 {
348 ULONG PartitionType;
349 union
350 {
351 struct
352 {
353 ULONG PartitionSignature;
354 } Mbr;
355
356 struct
357 {
358 GUID PartitionSignature;
359 } Gpt;
360
361 struct
362 {
363 ULONG DiskNumber;
364 } Raw;
365 };
366 } BL_HARDDISK_DEVICE;
367
368 typedef struct _BL_LOCAL_DEVICE
369 {
370 ULONG Type;
371 union
372 {
373 struct
374 {
375 ULONG DriveNumber;
376 } FloppyDisk;
377
378 BL_HARDDISK_DEVICE HardDisk;
379
380 struct
381 {
382 PHYSICAL_ADDRESS ImageBase;
383 LARGE_INTEGER ImageSize;
384 ULONG ImageOffset;
385 } RamDisk;
386 };
387 } BL_LOCAL_DEVICE;
388
389 typedef struct _BL_DEVICE_DESCRIPTOR
390 {
391 ULONG Size;
392 ULONG Flags;
393 DEVICE_TYPE DeviceType;
394 ULONG Unknown;
395 union
396 {
397 BL_LOCAL_DEVICE Local;
398
399 struct
400 {
401 ULONG Unknown;
402 } Remote;
403
404 struct
405 {
406 union
407 {
408 ULONG PartitionNumber;
409 } Mbr;
410
411 union
412 {
413 GUID PartitionGuid;
414 } Gpt;
415
416 BL_LOCAL_DEVICE Disk;
417 } Partition;
418 };
419 } BL_DEVICE_DESCRIPTOR, *PBL_DEVICE_DESCRIPTOR;
420
421 typedef struct _BL_FILE_PATH_DESCRIPTOR
422 {
423 ULONG Version;
424 ULONG Length;
425 ULONG PathType;
426 UCHAR Path[ANYSIZE_ARRAY];
427 } BL_FILE_PATH_DESCRIPTOR, *PBL_FILE_PATH_DESCRIPTOR;
428
429 typedef struct _BL_WINDOWS_LOAD_OPTIONS
430 {
431 CHAR Signature[8];
432 ULONG Version;
433 ULONG Length;
434 ULONG OsPathOffset;
435 WCHAR LoadOptions[ANYSIZE_ARRAY];
436 } BL_WINDOWS_LOAD_OPTIONS, *PBL_WINDOWS_LOAD_OPTIONS;
437
438 typedef struct _BL_ARCH_CONTEXT
439 {
440 BL_ARCH_MODE Mode;
441 BL_TRANSLATION_TYPE TranslationType;
442 ULONG ContextFlags;
443 } BL_ARCH_CONTEXT, *PBL_ARCH_CONTEXT;
444
445 typedef struct _BL_MEMORY_DESCRIPTOR_LIST
446 {
447 LIST_ENTRY ListHead;
448 PLIST_ENTRY First;
449 PLIST_ENTRY This;
450 ULONG Type;
451 } BL_MEMORY_DESCRIPTOR_LIST, *PBL_MEMORY_DESCRIPTOR_LIST;
452
453 typedef struct _BL_ADDRESS_RANGE
454 {
455 ULONGLONG Minimum;
456 ULONGLONG Maximum;
457 } BL_ADDRESS_RANGE, *PBL_ADDRESS_RANGE;
458
459 typedef struct _BL_FILE_ENTRY
460 {
461 ULONG DeviceIndex;
462 PBL_FILE_DESTROY_CALLBACK DestroyCallback;
463 } BL_FILE_ENTRY, *PBL_FILE_ENTRY;
464
465 typedef struct _BL_DEVICE_ENTRY
466 {
467 ULONG ReferenceCount;
468 } BL_DEVICE_ENTRY, *PBL_DEVICE_ENTRY;
469
470 typedef struct _BL_FILE_SYSTEM_ENTRY
471 {
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;
478
479 typedef struct _BL_FILE_SYSTEM_REGISTRATION_TABLE
480 {
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;
486
487 /* INLINE ROUTINES ***********************************************************/
488
489 FORCEINLINE
490 VOID
491 BlSetupDefaultParameters (
492 _Out_ PBL_LIBRARY_PARAMETERS LibraryParameters
493 )
494 {
495 BL_LIBRARY_PARAMETERS DefaultParameters =
496 {
497 0x20,
498 BlVirtual,
499 1024,
500 2 * 1024 * 1024,
501 0,
502 NULL,
503 0,
504 NULL
505 };
506
507 /* Copy the defaults */
508 RtlCopyMemory(LibraryParameters, &DefaultParameters, sizeof(*LibraryParameters));
509 }
510
511 FORCEINLINE
512 VOID
513 MmMdInitializeListHead (
514 _In_ PBL_MEMORY_DESCRIPTOR_LIST List
515 )
516 {
517 /* Initialize the list */
518 InitializeListHead(&List->ListHead);
519 List->First = &List->ListHead;
520 List->This = NULL;
521 }
522
523 /* INITIALIZATION ROUTINES ***************************************************/
524
525 NTSTATUS
526 BlInitializeLibrary(
527 _In_ PBOOT_APPLICATION_PARAMETER_BLOCK BootAppParameters,
528 _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
529 );
530
531 NTSTATUS
532 BlpArchInitialize (
533 _In_ ULONG Phase
534 );
535
536 NTSTATUS
537 BlpFwInitialize (
538 _In_ ULONG Phase,
539 _In_ PBL_FIRMWARE_DESCRIPTOR FirmwareParameters
540 );
541
542 NTSTATUS
543 BlpMmInitialize (
544 _In_ PBL_MEMORY_DATA MemoryData,
545 _In_ BL_TRANSLATION_TYPE TranslationType,
546 _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
547 );
548
549 NTSTATUS
550 MmBaInitialize (
551 VOID
552 );
553
554 NTSTATUS
555 MmPaInitialize (
556 _In_ PBL_MEMORY_DATA MemoryData,
557 _In_ ULONG MinimumPages
558 );
559
560 NTSTATUS
561 MmArchInitialize (
562 _In_ ULONG Phase,
563 _In_ PBL_MEMORY_DATA MemoryData,
564 _In_ BL_TRANSLATION_TYPE TranslationType,
565 _In_ BL_TRANSLATION_TYPE LibraryTranslationType
566 );
567
568 NTSTATUS
569 MmHaInitialize (
570 _In_ ULONG HeapSize,
571 _In_ ULONG HeapAttributes
572 );
573
574 VOID
575 MmMdInitialize (
576 _In_ ULONG Phase,
577 _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
578 );
579
580 NTSTATUS
581 BlpDeviceInitialize (
582 VOID
583 );
584
585 NTSTATUS
586 BlpIoInitialize (
587 VOID
588 );
589
590 NTSTATUS
591 BlpFileInitialize (
592 VOID
593 );
594
595 NTSTATUS
596 FatInitialize (
597 VOID
598 );
599
600 NTSTATUS
601 BlpDisplayInitialize (
602 _In_ ULONG Flags
603 );
604
605 /* FIRMWARE ROUTINES *********************************************************/
606
607 NTSTATUS
608 EfiAllocatePages (
609 _In_ ULONG Type,
610 _In_ ULONG Pages,
611 _Inout_ EFI_PHYSICAL_ADDRESS* Memory
612 );
613
614 NTSTATUS
615 EfiStall (
616 _In_ ULONG StallTime
617 );
618
619 NTSTATUS
620 EfiConOutQueryMode (
621 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface,
622 _In_ ULONG Mode,
623 _In_ UINTN* Columns,
624 _In_ UINTN* Rows
625 );
626
627 NTSTATUS
628 EfiConOutSetMode (
629 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface,
630 _In_ ULONG Mode
631 );
632
633 VOID
634 EfiConOutReadCurrentMode (
635 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface,
636 _Out_ EFI_SIMPLE_TEXT_OUTPUT_MODE* Mode
637 );
638
639 NTSTATUS
640 EfiConOutSetAttribute (
641 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface,
642 _In_ ULONG Attribute
643 );
644
645 NTSTATUS
646 EfiConOutSetCursorPosition (
647 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface,
648 _In_ ULONG Column,
649 _In_ ULONG Row
650 );
651
652 NTSTATUS
653 EfiConOutEnableCursor (
654 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface,
655 _In_ BOOLEAN Visible
656 );
657
658 /* PLATFORM TIMER ROUTINES ***************************************************/
659
660 NTSTATUS
661 BlpTimeCalibratePerformanceCounter (
662 VOID
663 );
664
665 /* UTILITY ROUTINES **********************************************************/
666
667 EFI_STATUS
668 EfiGetEfiStatusCode(
669 _In_ NTSTATUS Status
670 );
671
672 NTSTATUS
673 EfiGetNtStatusCode (
674 _In_ EFI_STATUS EfiStatus
675 );
676
677 NTSTATUS
678 BlUtlInitialize (
679 VOID
680 );
681
682 /* BCD ROUTINES **************************************************************/
683
684 ULONG
685 BlGetBootOptionSize (
686 _In_ PBL_BCD_OPTION BcdOption
687 );
688
689 /* CONTEXT ROUTINES **********************************************************/
690
691 VOID
692 BlpArchSwitchContext (
693 _In_ BL_ARCH_MODE NewMode
694 );
695
696 /* MEMORY DESCRIPTOR ROUTINES ************************************************/
697
698 VOID
699 MmMdFreeList(
700 _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList
701 );
702
703 PBL_MEMORY_DESCRIPTOR
704 MmMdInitByteGranularDescriptor (
705 _In_ ULONG Flags,
706 _In_ BL_MEMORY_TYPE Type,
707 _In_ ULONGLONG BasePage,
708 _In_ ULONGLONG VirtualPage,
709 _In_ ULONGLONG PageCount
710 );
711
712 VOID
713 MmMdFreeGlobalDescriptors (
714 VOID
715 );
716
717 NTSTATUS
718 MmMdAddDescriptorToList (
719 _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList,
720 _In_ PBL_MEMORY_DESCRIPTOR MemoryDescriptor,
721 _In_ ULONG Flags
722 );
723
724 VOID
725 MmMdRemoveDescriptorFromList (
726 _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList,
727 _In_ PBL_MEMORY_DESCRIPTOR Entry
728 );
729
730 BOOLEAN
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,
739 _In_ ULONG Flags,
740 _In_ ULONG Alignment
741 );
742
743 NTSTATUS
744 MmMdRemoveRegionFromMdlEx (
745 __in PBL_MEMORY_DESCRIPTOR_LIST MdList,
746 __in ULONG Flags,
747 __in ULONGLONG BasePage,
748 __in ULONGLONG PageCount,
749 __in PBL_MEMORY_DESCRIPTOR_LIST NewMdList
750 );
751
752 NTSTATUS
753 MmMdFreeDescriptor (
754 _In_ PBL_MEMORY_DESCRIPTOR MemoryDescriptor
755 );
756
757 /* PAGE ALLOCATOR ROUTINES ***************************************************/
758
759 NTSTATUS
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,
767 _In_ ULONG Type
768 );
769
770 NTSTATUS
771 MmFwGetMemoryMap (
772 _Out_ PBL_MEMORY_DESCRIPTOR_LIST MemoryMap,
773 _In_ ULONG Flags
774 );
775
776 /* HEAP ALLOCATOR ROUTINES ***************************************************/
777
778 PVOID
779 BlMmAllocateHeap (
780 _In_ ULONG Size
781 );
782
783 NTSTATUS
784 BlMmFreeHeap (
785 _In_ PVOID Buffer
786 );
787
788 /* DISPLAY ROUTINES **********************************************************/
789
790 VOID
791 BlDisplayGetTextCellResolution (
792 _Out_ PULONG TextWidth,
793 _Out_ PULONG TextHeight
794 );
795
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;
804
805 #endif