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
218 // Need to call here to make sure Device Counts are valid
219 EblUpdateDeviceLists ();
222 // Probe for media insertion/removal in removable media devices
224 Max
= EfiGetDeviceCounts (EfiOpenBlockIo
);
226 for (Index
= 0; Index
< Max
; Index
++) {
227 File
= EfiDeviceOpenByType (EfiOpenBlockIo
, Index
);
229 if (File
->FsBlockIoMedia
->RemovableMedia
) {
230 // Probe to see if media is present (or not) or media changed
231 // this causes the ReinstallProtocolInterface() to fire in the
232 // block io driver to update the system about media change events
233 File
->FsBlockIo
->ReadBlocks (File
->FsBlockIo
, File
->FsBlockIo
->Media
->MediaId
, (EFI_LBA
)0, 0, NULL
);
240 // Now we can print out the info...
242 Max
= EfiGetDeviceCounts (EfiOpenFirmwareVolume
);
244 AsciiPrint ("Firmware Volume Devices:\n");
245 for (Index
= 0; Index
< Max
; Index
++) {
246 EblPrintFvbInfo (EfiDeviceOpenByType (EfiOpenFirmwareVolume
, Index
));
247 if (EblAnyKeyToContinueQtoQuit (&CurrentRow
, TRUE
)) {
253 Max
= EfiGetDeviceCounts (EfiOpenFileSystem
);
255 AsciiPrint ("File System Devices:\n");
256 for (Index
= 0; Index
< Max
; Index
++) {
257 EblPrintFsInfo (EfiDeviceOpenByType (EfiOpenFileSystem
, Index
));
258 if (EblAnyKeyToContinueQtoQuit (&CurrentRow
, TRUE
)) {
264 Max
= EfiGetDeviceCounts (EfiOpenBlockIo
);
266 AsciiPrint ("Block IO Devices:\n");
267 for (Index
= 0; Index
< Max
; Index
++) {
268 EblPrintBlkIoInfo (EfiDeviceOpenByType (EfiOpenBlockIo
, Index
));
269 if (EblAnyKeyToContinueQtoQuit (&CurrentRow
, TRUE
)) {
275 Max
= EfiGetDeviceCounts (EfiOpenLoadFile
);
277 AsciiPrint ("LoadFile Devices: (usually network)\n");
278 for (Index
= 0; Index
< Max
; Index
++) {
279 EblPrintLoadFileInfo (EfiDeviceOpenByType (EfiOpenLoadFile
, Index
));
280 if (EblAnyKeyToContinueQtoQuit (&CurrentRow
, TRUE
)) {
291 Start an EFI image (PE32+ with EFI defined entry point).
294 Argv[1] - device name and path
295 Argv[2] - "" string to pass into image being started
297 start fs1:\Temp\Fv.Fv "arg to pass" ; load an FV from the disk and pass the
298 ; ascii string arg to pass to the image
299 start fv0:\FV ; load an FV from an FV (not common)
300 start LoadFile0: ; load an FV via a PXE boot
302 @param Argc Number of command arguments in Argv
303 @param Argv Array of strings that represent the parsed command line.
304 Argv[0] is the comamnd name
317 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
318 EFI_HANDLE ImageHandle
;
323 EFI_LOADED_IMAGE_PROTOCOL
*ImageInfo
;
328 return EFI_INVALID_PARAMETER
;
331 File
= EfiOpen (Argv
[1], EFI_FILE_MODE_READ
, 0);
333 return EFI_INVALID_PARAMETER
;
336 DevicePath
= File
->DevicePath
;
337 if (DevicePath
!= NULL
) {
338 // check for device path form: blk, fv, fs, and loadfile
339 Status
= gBS
->LoadImage (FALSE
, gImageHandle
, DevicePath
, NULL
, 0, &ImageHandle
);
341 // Check for buffer form: A0x12345678:0x1234 syntax.
342 // Means load using buffer starting at 0x12345678 of size 0x1234.
344 Status
= EfiReadAllocatePool (File
, &Buffer
, &BufferSize
);
345 if (EFI_ERROR (Status
)) {
349 Status
= gBS
->LoadImage (FALSE
, gImageHandle
, DevicePath
, Buffer
, BufferSize
, &ImageHandle
);
356 if (!EFI_ERROR (Status
)) {
358 // Argv[2] is a "" string that we pass directly to the EFI application without the ""
359 // We don't pass Argv[0] to the EFI Application (it's name) just the args
360 Status
= gBS
->HandleProtocol (ImageHandle
, &gEfiLoadedImageProtocolGuid
, (VOID
**)&ImageInfo
);
361 ASSERT_EFI_ERROR (Status
);
363 ImageInfo
->LoadOptionsSize
= (UINT32
)AsciiStrSize (Argv
[2]);
364 ImageInfo
->LoadOptions
= AllocatePool (ImageInfo
->LoadOptionsSize
);
365 AsciiStrCpy (ImageInfo
->LoadOptions
, Argv
[2]);
368 // Transfer control to the EFI image we loaded with LoadImage()
369 Status
= gBS
->StartImage (ImageHandle
, &ExitDataSize
, &ExitData
);
377 Load a Firmware Volume (FV) into memory from a device. This causes drivers in
378 the FV to be dispatched if the dependancies of the drivers are met.
381 Argv[1] - device name and path
383 loadfv fs1:\Temp\Fv.Fv ; load an FV from the disk
384 loadfv fv0:\FV ; load an FV from an FV (not common)
385 loadfv LoadFile0: ; load an FV via a PXE boot
387 @param Argc Number of command arguments in Argv
388 @param Argv Array of strings that represent the parsed command line.
389 Argv[0] is the comamnd name
408 return EFI_INVALID_PARAMETER
;
411 File
= EfiOpen (Argv
[1], EFI_FILE_MODE_READ
, 0);
413 return EFI_INVALID_PARAMETER
;
416 if (File
->Type
== EfiOpenMemoryBuffer
) {
417 // If it is a address just use it.
418 Status
= gDS
->ProcessFirmwareVolume (File
->Buffer
, File
->Size
, &FvHandle
);
420 // If it is a file read it into memory and use it
421 Status
= EfiReadAllocatePool (File
, &FvStart
, &FvSize
);
423 if (EFI_ERROR (Status
)) {
427 Status
= gDS
->ProcessFirmwareVolume (FvStart
, FvSize
, &FvHandle
);
435 Perform an EFI connect to connect devices that follow the EFI driver model.
436 If it is a PI system also call the dispatcher in case a new FV was made
437 availible by one of the connect EFI drivers (this is not a common case).
441 @param Argc Number of command arguments in Argv
442 @param Argv Array of strings that represent the parsed command line.
443 Argv[0] is the comamnd name
456 EFI_HANDLE
*HandleBuffer
;
463 if ((*Argv
[1] == 'd') || (*Argv
[1] == 'D')) {
464 Status
= gBS
->LocateHandleBuffer (
471 if (EFI_ERROR (Status
)) {
475 for (Index
= 0; Index
< HandleCount
; Index
++) {
476 gBS
->DisconnectController (HandleBuffer
[Index
], NULL
, NULL
);
480 // Given we disconnect our console we should go and do a connect now
483 File
= EfiOpen (Argv
[1], EFI_FILE_MODE_READ
, 0);
485 AsciiPrint ("Connecting %a\n", Argv
[1]);
486 gBS
->ConnectController (File
->EfiHandle
, NULL
, NULL
, TRUE
);
495 Status
= gBS
->LocateHandleBuffer (
502 if (EFI_ERROR (Status
)) {
506 for (Index
= 0; Index
< HandleCount
; Index
++) {
507 gBS
->ConnectController (HandleBuffer
[Index
], NULL
, NULL
, TRUE
);
510 FreePool (HandleBuffer
);
513 // Check to see if it's possible to dispatch an more DXE drivers.
514 // The BdsLibConnectAllEfi () may have made new DXE drivers show up.
515 // If anything is Dispatched Status == EFI_SUCCESS and we will try
516 // the connect again.
519 Status
= EFI_NOT_FOUND
;
521 Status
= gDS
->Dispatch ();
522 if (!EFI_ERROR (Status
)) {
527 } while (!EFI_ERROR (Status
));
530 AsciiPrint ("Connected and dispatched\n");
532 AsciiPrint ("Connect\n");
540 CHAR8
*gMemMapType
[] = {
559 Dump out the EFI memory map
563 @param Argc Number of command arguments in Argv
564 @param Argv Array of strings that represent the parsed command line.
565 Argv[0] is the comamnd name
577 EFI_MEMORY_DESCRIPTOR
*MemMap
;
578 EFI_MEMORY_DESCRIPTOR
*OrigMemMap
;
581 UINTN DescriptorSize
;
582 UINT32 DescriptorVersion
;
583 UINT64 PageCount
[EfiMaxMemoryType
];
589 ZeroMem (PageCount
, sizeof (PageCount
));
591 AsciiPrint ("EFI Memory Map\n");
593 // First call is to figure out how big the buffer needs to be
596 Status
= gBS
->GetMemoryMap (&MemMapSize
, MemMap
, &MapKey
, &DescriptorSize
, &DescriptorVersion
);
597 if (Status
== EFI_BUFFER_TOO_SMALL
) {
598 // In case the AllocatPool changes the memory map we added in some extra descriptors
599 MemMapSize
+= (DescriptorSize
* 0x100);
600 OrigMemMap
= MemMap
= AllocatePool (MemMapSize
);
601 if (OrigMemMap
!= NULL
) {
602 // 2nd time we get the data
603 Status
= gBS
->GetMemoryMap (&MemMapSize
, MemMap
, &MapKey
, &DescriptorSize
, &DescriptorVersion
);
604 if (!EFI_ERROR (Status
)) {
605 for (Index
= 0, CurrentRow
= 0; Index
< MemMapSize
/DescriptorSize
; Index
++) {
606 EntrySize
= LShiftU64 (MemMap
->NumberOfPages
, 12);
607 AsciiPrint ("\n%a %016lx - %016lx: # %08lx %016lx", gMemMapType
[MemMap
->Type
% EfiMaxMemoryType
], MemMap
->PhysicalStart
, MemMap
->PhysicalStart
+ EntrySize
-1, MemMap
->NumberOfPages
, MemMap
->Attribute
);
608 if (EblAnyKeyToContinueQtoQuit (&CurrentRow
, TRUE
)) {
612 PageCount
[MemMap
->Type
% EfiMaxMemoryType
] += MemMap
->NumberOfPages
;
613 MemMap
= NEXT_MEMORY_DESCRIPTOR (MemMap
, DescriptorSize
);
617 for (Index
= 0, TotalMemory
= 0; Index
< EfiMaxMemoryType
; Index
++) {
618 if (PageCount
[Index
] != 0) {
619 AsciiPrint ("\n %a %,7ld Pages (%,14ld)", gMemMapType
[Index
], PageCount
[Index
], LShiftU64 (PageCount
[Index
], 12));
620 if (Index
== EfiLoaderCode
||
621 Index
== EfiLoaderData
||
622 Index
== EfiBootServicesCode
||
623 Index
== EfiBootServicesData
||
624 Index
== EfiRuntimeServicesCode
||
625 Index
== EfiRuntimeServicesData
||
626 Index
== EfiConventionalMemory
||
627 Index
== EfiACPIReclaimMemory
||
628 Index
== EfiACPIMemoryNVS
||
631 // Count total memory
632 TotalMemory
+= PageCount
[Index
];
637 AsciiPrint ("\nTotal Memory: %,ld MB (%,ld bytes)\n", RShiftU64 (TotalMemory
, 8), LShiftU64 (TotalMemory
, 12));
639 FreePool (OrigMemMap
);
651 Load a file into memory and optionally jump to it. A load addres can be
652 specified or automatically allocated. A quoted command line can optionally
653 be passed into the image.
656 Argv[1] - Device Name:path for the file to load
657 Argv[2] - Address to load to or '*' if the load address will be allocated
658 Argv[3] - Optional Entry point to the image. Image will be called if present
659 Argv[4] - "" string that will be passed as Argc & Argv to EntryPoint. Needs
660 to include the command name
662 go fv1:\EblCmdX 0x10000 0x10010 "EblCmdX Arg2 Arg3 Arg4"; - load EblCmdX
663 from FV1 to location 0x10000 and call the entry point at 0x10010 passing
664 in "EblCmdX Arg2 Arg3 Arg4" as the arguments.
666 go fv0:\EblCmdX * 0x10 "EblCmdX Arg2 Arg3 Arg4"; - load EblCmdX from FS0
667 to location allocated by this comamnd and call the entry point at offset 0x10
668 passing in "EblCmdX Arg2 Arg3 Arg4" as the arguments.
670 go fv1:\EblCmdX 0x10000; Load EblCmdX to address 0x10000 and return
672 @param Argc Number of command arguments in Argv
673 @param Argv Array of strings that represent the parsed command line.
674 Argv[0] is the comamnd name
689 EBL_COMMMAND EntryPoint
;
690 UINTN EntryPointArgc
;
691 CHAR8
*EntryPointArgv
[MAX_ARGS
];
695 // device name and laod address are required
699 File
= EfiOpen (Argv
[1], EFI_FILE_MODE_READ
, 0);
701 AsciiPrint (" %a is not a valid path\n", Argv
[1]);
705 EntryPoint
= (EBL_COMMMAND
)((Argc
> 3) ? (UINTN
)AsciiStrHexToUintn (Argv
[3]) : (UINTN
)NULL
);
706 if (Argv
[2][0] == '*') {
707 // * Means allocate the buffer
708 Status
= EfiReadAllocatePool (File
, &Address
, &Size
);
710 // EntryPoint is relatvie to the start of the image
711 EntryPoint
= (EBL_COMMMAND
)((UINTN
)EntryPoint
+ (UINTN
)Address
);
714 Address
= (VOID
*)AsciiStrHexToUintn (Argv
[2]);
717 // File->Size for LoadFile is lazy so we need to use the tell to figure it out
718 EfiTell (File
, NULL
);
719 Status
= EfiRead (File
, Address
, &Size
);
722 if (!EFI_ERROR (Status
)) {
723 AsciiPrint ("Loaded %,d bytes to 0x%08x\n", Size
, Address
);
727 ParseArguments (Argv
[4], &EntryPointArgc
, EntryPointArgv
);
730 EntryPointArgv
[0] = File
->FileName
;
733 Status
= EntryPoint (EntryPointArgc
, EntryPointArgv
);
741 #define FILE_COPY_CHUNK 0x20000
749 EFI_OPEN_FILE
*Source
= NULL
;
750 EFI_OPEN_FILE
*Destination
= NULL
;
751 EFI_STATUS Status
= EFI_SUCCESS
;
755 UINTN Chunk
= FILE_COPY_CHUNK
;
758 return EFI_INVALID_PARAMETER
;
761 Source
= EfiOpen(Argv
[1], EFI_FILE_MODE_READ
, 0);
762 if (Source
== NULL
) {
763 AsciiPrint("Source file open error.\n");
764 return EFI_NOT_FOUND
;
767 Destination
= EfiOpen(Argv
[2], EFI_FILE_MODE_READ
| EFI_FILE_MODE_WRITE
| EFI_FILE_MODE_CREATE
, 0);
768 if (Destination
== NULL
) {
769 AsciiPrint("Destination file open error.\n");
770 return EFI_NOT_FOUND
;
773 Buffer
= AllocatePool(FILE_COPY_CHUNK
);
774 if (Buffer
== NULL
) {
778 Size
= EfiTell(Source
, NULL
);
780 for (Offset
= 0; Offset
+ FILE_COPY_CHUNK
<= Size
; Offset
+= Chunk
) {
781 Chunk
= FILE_COPY_CHUNK
;
783 Status
= EfiRead(Source
, Buffer
, &Chunk
);
784 if (EFI_ERROR(Status
)) {
785 AsciiPrint("Read file error %r\n", Status
);
789 Status
= EfiWrite(Destination
, Buffer
, &Chunk
);
790 if (EFI_ERROR(Status
)) {
791 AsciiPrint("Write file error %r\n", Status
);
798 Chunk
= Size
- Offset
;
800 Status
= EfiRead(Source
, Buffer
, &Chunk
);
801 if (EFI_ERROR(Status
)) {
802 AsciiPrint("Read file error %r\n", Status
);
806 Status
= EfiWrite(Destination
, Buffer
, &Chunk
);
807 if (EFI_ERROR(Status
)) {
808 AsciiPrint("Write file error %r\n", Status
);
815 if (Source
!= NULL
) {
816 Status
= EfiClose(Source
);
817 if (EFI_ERROR(Status
)) {
818 AsciiPrint("Source close error %r\n", Status
);
821 if (Destination
!= NULL
) {
822 Status
= EfiClose(Destination
);
823 if (EFI_ERROR(Status
)) {
824 AsciiPrint("Destination close error %r\n", Status
);
828 if (Buffer
!= NULL
) {
841 EFI_OPEN_FILE
*File1
= NULL
;
842 EFI_OPEN_FILE
*File2
= NULL
;
843 EFI_STATUS Status
= EFI_SUCCESS
;
844 VOID
*Buffer1
= NULL
;
845 VOID
*Buffer2
= NULL
;
849 UINTN Chunk
= FILE_COPY_CHUNK
;
852 return EFI_INVALID_PARAMETER
;
855 File1
= EfiOpen(Argv
[1], EFI_FILE_MODE_READ
, 0);
857 AsciiPrint("File 1 open error.\n");
858 return EFI_NOT_FOUND
;
861 File2
= EfiOpen(Argv
[2], EFI_FILE_MODE_READ
, 0);
863 AsciiPrint("File 2 open error.\n");
864 return EFI_NOT_FOUND
;
867 Size1
= EfiTell(File1
, NULL
);
868 Size2
= EfiTell(File2
, NULL
);
870 if (Size1
!= Size2
) {
871 AsciiPrint("Files differ.\n");
875 Buffer1
= AllocatePool(FILE_COPY_CHUNK
);
876 if (Buffer1
== NULL
) {
880 Buffer2
= AllocatePool(FILE_COPY_CHUNK
);
881 if (Buffer2
== NULL
) {
885 for (Offset
= 0; Offset
+ FILE_COPY_CHUNK
<= Size1
; Offset
+= Chunk
) {
886 Chunk
= FILE_COPY_CHUNK
;
888 Status
= EfiRead(File1
, Buffer1
, &Chunk
);
889 if (EFI_ERROR(Status
)) {
890 AsciiPrint("File 1 read error\n");
894 Status
= EfiRead(File2
, Buffer2
, &Chunk
);
895 if (EFI_ERROR(Status
)) {
896 AsciiPrint("File 2 read error\n");
900 if (CompareMem(Buffer1
, Buffer2
, Chunk
) != 0) {
901 AsciiPrint("Files differ.\n");
907 if (Offset
< Size1
) {
908 Chunk
= Size1
- Offset
;
910 Status
= EfiRead(File1
, Buffer1
, &Chunk
);
911 if (EFI_ERROR(Status
)) {
912 AsciiPrint("File 1 read error\n");
916 Status
= EfiRead(File2
, Buffer2
, &Chunk
);
917 if (EFI_ERROR(Status
)) {
918 AsciiPrint("File 2 read error\n");
923 if (CompareMem(Buffer1
, Buffer2
, Chunk
) != 0) {
924 AsciiPrint("Files differ.\n");
926 AsciiPrint("Files are identical.\n");
931 Status
= EfiClose(File1
);
932 if (EFI_ERROR(Status
)) {
933 AsciiPrint("File 1 close error %r\n", Status
);
938 Status
= EfiClose(File2
);
939 if (EFI_ERROR(Status
)) {
940 AsciiPrint("File 2 close error %r\n", Status
);
944 if (Buffer1
!= NULL
) {
948 if (Buffer2
!= NULL
) {
955 GLOBAL_REMOVE_IF_UNREFERENCED
const EBL_COMMAND_TABLE mCmdDeviceTemplate
[] =
959 "[d]; Connect all EFI devices. d means disconnect",
965 "; Show information about boot devices",
971 " dev:path loadaddress entrypoint args; load to given address and jump in",
977 " devname; Load PI FV from device",
983 " path; EFI Boot Device:filepath. fs1:\\EFI\\BOOT.EFI",
989 "; dump EFI memory map",
995 " file1 file2; copy file",
1001 " file1 file2; compare files",
1009 Initialize the commands in this in this file
1013 EblInitializeDeviceCmd (
1017 EfiGetSystemConfigurationTable (&gEfiDxeServicesTableGuid
, (VOID
**) &gDS
);
1018 EblAddCommands (mCmdDeviceTemplate
, sizeof (mCmdDeviceTemplate
)/sizeof (EBL_COMMAND_TABLE
));