[BOOTMGFW]
[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 #include <GraphicsOutput.h>
30 #include <UgaDraw.h>
31
32 VOID
33 EarlyPrint(_In_ PWCHAR Format, ...);
34
35 /* DEFINES *******************************************************************/
36
37 #define BL_APPLICATION_FLAG_CONVERTED_FROM_EFI 0x01
38
39 #define BL_APP_ENTRY_SIGNATURE "BTAPENT"
40
41 #define BOOT_APPLICATION_SIGNATURE_1 'TOOB'
42 #define BOOT_APPLICATION_SIGNATURE_2 ' PPA'
43
44 #define BOOT_MEMORY_TRANSLATION_TYPE_PHYSICAL 0
45 #define BOOT_MEMORY_TRANSLATION_TYPE_VIRTUAL 1
46
47 #define BOOT_APPLICATION_VERSION 2
48 #define BL_MEMORY_DATA_VERSION 1
49 #define BL_RETURN_ARGUMENTS_VERSION 1
50 #define BL_FIRMWARE_DESCRIPTOR_VERSION 2
51
52 #define BL_APPLICATION_ENTRY_FLAG_NO_GUID 0x01
53
54 #define BL_CONTEXT_PAGING_ON 1
55 #define BL_CONTEXT_INTERRUPTS_ON 2
56
57 #define BL_MM_FLAG_USE_FIRMWARE_FOR_MEMORY_MAP_BUFFERS 0x01
58 #define BL_MM_FLAG_REQUEST_COALESCING 0x02
59
60 #define BL_MM_ADD_DESCRIPTOR_COALESCE_FLAG 0x01
61 #define BL_MM_ADD_DESCRIPTOR_TRUNCATE_FLAG 0x02
62 #define BL_MM_ADD_DESCRIPTOR_NEVER_COALESCE_FLAG 0x10
63 #define BL_MM_ADD_DESCRIPTOR_NEVER_TRUNCATE_FLAG 0x20
64 #define BL_MM_ADD_DESCRIPTOR_UPDATE_LIST_POINTER_FLAG 0x2000
65
66 #define BL_MM_REQUEST_DEFAULT_TYPE 1
67 #define BL_MM_REQUEST_TOP_DOWN_TYPE 2
68
69 #define BL_MM_REMOVE_VIRTUAL_REGION_FLAG 0x80000000
70
71 #define BL_LIBRARY_FLAG_NO_DISPLAY 0x01
72 #define BL_LIBRARY_FLAG_REINITIALIZE 0x02
73 #define BL_LIBRARY_FLAG_REINITIALIZE_ALL 0x04
74 #define BL_LIBRARY_FLAG_ZERO_HEAP_ALLOCATIONS_ON_FREE 0x10
75 #define BL_LIBRARY_FLAG_INITIALIZATION_COMPLETED 0x20
76 #define BL_LIBRARY_FLAG_NO_GRAPHICS_CONSOLE 0x800
77
78 #define BL_DISPLAY_GRAPHICS_FORCED_VIDEO_MODE_FLAG 0x01
79 #define BL_DISPLAY_GRAPHICS_FORCED_HIGH_RES_MODE_FLAG 0x02
80
81 #define BL_FS_REGISTER_AT_HEAD_FLAG 1
82
83 #define BL_MEMORY_CLASS_SHIFT 28
84
85 /* ENUMERATIONS **************************************************************/
86
87 typedef enum _BL_COLOR
88 {
89 Black,
90 Blue,
91 Green,
92 Cyan,
93 Red,
94 Magenta,
95 Brown,
96 LtGray,
97 Gray,
98 LtBlue,
99 LtGreen,
100 LtCyan,
101 LtRed,
102 LtMagenta,
103 Yellow,
104 White
105 } BL_COLOR, *PBL_COLOR;
106
107 typedef enum _BL_MEMORY_DESCRIPTOR_TYPE
108 {
109 BlMdPhysical,
110 BlMdVirtual,
111 } BL_MEMORY_DESCRIPTOR_TYPE;
112
113 typedef enum _BL_TRANSLATION_TYPE
114 {
115 BlNone,
116 BlVirtual,
117 BlPae,
118 BlMax
119 } BL_TRANSLATION_TYPE;
120
121 typedef enum _BL_ARCH_MODE
122 {
123 BlProtectedMode,
124 BlRealMode
125 } BL_ARCH_MODE;
126
127 //
128 // Boot Device Types
129 //
130 typedef enum _BL_DEVICE_TYPE
131 {
132 LocalDevice = 0,
133 PartitionDevice = 2,
134 UdpDevice = 4,
135 HardDiskDevice = 6
136 } BL_DEVICE_TYPE;
137
138 //
139 // Local Device Types
140 //
141 typedef enum _BL_LOCAL_DEVICE_TYPE
142 {
143 FloppyDevice = 1,
144 CdRomDevice = 2,
145 RamDiskDevice = 3,
146 } BL_LOCAL_DEVICE_TYPE;
147
148 //
149 // Partition types
150 //
151 typedef enum _BL_PARTITION_TYPE
152 {
153 GptPartition,
154 MbrPartition,
155 RawPartition,
156 } BL_PARTITION_TYPE;
157
158 //
159 // File Path Types
160 //
161 typedef enum _BL_PATH_TYPE
162 {
163 EfiPath = 4
164 } BL_PATH_TYPE;
165
166 //
167 // Classes of Memory
168 //
169 typedef enum _BL_MEMORY_CLASS
170 {
171 BlLoaderClass = 0xD,
172 BlApplicationClass,
173 BlSystemClass
174 } BL_MEMORY_CLASS;
175
176 //
177 // Types of Memory
178 //
179 typedef enum _BL_MEMORY_TYPE
180 {
181 //
182 // Loader Memory
183 //
184 BlLoaderMemory = 0xD0000002,
185 BlLoaderHeap = 0xD0000005,
186 BlLoaderPageDirectory = 0xD0000006,
187 BlLoaderReferencePage = 0xD0000007,
188 BlLoaderRamDisk = 0xD0000008,
189 BlLoaderData = 0xD000000A,
190 BlLoaderSelfMap = 0xD000000F,
191
192 //
193 // Application Memory
194 //
195 BlApplicationData = 0xE0000004,
196
197 //
198 // System Memory
199 //
200 BlConventionalMemory = 0xF0000001,
201 BlUnusableMemory = 0xF0000002,
202 BlReservedMemory = 0xF0000003,
203 BlEfiBootMemory = 0xF0000004,
204 BlEfiRuntimeMemory = 0xF0000006,
205 BlAcpiReclaimMemory = 0xF0000008,
206 BlAcpiNvsMemory = 0xF0000009,
207 BlDeviceIoMemory = 0xF000000A,
208 BlDevicePortMemory = 0xF000000B,
209 BlPalMemory = 0xF000000C,
210 } BL_MEMORY_TYPE;
211
212 typedef enum _BL_MEMORY_ATTR
213 {
214 //
215 // Memory Caching Attributes
216 //
217 BlMemoryUncached = 0x00000001,
218 BlMemoryWriteCombined = 0x00000002,
219 BlMemoryWriteThrough = 0x00000004,
220 BlMemoryWriteBack = 0x00000008,
221 BlMemoryUncachedExported = 0x00000010,
222 BlMemoryValidCacheAttributes = BlMemoryUncached | BlMemoryWriteCombined | BlMemoryWriteThrough | BlMemoryWriteBack | BlMemoryUncachedExported,
223 BlMemoryValidCacheAttributeMask = 0x000000FF,
224
225 //
226 // Memory Protection Attributes
227 //
228 BlMemoryWriteProtected = 0x00000100,
229 BlMemoryReadProtected = 0x00000200,
230 BlMemoryExecuteProtected = 0x00000400,
231 BlMemoryValidProtectionAttributes = BlMemoryWriteProtected | BlMemoryReadProtected | BlMemoryExecuteProtected,
232 BlMemoryValidProtectionAttributeMask = 0x0000FF00,
233
234 //
235 // Memory Allocation Attributes
236 //
237 BlMemoryNonFixed = 0x00020000,
238 BlMemoryFixed = 0x00040000,
239 BlMemoryValidAllocationAttributes = BlMemoryNonFixed | BlMemoryFixed,
240 BlMemoryValidAllocationAttributeMask = 0x00FF0000,
241
242 //
243 // Memory Type Attributes
244 //
245 BlMemoryRuntime = 0x01000000,
246 BlMemoryCoalesced = 0x02000000,
247 BlMemoryUpdate = 0x04000000,
248 BlMemoryNonFirmware = 0x08000000,
249 BlMemorySpecial = 0x20000000,
250 BlMemoryFirmware = 0x80000000,
251 BlMemoryValidTypeAttributes = BlMemoryRuntime | BlMemoryCoalesced | BlMemoryUpdate | BlMemoryNonFirmware | BlMemorySpecial | BlMemoryFirmware,
252 BlMemoryValidTypeAttributeMask = 0xFF000000,
253 } BL_MEMORY_ATTR;
254
255 /* CALLBACKS *****************************************************************/
256
257 typedef
258 NTSTATUS
259 (*PBL_FS_INIT_CALLBACK) (
260 VOID
261 );
262
263 typedef
264 NTSTATUS
265 (*PBL_FS_DESTROY_CALLBACK) (
266 VOID
267 );
268
269 typedef
270 NTSTATUS
271 (*PBL_FS_MOUNT_CALLBACK) (
272 VOID
273 );
274
275 typedef
276 NTSTATUS
277 (*PBL_FS_PURGE_CALLBACK) (
278 VOID
279 );
280
281 typedef
282 NTSTATUS
283 (*PBL_FILE_DESTROY_CALLBACK) (
284 _In_ PVOID Entry
285 );
286
287 struct _BL_TEXT_CONSOLE;
288 struct _BL_DISPLAY_STATE;
289 typedef
290 NTSTATUS
291 (*PCONSOLE_DESTRUCT) (
292 _In_ struct _BL_TEXT_CONSOLE* Console
293 );
294
295 typedef
296 NTSTATUS
297 (*PCONSOLE_REINITIALIZE) (
298 _In_ struct _BL_TEXT_CONSOLE* Console
299 );
300
301 typedef
302 NTSTATUS
303 (*PCONSOLE_GET_TEXT_STATE) (
304 _In_ struct _BL_TEXT_CONSOLE* Console,
305 _Out_ struct _BL_DISPLAY_STATE* TextState
306 );
307
308 typedef
309 NTSTATUS
310 (*PCONSOLE_SET_TEXT_STATE) (
311 _In_ struct _BL_TEXT_CONSOLE* Console,
312 _In_ ULONG Flags,
313 _In_ struct _BL_DISPLAY_STATE* TextState
314 );
315
316 typedef
317 NTSTATUS
318 (*PCONSOLE_GET_TEXT_RESOLUTION) (
319 _In_ struct _BL_TEXT_CONSOLE* Console,
320 _Out_ PULONG TextResolution
321 );
322
323 typedef
324 NTSTATUS
325 (*PCONSOLE_SET_TEXT_RESOLUTION) (
326 _In_ struct _BL_TEXT_CONSOLE* Console,
327 _In_ ULONG NewTextResolution,
328 _Out_ PULONG OldTextResolution
329 );
330
331 typedef
332 NTSTATUS
333 (*PCONSOLE_CLEAR_TEXT) (
334 _In_ struct _BL_TEXT_CONSOLE* Console,
335 _In_ ULONG Attribute
336 );
337
338 typedef
339 NTSTATUS
340 (*PCONSOLE_WRITE_TEXT) (
341 _In_ struct _BL_TEXT_CONSOLE* Console,
342 _In_ PCHAR Text,
343 _In_ ULONG Attribute
344 );
345
346 /* DATA STRUCTURES ***********************************************************/
347
348 typedef struct _BL_LIBRARY_PARAMETERS
349 {
350 ULONG LibraryFlags;
351 ULONG TranslationType;
352 ULONG MinimumAllocationCount;
353 ULONG MinimumHeapSize;
354 ULONG HeapAllocationAttributes;
355 PWCHAR ApplicationBaseDirectory;
356 ULONG DescriptorCount;
357 PWCHAR FontBaseDirectory;
358 } BL_LIBRARY_PARAMETERS, *PBL_LIBRARY_PARAMETERS;
359
360 /* This should eventually go into a more public header */
361 typedef struct _BOOT_APPLICATION_PARAMETER_BLOCK
362 {
363 /* This header tells the library what image we're dealing with */
364 ULONG Signature[2];
365 ULONG Version;
366 ULONG Size;
367 ULONG ImageType;
368 ULONG MemoryTranslationType;
369
370 /* Where is the image located */
371 ULONGLONG ImageBase;
372 ULONG ImageSize;
373
374 /* Offset to BL_MEMORY_DATA */
375 ULONG MemoryDataOffset;
376
377 /* Offset to BL_APPLICATION_ENTRY */
378 ULONG AppEntryOffset;
379
380 /* Offset to BL_DEVICE_DESCRPIPTOR */
381 ULONG BootDeviceOffset;
382
383 /* Offset to BL_FIRMWARE_PARAMETERS */
384 ULONG FirmwareParametersOffset;
385
386 /* Offset to BL_RETURN_ARGUMENTS */
387 ULONG ReturnArgumentsOffset;
388 } BOOT_APPLICATION_PARAMETER_BLOCK, *PBOOT_APPLICATION_PARAMETER_BLOCK;
389
390 typedef struct _BL_MEMORY_DATA
391 {
392 ULONG Version;
393 ULONG MdListOffset;
394 ULONG DescriptorCount;
395 ULONG DescriptorSize;
396 ULONG DescriptorOffset;
397 } BL_MEMORY_DATA, *PBL_MEMORY_DATA;
398
399 typedef struct _BL_FIRMWARE_DESCRIPTOR
400 {
401 ULONG Version;
402 ULONG Unknown;
403 EFI_HANDLE ImageHandle;
404 EFI_SYSTEM_TABLE *SystemTable;
405 } BL_FIRMWARE_DESCRIPTOR, *PBL_FIRMWARE_DESCRIPTOR;
406
407 typedef struct _BL_RETURN_ARGUMENTS
408 {
409 ULONG Version;
410 ULONG ReturnArgumentData[6];
411 } BL_RETURN_ARGUMENTS, *PBL_RETURN_ARGUMENTS;
412
413 typedef struct _BL_MEMORY_DESCRIPTOR
414 {
415 LIST_ENTRY ListEntry;
416 union
417 {
418 struct
419 {
420 ULONGLONG BasePage;
421 ULONGLONG VirtualPage;
422 };
423 struct
424 {
425 ULONGLONG BaseAddress;
426 ULONGLONG VirtualAddress;
427 };
428 };
429 ULONGLONG PageCount;
430 ULONG Flags;
431 BL_MEMORY_TYPE Type;
432 } BL_MEMORY_DESCRIPTOR, *PBL_MEMORY_DESCRIPTOR;
433
434 typedef struct _BL_BCD_OPTION
435 {
436 ULONG Type;
437 ULONG DataOffset;
438 ULONG DataSize;
439 ULONG ListOffset;
440 ULONG NextEntryOffset;
441 ULONG Empty;
442 } BL_BCD_OPTION, *PBL_BCD_OPTION;
443
444 typedef struct _BL_APPLICATION_ENTRY
445 {
446 CHAR Signature[8];
447 ULONG Flags;
448 GUID Guid;
449 ULONG Unknown[4];
450 BL_BCD_OPTION BcdData;
451 } BL_APPLICATION_ENTRY, *PBL_APPLICATION_ENTRY;
452
453 typedef struct _BL_HARDDISK_DEVICE
454 {
455 ULONG PartitionType;
456 union
457 {
458 struct
459 {
460 ULONG PartitionSignature;
461 } Mbr;
462
463 struct
464 {
465 GUID PartitionSignature;
466 } Gpt;
467
468 struct
469 {
470 ULONG DiskNumber;
471 } Raw;
472 };
473 } BL_HARDDISK_DEVICE;
474
475 typedef struct _BL_LOCAL_DEVICE
476 {
477 ULONG Type;
478 union
479 {
480 struct
481 {
482 ULONG DriveNumber;
483 } FloppyDisk;
484
485 BL_HARDDISK_DEVICE HardDisk;
486
487 struct
488 {
489 PHYSICAL_ADDRESS ImageBase;
490 LARGE_INTEGER ImageSize;
491 ULONG ImageOffset;
492 } RamDisk;
493 };
494 } BL_LOCAL_DEVICE;
495
496 typedef struct _BL_DEVICE_DESCRIPTOR
497 {
498 ULONG Size;
499 ULONG Flags;
500 DEVICE_TYPE DeviceType;
501 ULONG Unknown;
502 union
503 {
504 BL_LOCAL_DEVICE Local;
505
506 struct
507 {
508 ULONG Unknown;
509 } Remote;
510
511 struct
512 {
513 union
514 {
515 ULONG PartitionNumber;
516 } Mbr;
517
518 union
519 {
520 GUID PartitionGuid;
521 } Gpt;
522
523 BL_LOCAL_DEVICE Disk;
524 } Partition;
525 };
526 } BL_DEVICE_DESCRIPTOR, *PBL_DEVICE_DESCRIPTOR;
527
528 typedef struct _BL_FILE_PATH_DESCRIPTOR
529 {
530 ULONG Version;
531 ULONG Length;
532 ULONG PathType;
533 UCHAR Path[ANYSIZE_ARRAY];
534 } BL_FILE_PATH_DESCRIPTOR, *PBL_FILE_PATH_DESCRIPTOR;
535
536 typedef struct _BL_WINDOWS_LOAD_OPTIONS
537 {
538 CHAR Signature[8];
539 ULONG Version;
540 ULONG Length;
541 ULONG OsPathOffset;
542 WCHAR LoadOptions[ANYSIZE_ARRAY];
543 } BL_WINDOWS_LOAD_OPTIONS, *PBL_WINDOWS_LOAD_OPTIONS;
544
545 typedef struct _BL_ARCH_CONTEXT
546 {
547 BL_ARCH_MODE Mode;
548 BL_TRANSLATION_TYPE TranslationType;
549 ULONG ContextFlags;
550 } BL_ARCH_CONTEXT, *PBL_ARCH_CONTEXT;
551
552 typedef struct _BL_MEMORY_DESCRIPTOR_LIST
553 {
554 LIST_ENTRY ListHead;
555 PLIST_ENTRY First;
556 PLIST_ENTRY This;
557 ULONG Type;
558 } BL_MEMORY_DESCRIPTOR_LIST, *PBL_MEMORY_DESCRIPTOR_LIST;
559
560 typedef struct _BL_ADDRESS_RANGE
561 {
562 ULONGLONG Minimum;
563 ULONGLONG Maximum;
564 } BL_ADDRESS_RANGE, *PBL_ADDRESS_RANGE;
565
566 typedef struct _BL_FILE_ENTRY
567 {
568 ULONG DeviceIndex;
569 PBL_FILE_DESTROY_CALLBACK DestroyCallback;
570 } BL_FILE_ENTRY, *PBL_FILE_ENTRY;
571
572 typedef struct _BL_DEVICE_ENTRY
573 {
574 ULONG ReferenceCount;
575 } BL_DEVICE_ENTRY, *PBL_DEVICE_ENTRY;
576
577 typedef struct _BL_FILE_SYSTEM_ENTRY
578 {
579 LIST_ENTRY ListEntry;
580 PBL_FS_INIT_CALLBACK InitCallback;
581 PBL_FS_DESTROY_CALLBACK DestroyCallback;
582 PBL_FS_MOUNT_CALLBACK MountCallback;
583 PBL_FS_PURGE_CALLBACK PurgeCallback;
584 } BL_FILE_SYSTEM_ENTRY, *PBL_FILE_SYSTEM_ENTRY;
585
586 typedef struct _BL_FILE_SYSTEM_REGISTRATION_TABLE
587 {
588 PBL_FS_INIT_CALLBACK Init;
589 PBL_FS_DESTROY_CALLBACK Destroy;
590 PBL_FS_MOUNT_CALLBACK Mount;
591 PBL_FS_PURGE_CALLBACK Purge;
592 } BL_FILE_SYSTEM_REGISTRATION_TABLE;
593
594 typedef struct _BL_DISPLAY_STATE
595 {
596 ULONG BgColor;
597 ULONG FgColor;
598 ULONG XPos;
599 ULONG YPos;
600 ULONG CursorVisible;
601 } BL_DISPLAY_STATE, *PBL_DISPLAY_STATE;
602
603 typedef struct _BL_DISPLAY_MODE
604 {
605 ULONG HRes;
606 ULONG VRes;
607 ULONG HRes2;
608 } BL_DISPLAY_MODE, *PBL_DISPLAY_MODE;
609
610 typedef struct _BL_TEXT_CONSOLE_VTABLE
611 {
612 PCONSOLE_DESTRUCT Destruct;
613 PCONSOLE_REINITIALIZE Reinitialize;
614 PCONSOLE_GET_TEXT_STATE GetTextState;
615 PCONSOLE_SET_TEXT_STATE SetTextState;
616 PCONSOLE_GET_TEXT_RESOLUTION GetTextResolution;
617 PCONSOLE_SET_TEXT_RESOLUTION SetTextResolution;
618 PCONSOLE_CLEAR_TEXT ClearText;
619 PCONSOLE_WRITE_TEXT WriteText;
620 } BL_TEXT_CONSOLE_VTABLE, *PBL_TEXT_CONSOLE_VTABLE;
621
622 typedef struct _BL_GRAPHICS_CONSOLE_VTABLE
623 {
624 BL_TEXT_CONSOLE_VTABLE Text;
625 /// more for graphics ///
626 } BL_GRAPHICS_CONSOLE_VTABLE, *PBL_GRAPHICS_CONSOLE_VTABLE;
627
628 typedef struct _BL_TEXT_CONSOLE
629 {
630 PBL_TEXT_CONSOLE_VTABLE Callbacks;
631 BL_DISPLAY_STATE State;
632 BL_DISPLAY_MODE DisplayMode;
633 BOOLEAN Active;
634 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL* Protocol;
635 ULONG Mode;
636 EFI_SIMPLE_TEXT_OUTPUT_MODE OldMode;
637 } BL_TEXT_CONSOLE, *PBL_TEXT_CONSOLE;
638
639 typedef enum _BL_GRAPHICS_CONSOLE_TYPE
640 {
641 BlGopConsole,
642 BlUgaConsole
643 } BL_GRAPHICS_CONSOLE_TYPE;
644
645 typedef struct _BL_GRAPHICS_CONSOLE
646 {
647 BL_TEXT_CONSOLE TextConsole;
648 BL_DISPLAY_MODE DisplayMode;
649 ULONG PixelDepth;
650 ULONG FgColor;
651 ULONG BgColor;
652 BL_DISPLAY_MODE OldDisplayMode;
653 ULONG OldPixelDepth;
654 EFI_HANDLE Handle;
655 BL_GRAPHICS_CONSOLE_TYPE Type;
656 EFI_GRAPHICS_OUTPUT_PROTOCOL* Protocol;
657 PVOID FrameBuffer;
658 ULONG FrameBufferSize;
659 ULONG PixelsPerScanLine;
660 ULONG Mode;
661 ULONG OldMode;
662 } BL_GRAPHICS_CONSOLE, *PBL_GRAPHICS_CONSOLE;
663
664 typedef struct _BL_REMOTE_CONSOLE
665 {
666 BL_TEXT_CONSOLE TextConsole;
667 } BL_REMOTE_CONSOLE, *PBL_REMOTE_CONSOLE;
668
669 /* INLINE ROUTINES ***********************************************************/
670
671 FORCEINLINE
672 VOID
673 BlSetupDefaultParameters (
674 _Out_ PBL_LIBRARY_PARAMETERS LibraryParameters
675 )
676 {
677 BL_LIBRARY_PARAMETERS DefaultParameters =
678 {
679 0x20,
680 BlVirtual,
681 1024,
682 2 * 1024 * 1024,
683 0,
684 NULL,
685 0,
686 NULL
687 };
688
689 /* Copy the defaults */
690 RtlCopyMemory(LibraryParameters, &DefaultParameters, sizeof(*LibraryParameters));
691 }
692
693 FORCEINLINE
694 VOID
695 MmMdInitializeListHead (
696 _In_ PBL_MEMORY_DESCRIPTOR_LIST List
697 )
698 {
699 /* Initialize the list */
700 InitializeListHead(&List->ListHead);
701 List->First = &List->ListHead;
702 List->This = NULL;
703 }
704
705 /* INITIALIZATION ROUTINES ***************************************************/
706
707 NTSTATUS
708 BlInitializeLibrary(
709 _In_ PBOOT_APPLICATION_PARAMETER_BLOCK BootAppParameters,
710 _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
711 );
712
713 NTSTATUS
714 BlpArchInitialize (
715 _In_ ULONG Phase
716 );
717
718 NTSTATUS
719 BlpFwInitialize (
720 _In_ ULONG Phase,
721 _In_ PBL_FIRMWARE_DESCRIPTOR FirmwareParameters
722 );
723
724 NTSTATUS
725 BlpMmInitialize (
726 _In_ PBL_MEMORY_DATA MemoryData,
727 _In_ BL_TRANSLATION_TYPE TranslationType,
728 _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
729 );
730
731 NTSTATUS
732 MmBaInitialize (
733 VOID
734 );
735
736 NTSTATUS
737 MmPaInitialize (
738 _In_ PBL_MEMORY_DATA MemoryData,
739 _In_ ULONG MinimumPages
740 );
741
742 NTSTATUS
743 MmArchInitialize (
744 _In_ ULONG Phase,
745 _In_ PBL_MEMORY_DATA MemoryData,
746 _In_ BL_TRANSLATION_TYPE TranslationType,
747 _In_ BL_TRANSLATION_TYPE LibraryTranslationType
748 );
749
750 NTSTATUS
751 MmHaInitialize (
752 _In_ ULONG HeapSize,
753 _In_ ULONG HeapAttributes
754 );
755
756 VOID
757 MmMdInitialize (
758 _In_ ULONG Phase,
759 _In_ PBL_LIBRARY_PARAMETERS LibraryParameters
760 );
761
762 NTSTATUS
763 BlpDeviceInitialize (
764 VOID
765 );
766
767 NTSTATUS
768 BlpIoInitialize (
769 VOID
770 );
771
772 NTSTATUS
773 BlpFileInitialize (
774 VOID
775 );
776
777 NTSTATUS
778 FatInitialize (
779 VOID
780 );
781
782 NTSTATUS
783 BlpDisplayInitialize (
784 _In_ ULONG Flags
785 );
786
787 /* FIRMWARE ROUTINES *********************************************************/
788
789 NTSTATUS
790 EfiAllocatePages (
791 _In_ ULONG Type,
792 _In_ ULONG Pages,
793 _Inout_ EFI_PHYSICAL_ADDRESS* Memory
794 );
795
796 NTSTATUS
797 EfiStall (
798 _In_ ULONG StallTime
799 );
800
801 NTSTATUS
802 EfiConOutQueryMode (
803 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface,
804 _In_ ULONG Mode,
805 _In_ UINTN* Columns,
806 _In_ UINTN* Rows
807 );
808
809 NTSTATUS
810 EfiConOutSetMode (
811 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface,
812 _In_ ULONG Mode
813 );
814
815 VOID
816 EfiConOutReadCurrentMode (
817 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface,
818 _Out_ EFI_SIMPLE_TEXT_OUTPUT_MODE* Mode
819 );
820
821 NTSTATUS
822 EfiConOutSetAttribute (
823 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface,
824 _In_ ULONG Attribute
825 );
826
827 NTSTATUS
828 EfiConOutSetCursorPosition (
829 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface,
830 _In_ ULONG Column,
831 _In_ ULONG Row
832 );
833
834 NTSTATUS
835 EfiConOutEnableCursor (
836 _In_ SIMPLE_TEXT_OUTPUT_INTERFACE *TextInterface,
837 _In_ BOOLEAN Visible
838 );
839
840 NTSTATUS
841 EfiLocateHandleBuffer (
842 _In_ EFI_LOCATE_SEARCH_TYPE SearchType,
843 _In_ EFI_GUID *Protocol,
844 _Inout_ PULONG HandleCount,
845 _Inout_ EFI_HANDLE** Buffer
846 );
847
848 NTSTATUS
849 EfiOpenProtocol (
850 _In_ EFI_HANDLE Handle,
851 _In_ EFI_GUID *Protocol,
852 _Out_ PVOID* Interface
853 );
854
855 NTSTATUS
856 EfiCloseProtocol (
857 _In_ EFI_HANDLE Handle,
858 _In_ EFI_GUID *Protocol
859 );
860
861 NTSTATUS
862 EfiGopGetCurrentMode (
863 _In_ EFI_GRAPHICS_OUTPUT_PROTOCOL *GopInterface,
864 _Out_ UINTN* Mode,
865 _Out_ EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Information
866 );
867
868 NTSTATUS
869 EfiGopSetMode (
870 _In_ EFI_GRAPHICS_OUTPUT_PROTOCOL *GopInterface,
871 _In_ ULONG Mode
872 );
873
874 VOID
875 EfiGopGetFrameBuffer (
876 _In_ EFI_GRAPHICS_OUTPUT_PROTOCOL *GopInterface,
877 _Out_ PHYSICAL_ADDRESS* FrameBuffer,
878 _Out_ UINTN *FrameBufferSize
879 );
880
881 /* PLATFORM TIMER ROUTINES ***************************************************/
882
883 NTSTATUS
884 BlpTimeCalibratePerformanceCounter (
885 VOID
886 );
887
888 /* UTILITY ROUTINES **********************************************************/
889
890 EFI_STATUS
891 EfiGetEfiStatusCode(
892 _In_ NTSTATUS Status
893 );
894
895 NTSTATUS
896 EfiGetNtStatusCode (
897 _In_ EFI_STATUS EfiStatus
898 );
899
900 NTSTATUS
901 BlUtlInitialize (
902 VOID
903 );
904
905 /* BCD ROUTINES **************************************************************/
906
907 ULONG
908 BlGetBootOptionSize (
909 _In_ PBL_BCD_OPTION BcdOption
910 );
911
912 /* CONTEXT ROUTINES **********************************************************/
913
914 VOID
915 BlpArchSwitchContext (
916 _In_ BL_ARCH_MODE NewMode
917 );
918
919 /* MEMORY DESCRIPTOR ROUTINES ************************************************/
920
921 VOID
922 MmMdFreeList(
923 _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList
924 );
925
926 PBL_MEMORY_DESCRIPTOR
927 MmMdInitByteGranularDescriptor (
928 _In_ ULONG Flags,
929 _In_ BL_MEMORY_TYPE Type,
930 _In_ ULONGLONG BasePage,
931 _In_ ULONGLONG VirtualPage,
932 _In_ ULONGLONG PageCount
933 );
934
935 VOID
936 MmMdFreeGlobalDescriptors (
937 VOID
938 );
939
940 NTSTATUS
941 MmMdAddDescriptorToList (
942 _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList,
943 _In_ PBL_MEMORY_DESCRIPTOR MemoryDescriptor,
944 _In_ ULONG Flags
945 );
946
947 VOID
948 MmMdRemoveDescriptorFromList (
949 _In_ PBL_MEMORY_DESCRIPTOR_LIST MdList,
950 _In_ PBL_MEMORY_DESCRIPTOR Entry
951 );
952
953 BOOLEAN
954 MmMdFindSatisfyingRegion (
955 _In_ PBL_MEMORY_DESCRIPTOR Descriptor,
956 _Out_ PBL_MEMORY_DESCRIPTOR NewDescriptor,
957 _In_ ULONGLONG Pages,
958 _In_ PBL_ADDRESS_RANGE BaseRange,
959 _In_ PBL_ADDRESS_RANGE VirtualRange,
960 _In_ BOOLEAN TopDown,
961 _In_ BL_MEMORY_TYPE MemoryType,
962 _In_ ULONG Flags,
963 _In_ ULONG Alignment
964 );
965
966 NTSTATUS
967 MmMdRemoveRegionFromMdlEx (
968 __in PBL_MEMORY_DESCRIPTOR_LIST MdList,
969 __in ULONG Flags,
970 __in ULONGLONG BasePage,
971 __in ULONGLONG PageCount,
972 __in PBL_MEMORY_DESCRIPTOR_LIST NewMdList
973 );
974
975 NTSTATUS
976 MmMdFreeDescriptor (
977 _In_ PBL_MEMORY_DESCRIPTOR MemoryDescriptor
978 );
979
980 /* PAGE ALLOCATOR ROUTINES ***************************************************/
981
982 NTSTATUS
983 MmPapAllocatePagesInRange (
984 _Inout_ PULONG PhysicalAddress,
985 _In_ BL_MEMORY_TYPE MemoryType,
986 _In_ ULONGLONG Pages,
987 _In_ ULONG Attributes,
988 _In_ ULONG Alignment,
989 _In_opt_ PBL_ADDRESS_RANGE Range,
990 _In_ ULONG Type
991 );
992
993 NTSTATUS
994 MmFwGetMemoryMap (
995 _Out_ PBL_MEMORY_DESCRIPTOR_LIST MemoryMap,
996 _In_ ULONG Flags
997 );
998
999 /* VIRTUAL MEMORY ROUTINES ***************************************************/
1000
1001 NTSTATUS
1002 BlMmMapPhysicalAddressEx (
1003 _In_ PVOID* VirtualAddress,
1004 _In_ ULONG Attributes,
1005 _In_ ULONGLONG Size,
1006 _In_ PHYSICAL_ADDRESS PhysicalAddress
1007 );
1008
1009 /* HEAP ALLOCATOR ROUTINES ***************************************************/
1010
1011 PVOID
1012 BlMmAllocateHeap (
1013 _In_ ULONG Size
1014 );
1015
1016 NTSTATUS
1017 BlMmFreeHeap (
1018 _In_ PVOID Buffer
1019 );
1020
1021 /* DISPLAY ROUTINES **********************************************************/
1022
1023 VOID
1024 BlDisplayGetTextCellResolution (
1025 _Out_ PULONG TextWidth,
1026 _Out_ PULONG TextHeight
1027 );
1028
1029 /* TExT CONSOLE ROUTINES *****************************************************/
1030
1031 NTSTATUS
1032 ConsoleTextLocalDestruct (
1033 _In_ struct _BL_TEXT_CONSOLE* Console
1034 );
1035
1036 NTSTATUS
1037 ConsoleTextLocalReinitialize (
1038 _In_ struct _BL_TEXT_CONSOLE* Console
1039 );
1040
1041 NTSTATUS
1042 ConsoleTextBaseGetTextState (
1043 _In_ struct _BL_TEXT_CONSOLE* Console,
1044 _Out_ PBL_DISPLAY_STATE TextState
1045 );
1046
1047 NTSTATUS
1048 ConsoleTextLocalSetTextState (
1049 _In_ struct _BL_TEXT_CONSOLE* Console,
1050 _In_ ULONG Flags,
1051 _In_ PBL_DISPLAY_STATE TextState
1052 );
1053
1054 NTSTATUS
1055 ConsoleTextBaseGetTextResolution (
1056 _In_ struct _BL_TEXT_CONSOLE* Console,
1057 _Out_ PULONG TextResolution
1058 );
1059
1060 NTSTATUS
1061 ConsoleTextLocalSetTextResolution (
1062 _In_ struct _BL_TEXT_CONSOLE* Console,
1063 _In_ ULONG NewTextResolution,
1064 _Out_ PULONG OldTextResolution
1065 );
1066
1067 NTSTATUS
1068 ConsoleTextLocalClearText (
1069 _In_ struct _BL_TEXT_CONSOLE* Console,
1070 _In_ ULONG Attribute
1071 );
1072
1073 NTSTATUS
1074 ConsoleTextLocalWriteText (
1075 _In_ struct _BL_TEXT_CONSOLE* Console,
1076 _In_ PCHAR Text,
1077 _In_ ULONG Attribute
1078 );
1079
1080 NTSTATUS
1081 ConsoleTextLocalConstruct (
1082 _In_ PBL_TEXT_CONSOLE TextConsole,
1083 _In_ BOOLEAN Activate
1084 );
1085
1086 BOOLEAN
1087 ConsolepFindResolution (
1088 _In_ PBL_DISPLAY_MODE Mode,
1089 _In_ PBL_DISPLAY_MODE List,
1090 _In_ ULONG MaxIndex
1091 );
1092
1093 VOID
1094 ConsoleFirmwareTextClose (
1095 _In_ PBL_TEXT_CONSOLE TextConsole
1096 );
1097
1098 NTSTATUS
1099 ConsoleFirmwareTextOpen (
1100 _In_ PBL_TEXT_CONSOLE TextConsole
1101 );
1102
1103 NTSTATUS
1104 ConsoleFirmwareTextSetState (
1105 _In_ PBL_TEXT_CONSOLE TextConsole,
1106 _In_ UCHAR Mask,
1107 _In_ PBL_DISPLAY_STATE State
1108 );
1109
1110 NTSTATUS
1111 ConsoleGraphicalConstruct (
1112 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
1113 );
1114
1115 NTSTATUS
1116 ConsoleCreateRemoteConsole (
1117 _In_ PBL_TEXT_CONSOLE* TextConsole
1118 );
1119
1120 NTSTATUS
1121 ConsoleEfiGraphicalOpenProtocol (
1122 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole,
1123 _In_ BL_GRAPHICS_CONSOLE_TYPE Type
1124 );
1125
1126 VOID
1127 ConsoleFirmwareGraphicalClose (
1128 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
1129 );
1130
1131 NTSTATUS
1132 ConsoleFirmwareGraphicalEnable (
1133 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
1134 );
1135
1136 NTSTATUS
1137 ConsoleEfiUgaOpen (
1138 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
1139 );
1140
1141 VOID
1142 ConsoleEfiUgaClose (
1143 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
1144 );
1145
1146 VOID
1147 ConsoleEfiGopClose (
1148 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
1149 );
1150
1151 NTSTATUS
1152 ConsoleEfiGopOpen (
1153 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
1154 );
1155
1156 NTSTATUS
1157 ConsoleEfiGopEnable (
1158 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole
1159 );
1160
1161 NTSTATUS
1162 ConsoleEfiUgaSetResolution (
1163 _In_ PBL_GRAPHICS_CONSOLE GraphicsConsole,
1164 _In_ PBL_DISPLAY_MODE DisplayMode,
1165 _In_ ULONG DisplayModeCount
1166 );
1167
1168 extern ULONG MmDescriptorCallTreeCount;
1169 extern ULONG BlpApplicationFlags;
1170 extern BL_LIBRARY_PARAMETERS BlpLibraryParameters;
1171 extern BL_TRANSLATION_TYPE MmTranslationType;
1172 extern PBL_ARCH_CONTEXT CurrentExecutionContext;
1173 extern PBL_DEVICE_DESCRIPTOR BlpBootDevice;
1174 extern BL_APPLICATION_ENTRY BlpApplicationEntry;
1175 extern SIMPLE_TEXT_OUTPUT_INTERFACE *EfiConOut;
1176 extern EFI_GUID EfiGraphicsOutputProtocol;
1177 extern EFI_GUID EfiUgaDrawProtocol;
1178 extern EFI_GUID EfiLoadedImageProtocol;
1179 extern EFI_GUID EfiDevicePathProtocol;
1180 extern EFI_GUID EfiSimpleTextInputExProtocol;
1181 extern ULONG ConsoleGraphicalResolutionListFlags;
1182 extern BL_DISPLAY_MODE ConsoleGraphicalResolutionList[];
1183 extern BL_DISPLAY_MODE ConsoleTextResolutionList[];
1184 extern ULONG ConsoleGraphicalResolutionListSize;
1185 extern PVOID DspRemoteInputConsole;
1186 #endif