2 EBL commands for EFI and PI Devices
4 Copyright (c) 2007, Intel Corporation. All rights reserved.<BR>
5 Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
7 This program and the accompanying materials
8 are licensed and made available under the terms and conditions of the BSD License
9 which accompanies this distribution. The full text of the license may be found at
10 http://opensource.org/licenses/bsd-license.php
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
20 EFI_DXE_SERVICES
*gDS
= NULL
;
24 Print information about the File System device.
26 @param File Open File for the device
31 IN EFI_OPEN_FILE
*File
40 AsciiPrint (" %a: ", File
->DeviceName
);
41 if (File
->FsInfo
!= NULL
) {
42 for (Str
= File
->FsInfo
->VolumeLabel
; *Str
!= '\0'; Str
++) {
44 // UI makes you enter _ for space, so make the printout match that
47 AsciiPrint ("%c", *Str
);
50 if (File
->FsInfo
->ReadOnly
) {
51 AsciiPrint ("ReadOnly");
61 Print information about the FV devices.
63 @param File Open File for the device
68 IN EFI_OPEN_FILE
*File
75 AsciiPrint (" %a: 0x%08lx - 0x%08lx : 0x%08x\n", File
->DeviceName
, File
->FvStart
, File
->FvStart
+ File
->FvSize
- 1, File
->FvSize
);
81 Print information about the Blk IO devices.
82 If the device supports PXE dump out extra information
84 @param File Open File for the device
89 IN EFI_OPEN_FILE
*File
95 EFI_OPEN_FILE
*FsFile
;
101 AsciiPrint (" %a: ", File
->DeviceName
);
103 // print out name of file system, if any, on this block device
104 Max
= EfiGetDeviceCounts (EfiOpenFileSystem
);
106 for (Index
= 0; Index
< Max
; Index
++) {
107 FsFile
= EfiDeviceOpenByType (EfiOpenFileSystem
, Index
);
108 if (FsFile
!= NULL
) {
109 if (FsFile
->EfiHandle
== File
->EfiHandle
) {
110 AsciiPrint ("fs%d: ", Index
);
119 // Print out useful Block IO media properties
120 if (File
->FsBlockIoMedia
->RemovableMedia
) {
121 AsciiPrint ("Removable ");
123 if (!File
->FsBlockIoMedia
->MediaPresent
) {
124 AsciiPrint ("No Media\n");
126 if (File
->FsBlockIoMedia
->LogicalPartition
) {
127 AsciiPrint ("Partition ");
129 DeviceSize
= MultU64x32 (File
->FsBlockIoMedia
->LastBlock
+ 1, File
->FsBlockIoMedia
->BlockSize
);
130 AsciiPrint ("Size = 0x%lX\n", DeviceSize
);
136 Print information about the Load File devices.
137 If the device supports PXE dump out extra information
139 @param File Open File for the device
143 EblPrintLoadFileInfo (
144 IN EFI_OPEN_FILE
*File
147 EFI_DEVICE_PATH_PROTOCOL
*DevicePathNode
;
148 MAC_ADDR_DEVICE_PATH
*MacAddr
;
156 AsciiPrint (" %a: %a ", File
->DeviceName
, EblLoadFileBootTypeString (File
->EfiHandle
));
158 if (File
->DevicePath
!= NULL
) {
159 // Try to print out the MAC address
160 for (DevicePathNode
= File
->DevicePath
;
161 !IsDevicePathEnd (DevicePathNode
);
162 DevicePathNode
= NextDevicePathNode (DevicePathNode
)) {
164 if ((DevicePathType (DevicePathNode
) == MESSAGING_DEVICE_PATH
) && (DevicePathSubType (DevicePathNode
) == MSG_MAC_ADDR_DP
)) {
165 MacAddr
= (MAC_ADDR_DEVICE_PATH
*)DevicePathNode
;
167 HwAddressSize
= sizeof (EFI_MAC_ADDRESS
);
168 if (MacAddr
->IfType
== 0x01 || MacAddr
->IfType
== 0x00) {
173 for (Index
= 0; Index
< HwAddressSize
; Index
++) {
174 AsciiPrint ("%02x", MacAddr
->MacAddress
.Addr
[Index
] & 0xff);
188 Dump information about devices in the system.
190 fv: PI Firmware Volume
191 fs: EFI Simple File System
193 LoadFile: EFI Load File Protocol (commonly PXE network boot)
197 @param Argc Number of command arguments in Argv
198 @param Argv Array of strings that represent the parsed command line.
199 Argv[0] is the comamnd name
217 // Need to call here to make sure Device Counts are valid
218 EblUpdateDeviceLists ();
221 // Probe for media insertion/removal in removable media devices
223 Max
= EfiGetDeviceCounts (EfiOpenBlockIo
);
225 for (Index
= 0; Index
< Max
; Index
++) {
226 File
= EfiDeviceOpenByType (EfiOpenBlockIo
, Index
);
228 if (File
->FsBlockIoMedia
->RemovableMedia
) {
229 // Probe to see if media is present (or not) or media changed
230 // this causes the ReinstallProtocolInterface() to fire in the
231 // block io driver to update the system about media change events
232 File
->FsBlockIo
->ReadBlocks (File
->FsBlockIo
, File
->FsBlockIo
->Media
->MediaId
, (EFI_LBA
)0, 0, NULL
);
239 // Now we can print out the info...
241 Max
= EfiGetDeviceCounts (EfiOpenFirmwareVolume
);
243 AsciiPrint ("Firmware Volume Devices:\n");
244 for (Index
= 0; Index
< Max
; Index
++) {
245 EblPrintFvbInfo (EfiDeviceOpenByType (EfiOpenFirmwareVolume
, Index
));
246 if (EblAnyKeyToContinueQtoQuit (&CurrentRow
, TRUE
)) {
252 Max
= EfiGetDeviceCounts (EfiOpenFileSystem
);
254 AsciiPrint ("File System Devices:\n");
255 for (Index
= 0; Index
< Max
; Index
++) {
256 EblPrintFsInfo (EfiDeviceOpenByType (EfiOpenFileSystem
, Index
));
257 if (EblAnyKeyToContinueQtoQuit (&CurrentRow
, TRUE
)) {
263 Max
= EfiGetDeviceCounts (EfiOpenBlockIo
);
265 AsciiPrint ("Block IO Devices:\n");
266 for (Index
= 0; Index
< Max
; Index
++) {
267 EblPrintBlkIoInfo (EfiDeviceOpenByType (EfiOpenBlockIo
, Index
));
268 if (EblAnyKeyToContinueQtoQuit (&CurrentRow
, TRUE
)) {
274 Max
= EfiGetDeviceCounts (EfiOpenLoadFile
);
276 AsciiPrint ("LoadFile Devices: (usually network)\n");
277 for (Index
= 0; Index
< Max
; Index
++) {
278 EblPrintLoadFileInfo (EfiDeviceOpenByType (EfiOpenLoadFile
, Index
));
279 if (EblAnyKeyToContinueQtoQuit (&CurrentRow
, TRUE
)) {
290 Start an EFI image (PE32+ with EFI defined entry point).
293 Argv[1] - device name and path
294 Argv[2] - "" string to pass into image being started
296 start fs1:\Temp\Fv.Fv "arg to pass" ; load an FV from the disk and pass the
297 ; ascii string arg to pass to the image
298 start fv0:\FV ; load an FV from an FV (not common)
299 start LoadFile0: ; load an FV via a PXE boot
301 @param Argc Number of command arguments in Argv
302 @param Argv Array of strings that represent the parsed command line.
303 Argv[0] is the comamnd name
316 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
317 EFI_HANDLE ImageHandle
;
322 EFI_LOADED_IMAGE_PROTOCOL
*ImageInfo
;
327 return EFI_INVALID_PARAMETER
;
330 File
= EfiOpen (Argv
[1], EFI_FILE_MODE_READ
, 0);
332 return EFI_INVALID_PARAMETER
;
335 DevicePath
= File
->DevicePath
;
336 if (DevicePath
!= NULL
) {
337 // check for device path form: blk, fv, fs, and loadfile
338 Status
= gBS
->LoadImage (FALSE
, gImageHandle
, DevicePath
, NULL
, 0, &ImageHandle
);
340 // Check for buffer form: A0x12345678:0x1234 syntax.
341 // Means load using buffer starting at 0x12345678 of size 0x1234.
343 Status
= EfiReadAllocatePool (File
, &Buffer
, &BufferSize
);
344 if (EFI_ERROR (Status
)) {
348 Status
= gBS
->LoadImage (FALSE
, gImageHandle
, DevicePath
, Buffer
, BufferSize
, &ImageHandle
);
355 if (!EFI_ERROR (Status
)) {
357 // Argv[2] is a "" string that we pass directly to the EFI application without the ""
358 // We don't pass Argv[0] to the EFI Application (it's name) just the args
359 Status
= gBS
->HandleProtocol (ImageHandle
, &gEfiLoadedImageProtocolGuid
, (VOID
**)&ImageInfo
);
360 ASSERT_EFI_ERROR (Status
);
362 ImageInfo
->LoadOptionsSize
= (UINT32
)AsciiStrSize (Argv
[2]);
363 ImageInfo
->LoadOptions
= AllocatePool (ImageInfo
->LoadOptionsSize
);
364 AsciiStrCpy (ImageInfo
->LoadOptions
, Argv
[2]);
367 // Transfer control to the EFI image we loaded with LoadImage()
368 Status
= gBS
->StartImage (ImageHandle
, &ExitDataSize
, &ExitData
);
376 Load a Firmware Volume (FV) into memory from a device. This causes drivers in
377 the FV to be dispatched if the dependancies of the drivers are met.
380 Argv[1] - device name and path
382 loadfv fs1:\Temp\Fv.Fv ; load an FV from the disk
383 loadfv fv0:\FV ; load an FV from an FV (not common)
384 loadfv LoadFile0: ; load an FV via a PXE boot
386 @param Argc Number of command arguments in Argv
387 @param Argv Array of strings that represent the parsed command line.
388 Argv[0] is the comamnd name
407 return EFI_INVALID_PARAMETER
;
410 File
= EfiOpen (Argv
[1], EFI_FILE_MODE_READ
, 0);
412 return EFI_INVALID_PARAMETER
;
415 if (File
->Type
== EfiOpenMemoryBuffer
) {
416 // If it is a address just use it.
417 Status
= gDS
->ProcessFirmwareVolume (File
->Buffer
, File
->Size
, &FvHandle
);
419 // If it is a file read it into memory and use it
420 Status
= EfiReadAllocatePool (File
, &FvStart
, &FvSize
);
422 if (EFI_ERROR (Status
)) {
426 Status
= gDS
->ProcessFirmwareVolume (FvStart
, FvSize
, &FvHandle
);
434 Perform an EFI connect to connect devices that follow the EFI driver model.
435 If it is a PI system also call the dispatcher in case a new FV was made
436 availible by one of the connect EFI drivers (this is not a common case).
440 @param Argc Number of command arguments in Argv
441 @param Argv Array of strings that represent the parsed command line.
442 Argv[0] is the comamnd name
455 EFI_HANDLE
*HandleBuffer
;
462 if ((*Argv
[1] == 'd') || (*Argv
[1] == 'D')) {
463 Status
= gBS
->LocateHandleBuffer (
470 if (EFI_ERROR (Status
)) {
474 for (Index
= 0; Index
< HandleCount
; Index
++) {
475 gBS
->DisconnectController (HandleBuffer
[Index
], NULL
, NULL
);
479 // Given we disconnect our console we should go and do a connect now
482 File
= EfiOpen (Argv
[1], EFI_FILE_MODE_READ
, 0);
484 AsciiPrint ("Connecting %a\n", Argv
[1]);
485 gBS
->ConnectController (File
->EfiHandle
, NULL
, NULL
, TRUE
);
494 Status
= gBS
->LocateHandleBuffer (
501 if (EFI_ERROR (Status
)) {
505 for (Index
= 0; Index
< HandleCount
; Index
++) {
506 gBS
->ConnectController (HandleBuffer
[Index
], NULL
, NULL
, TRUE
);
509 FreePool (HandleBuffer
);
512 // Check to see if it's possible to dispatch an more DXE drivers.
513 // The BdsLibConnectAllEfi () may have made new DXE drivers show up.
514 // If anything is Dispatched Status == EFI_SUCCESS and we will try
515 // the connect again.
518 Status
= EFI_NOT_FOUND
;
520 Status
= gDS
->Dispatch ();
521 if (!EFI_ERROR (Status
)) {
526 } while (!EFI_ERROR (Status
));
529 AsciiPrint ("Connected and dispatched\n");
531 AsciiPrint ("Connect\n");
539 CHAR8
*gMemMapType
[] = {
558 Dump out the EFI memory map
562 @param Argc Number of command arguments in Argv
563 @param Argv Array of strings that represent the parsed command line.
564 Argv[0] is the comamnd name
576 EFI_MEMORY_DESCRIPTOR
*MemMap
;
577 EFI_MEMORY_DESCRIPTOR
*OrigMemMap
;
580 UINTN DescriptorSize
;
581 UINT32 DescriptorVersion
;
582 UINT64 PageCount
[EfiMaxMemoryType
];
588 ZeroMem (PageCount
, sizeof (PageCount
));
590 AsciiPrint ("EFI Memory Map\n");
592 // First call is to figure out how big the buffer needs to be
595 Status
= gBS
->GetMemoryMap (&MemMapSize
, MemMap
, &MapKey
, &DescriptorSize
, &DescriptorVersion
);
596 if (Status
== EFI_BUFFER_TOO_SMALL
) {
597 // In case the AllocatPool changes the memory map we added in some extra descriptors
598 MemMapSize
+= (DescriptorSize
* 0x100);
599 OrigMemMap
= MemMap
= AllocatePool (MemMapSize
);
600 if (OrigMemMap
!= NULL
) {
601 // 2nd time we get the data
602 Status
= gBS
->GetMemoryMap (&MemMapSize
, MemMap
, &MapKey
, &DescriptorSize
, &DescriptorVersion
);
603 if (!EFI_ERROR (Status
)) {
604 for (Index
= 0, CurrentRow
= 0; Index
< MemMapSize
/DescriptorSize
; Index
++) {
605 EntrySize
= LShiftU64 (MemMap
->NumberOfPages
, 12);
606 AsciiPrint ("\n%a %016lx - %016lx: # %08lx %016lx", gMemMapType
[MemMap
->Type
% EfiMaxMemoryType
], MemMap
->PhysicalStart
, MemMap
->PhysicalStart
+ EntrySize
-1, MemMap
->NumberOfPages
, MemMap
->Attribute
);
607 if (EblAnyKeyToContinueQtoQuit (&CurrentRow
, TRUE
)) {
611 PageCount
[MemMap
->Type
% EfiMaxMemoryType
] += MemMap
->NumberOfPages
;
612 MemMap
= NEXT_MEMORY_DESCRIPTOR (MemMap
, DescriptorSize
);
616 for (Index
= 0, TotalMemory
= 0; Index
< EfiMaxMemoryType
; Index
++) {
617 if (PageCount
[Index
] != 0) {
618 AsciiPrint ("\n %a %,7ld Pages (%,14ld)", gMemMapType
[Index
], PageCount
[Index
], LShiftU64 (PageCount
[Index
], 12));
619 if (Index
== EfiLoaderCode
||
620 Index
== EfiLoaderData
||
621 Index
== EfiBootServicesCode
||
622 Index
== EfiBootServicesData
||
623 Index
== EfiRuntimeServicesCode
||
624 Index
== EfiRuntimeServicesData
||
625 Index
== EfiConventionalMemory
||
626 Index
== EfiACPIReclaimMemory
||
627 Index
== EfiACPIMemoryNVS
||
630 // Count total memory
631 TotalMemory
+= PageCount
[Index
];
636 AsciiPrint ("\nTotal Memory: %,ld MB (%,ld bytes)\n", RShiftU64 (TotalMemory
, 8), LShiftU64 (TotalMemory
, 12));
638 FreePool (OrigMemMap
);
650 Load a file into memory and optionally jump to it. A load addres can be
651 specified or automatically allocated. A quoted command line can optionally
652 be passed into the image.
655 Argv[1] - Device Name:path for the file to load
656 Argv[2] - Address to load to or '*' if the load address will be allocated
657 Argv[3] - Optional Entry point to the image. Image will be called if present
658 Argv[4] - "" string that will be passed as Argc & Argv to EntryPoint. Needs
659 to include the command name
661 go fv1:\EblCmdX 0x10000 0x10010 "EblCmdX Arg2 Arg3 Arg4"; - load EblCmdX
662 from FV1 to location 0x10000 and call the entry point at 0x10010 passing
663 in "EblCmdX Arg2 Arg3 Arg4" as the arguments.
665 go fv0:\EblCmdX * 0x10 "EblCmdX Arg2 Arg3 Arg4"; - load EblCmdX from FS0
666 to location allocated by this comamnd and call the entry point at offset 0x10
667 passing in "EblCmdX Arg2 Arg3 Arg4" as the arguments.
669 go fv1:\EblCmdX 0x10000; Load EblCmdX to address 0x10000 and return
671 @param Argc Number of command arguments in Argv
672 @param Argv Array of strings that represent the parsed command line.
673 Argv[0] is the comamnd name
688 EBL_COMMMAND EntryPoint
;
689 UINTN EntryPointArgc
;
690 CHAR8
*EntryPointArgv
[MAX_ARGS
];
694 // device name and laod address are required
698 File
= EfiOpen (Argv
[1], EFI_FILE_MODE_READ
, 0);
700 AsciiPrint (" %a is not a valid path\n", Argv
[1]);
704 EntryPoint
= (EBL_COMMMAND
)((Argc
> 3) ? (UINTN
)AsciiStrHexToUintn (Argv
[3]) : (UINTN
)NULL
);
705 if (Argv
[2][0] == '*') {
706 // * Means allocate the buffer
707 Status
= EfiReadAllocatePool (File
, &Address
, &Size
);
709 // EntryPoint is relatvie to the start of the image
710 EntryPoint
= (EBL_COMMMAND
)((UINTN
)EntryPoint
+ (UINTN
)Address
);
713 Address
= (VOID
*)AsciiStrHexToUintn (Argv
[2]);
716 // File->Size for LoadFile is lazy so we need to use the tell to figure it out
717 EfiTell (File
, NULL
);
718 Status
= EfiRead (File
, Address
, &Size
);
721 if (!EFI_ERROR (Status
)) {
722 AsciiPrint ("Loaded %,d bytes to 0x%08x\n", Size
, Address
);
726 ParseArguments (Argv
[4], &EntryPointArgc
, EntryPointArgv
);
729 EntryPointArgv
[0] = File
->FileName
;
732 Status
= EntryPoint (EntryPointArgc
, EntryPointArgv
);
740 #define FILE_COPY_CHUNK 0x20000
748 EFI_OPEN_FILE
*Source
= NULL
;
749 EFI_OPEN_FILE
*Destination
= NULL
;
750 EFI_STATUS Status
= EFI_SUCCESS
;
754 UINTN Chunk
= FILE_COPY_CHUNK
;
757 return EFI_INVALID_PARAMETER
;
760 Source
= EfiOpen(Argv
[1], EFI_FILE_MODE_READ
, 0);
761 if (Source
== NULL
) {
762 AsciiPrint("Source file open error.\n");
763 return EFI_NOT_FOUND
;
766 Destination
= EfiOpen(Argv
[2], EFI_FILE_MODE_READ
| EFI_FILE_MODE_WRITE
| EFI_FILE_MODE_CREATE
, 0);
767 if (Destination
== NULL
) {
768 AsciiPrint("Destination file open error.\n");
769 return EFI_NOT_FOUND
;
772 Buffer
= AllocatePool(FILE_COPY_CHUNK
);
773 if (Buffer
== NULL
) {
777 Size
= EfiTell(Source
, NULL
);
779 for (Offset
= 0; Offset
+ FILE_COPY_CHUNK
<= Size
; Offset
+= Chunk
) {
780 Chunk
= FILE_COPY_CHUNK
;
782 Status
= EfiRead(Source
, Buffer
, &Chunk
);
783 if (EFI_ERROR(Status
)) {
784 AsciiPrint("Read file error %r\n", Status
);
788 Status
= EfiWrite(Destination
, Buffer
, &Chunk
);
789 if (EFI_ERROR(Status
)) {
790 AsciiPrint("Write file error %r\n", Status
);
797 Chunk
= Size
- Offset
;
799 Status
= EfiRead(Source
, Buffer
, &Chunk
);
800 if (EFI_ERROR(Status
)) {
801 AsciiPrint("Read file error %r\n", Status
);
805 Status
= EfiWrite(Destination
, Buffer
, &Chunk
);
806 if (EFI_ERROR(Status
)) {
807 AsciiPrint("Write file error %r\n", Status
);
814 if (Source
!= NULL
) {
815 Status
= EfiClose(Source
);
816 if (EFI_ERROR(Status
)) {
817 AsciiPrint("Source close error %r\n", Status
);
820 if (Destination
!= NULL
) {
821 Status
= EfiClose(Destination
);
822 if (EFI_ERROR(Status
)) {
823 AsciiPrint("Destination close error %r\n", Status
);
827 if (Buffer
!= NULL
) {
840 EFI_OPEN_FILE
*File1
= NULL
;
841 EFI_OPEN_FILE
*File2
= NULL
;
842 EFI_STATUS Status
= EFI_SUCCESS
;
843 VOID
*Buffer1
= NULL
;
844 VOID
*Buffer2
= NULL
;
848 UINTN Chunk
= FILE_COPY_CHUNK
;
851 return EFI_INVALID_PARAMETER
;
854 File1
= EfiOpen(Argv
[1], EFI_FILE_MODE_READ
, 0);
856 AsciiPrint("File 1 open error.\n");
857 return EFI_NOT_FOUND
;
860 File2
= EfiOpen(Argv
[2], EFI_FILE_MODE_READ
, 0);
862 AsciiPrint("File 2 open error.\n");
863 return EFI_NOT_FOUND
;
866 Size1
= EfiTell(File1
, NULL
);
867 Size2
= EfiTell(File2
, NULL
);
869 if (Size1
!= Size2
) {
870 AsciiPrint("Files differ.\n");
874 Buffer1
= AllocatePool(FILE_COPY_CHUNK
);
875 if (Buffer1
== NULL
) {
879 Buffer2
= AllocatePool(FILE_COPY_CHUNK
);
880 if (Buffer2
== NULL
) {
884 for (Offset
= 0; Offset
+ FILE_COPY_CHUNK
<= Size1
; Offset
+= Chunk
) {
885 Chunk
= FILE_COPY_CHUNK
;
887 Status
= EfiRead(File1
, Buffer1
, &Chunk
);
888 if (EFI_ERROR(Status
)) {
889 AsciiPrint("File 1 read error\n");
893 Status
= EfiRead(File2
, Buffer2
, &Chunk
);
894 if (EFI_ERROR(Status
)) {
895 AsciiPrint("File 2 read error\n");
899 if (CompareMem(Buffer1
, Buffer2
, Chunk
) != 0) {
900 AsciiPrint("Files differ.\n");
906 if (Offset
< Size1
) {
907 Chunk
= Size1
- Offset
;
909 Status
= EfiRead(File1
, Buffer1
, &Chunk
);
910 if (EFI_ERROR(Status
)) {
911 AsciiPrint("File 1 read error\n");
915 Status
= EfiRead(File2
, Buffer2
, &Chunk
);
916 if (EFI_ERROR(Status
)) {
917 AsciiPrint("File 2 read error\n");
922 if (CompareMem(Buffer1
, Buffer2
, Chunk
) != 0) {
923 AsciiPrint("Files differ.\n");
925 AsciiPrint("Files are identical.\n");
930 Status
= EfiClose(File1
);
931 if (EFI_ERROR(Status
)) {
932 AsciiPrint("File 1 close error %r\n", Status
);
937 Status
= EfiClose(File2
);
938 if (EFI_ERROR(Status
)) {
939 AsciiPrint("File 2 close error %r\n", Status
);
943 if (Buffer1
!= NULL
) {
947 if (Buffer2
!= NULL
) {
954 GLOBAL_REMOVE_IF_UNREFERENCED
const EBL_COMMAND_TABLE mCmdDeviceTemplate
[] =
958 "[d]; Connect all EFI devices. d means disconnect",
964 "; Show information about boot devices",
970 " dev:path loadaddress entrypoint args; load to given address and jump in",
976 " devname; Load PI FV from device",
982 " path; EFI Boot Device:filepath. fs1:\\EFI\\BOOT.EFI",
988 "; dump EFI memory map",
994 " file1 file2; copy file",
1000 " file1 file2; compare files",
1008 Initialize the commands in this in this file
1012 EblInitializeDeviceCmd (
1016 EfiGetSystemConfigurationTable (&gEfiDxeServicesTableGuid
, (VOID
**) &gDS
);
1017 EblAddCommands (mCmdDeviceTemplate
, sizeof (mCmdDeviceTemplate
)/sizeof (EBL_COMMAND_TABLE
));