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 if (File
->FsBlockIoMedia
->MediaPresent
) {
231 // Probe to see if media is present
232 Status
= File
->FsBlockIo
->ReadBlocks (File
->FsBlockIo
, File
->FsBlockIo
->Media
->MediaId
, (EFI_LBA
)0, 0, NULL
);
233 if (Status
== EFI_NO_MEDIA
) {
234 gBS
->DisconnectController (File
->EfiHandle
, NULL
, NULL
);
237 // Probe for media insertion and connect partition and filesystem drivers if needed
238 gBS
->ConnectController (File
->EfiHandle
, NULL
, NULL
, TRUE
);
246 // Now we can print out the info...
248 Max
= EfiGetDeviceCounts (EfiOpenFirmwareVolume
);
250 AsciiPrint ("Firmware Volume Devices:\n");
251 for (Index
= 0; Index
< Max
; Index
++) {
252 EblPrintFvbInfo (EfiDeviceOpenByType (EfiOpenFirmwareVolume
, Index
));
253 if (EblAnyKeyToContinueQtoQuit (&CurrentRow
, TRUE
)) {
259 Max
= EfiGetDeviceCounts (EfiOpenFileSystem
);
261 AsciiPrint ("File System Devices:\n");
262 for (Index
= 0; Index
< Max
; Index
++) {
263 EblPrintFsInfo (EfiDeviceOpenByType (EfiOpenFileSystem
, Index
));
264 if (EblAnyKeyToContinueQtoQuit (&CurrentRow
, TRUE
)) {
270 Max
= EfiGetDeviceCounts (EfiOpenBlockIo
);
272 AsciiPrint ("Block IO Devices:\n");
273 for (Index
= 0; Index
< Max
; Index
++) {
274 EblPrintBlkIoInfo (EfiDeviceOpenByType (EfiOpenBlockIo
, Index
));
275 if (EblAnyKeyToContinueQtoQuit (&CurrentRow
, TRUE
)) {
281 Max
= EfiGetDeviceCounts (EfiOpenLoadFile
);
283 AsciiPrint ("LoadFile Devices: (usually network)\n");
284 for (Index
= 0; Index
< Max
; Index
++) {
285 EblPrintLoadFileInfo (EfiDeviceOpenByType (EfiOpenLoadFile
, Index
));
286 if (EblAnyKeyToContinueQtoQuit (&CurrentRow
, TRUE
)) {
297 Start an EFI image (PE32+ with EFI defined entry point).
300 Argv[1] - device name and path
301 Argv[2] - "" string to pass into image being started
303 start fs1:\Temp\Fv.Fv "arg to pass" ; load an FV from the disk and pass the
304 ; ascii string arg to pass to the image
305 start fv0:\FV ; load an FV from an FV (not common)
306 start LoadFile0: ; load an FV via a PXE boot
308 @param Argc Number of command arguments in Argv
309 @param Argv Array of strings that represent the parsed command line.
310 Argv[0] is the comamnd name
323 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
324 EFI_HANDLE ImageHandle
;
329 EFI_LOADED_IMAGE_PROTOCOL
*ImageInfo
;
334 return EFI_INVALID_PARAMETER
;
337 File
= EfiOpen (Argv
[1], EFI_FILE_MODE_READ
, 0);
339 return EFI_INVALID_PARAMETER
;
342 DevicePath
= File
->DevicePath
;
343 if (DevicePath
!= NULL
) {
344 // check for device path form: blk, fv, fs, and loadfile
345 Status
= gBS
->LoadImage (FALSE
, gImageHandle
, DevicePath
, NULL
, 0, &ImageHandle
);
347 // Check for buffer form: A0x12345678:0x1234 syntax.
348 // Means load using buffer starting at 0x12345678 of size 0x1234.
350 Status
= EfiReadAllocatePool (File
, &Buffer
, &BufferSize
);
351 if (EFI_ERROR (Status
)) {
355 Status
= gBS
->LoadImage (FALSE
, gImageHandle
, DevicePath
, Buffer
, BufferSize
, &ImageHandle
);
362 if (!EFI_ERROR (Status
)) {
364 // Argv[2] is a "" string that we pass directly to the EFI application without the ""
365 // We don't pass Argv[0] to the EFI Application (it's name) just the args
366 Status
= gBS
->HandleProtocol (ImageHandle
, &gEfiLoadedImageProtocolGuid
, (VOID
**)&ImageInfo
);
367 ASSERT_EFI_ERROR (Status
);
369 ImageInfo
->LoadOptionsSize
= (UINT32
)AsciiStrSize (Argv
[2]);
370 ImageInfo
->LoadOptions
= AllocatePool (ImageInfo
->LoadOptionsSize
);
371 AsciiStrCpy (ImageInfo
->LoadOptions
, Argv
[2]);
374 // Transfer control to the EFI image we loaded with LoadImage()
375 Status
= gBS
->StartImage (ImageHandle
, &ExitDataSize
, &ExitData
);
383 Load a Firmware Volume (FV) into memory from a device. This causes drivers in
384 the FV to be dispatched if the dependancies of the drivers are met.
387 Argv[1] - device name and path
389 loadfv fs1:\Temp\Fv.Fv ; load an FV from the disk
390 loadfv fv0:\FV ; load an FV from an FV (not common)
391 loadfv LoadFile0: ; load an FV via a PXE boot
393 @param Argc Number of command arguments in Argv
394 @param Argv Array of strings that represent the parsed command line.
395 Argv[0] is the comamnd name
414 return EFI_INVALID_PARAMETER
;
417 File
= EfiOpen (Argv
[1], EFI_FILE_MODE_READ
, 0);
419 return EFI_INVALID_PARAMETER
;
422 if (File
->Type
== EfiOpenMemoryBuffer
) {
423 // If it is a address just use it.
424 Status
= gDS
->ProcessFirmwareVolume (File
->Buffer
, File
->Size
, &FvHandle
);
426 // If it is a file read it into memory and use it
427 Status
= EfiReadAllocatePool (File
, &FvStart
, &FvSize
);
429 if (EFI_ERROR (Status
)) {
433 Status
= gDS
->ProcessFirmwareVolume (FvStart
, FvSize
, &FvHandle
);
441 Perform an EFI connect to connect devices that follow the EFI driver model.
442 If it is a PI system also call the dispatcher in case a new FV was made
443 availible by one of the connect EFI drivers (this is not a common case).
447 @param Argc Number of command arguments in Argv
448 @param Argv Array of strings that represent the parsed command line.
449 Argv[0] is the comamnd name
462 EFI_HANDLE
*HandleBuffer
;
469 if ((*Argv
[1] == 'd') || (*Argv
[1] == 'D')) {
470 Status
= gBS
->LocateHandleBuffer (
477 if (EFI_ERROR (Status
)) {
481 for (Index
= 0; Index
< HandleCount
; Index
++) {
482 gBS
->DisconnectController (HandleBuffer
[Index
], NULL
, NULL
);
486 // Given we disconnect our console we should go and do a connect now
489 File
= EfiOpen (Argv
[1], EFI_FILE_MODE_READ
, 0);
491 AsciiPrint ("Connecting %a\n", Argv
[1]);
492 gBS
->ConnectController (File
->EfiHandle
, NULL
, NULL
, TRUE
);
501 Status
= gBS
->LocateHandleBuffer (
508 if (EFI_ERROR (Status
)) {
512 for (Index
= 0; Index
< HandleCount
; Index
++) {
513 gBS
->ConnectController (HandleBuffer
[Index
], NULL
, NULL
, TRUE
);
516 FreePool (HandleBuffer
);
519 // Check to see if it's possible to dispatch an more DXE drivers.
520 // The BdsLibConnectAllEfi () may have made new DXE drivers show up.
521 // If anything is Dispatched Status == EFI_SUCCESS and we will try
522 // the connect again.
525 Status
= EFI_NOT_FOUND
;
527 Status
= gDS
->Dispatch ();
528 if (!EFI_ERROR (Status
)) {
533 } while (!EFI_ERROR (Status
));
536 AsciiPrint ("Connected and dispatched\n");
538 AsciiPrint ("Connect\n");
546 CHAR8
*gMemMapType
[] = {
565 Dump out the EFI memory map
569 @param Argc Number of command arguments in Argv
570 @param Argv Array of strings that represent the parsed command line.
571 Argv[0] is the comamnd name
583 EFI_MEMORY_DESCRIPTOR
*MemMap
;
584 EFI_MEMORY_DESCRIPTOR
*OrigMemMap
;
587 UINTN DescriptorSize
;
588 UINT32 DescriptorVersion
;
589 UINT64 PageCount
[EfiMaxMemoryType
];
595 ZeroMem (PageCount
, sizeof (PageCount
));
597 AsciiPrint ("EFI Memory Map\n");
599 // First call is to figure out how big the buffer needs to be
602 Status
= gBS
->GetMemoryMap (&MemMapSize
, MemMap
, &MapKey
, &DescriptorSize
, &DescriptorVersion
);
603 if (Status
== EFI_BUFFER_TOO_SMALL
) {
604 // In case the AllocatPool changes the memory map we added in some extra descriptors
605 MemMapSize
+= (DescriptorSize
* 0x100);
606 OrigMemMap
= MemMap
= AllocatePool (MemMapSize
);
607 if (OrigMemMap
!= NULL
) {
608 // 2nd time we get the data
609 Status
= gBS
->GetMemoryMap (&MemMapSize
, MemMap
, &MapKey
, &DescriptorSize
, &DescriptorVersion
);
610 if (!EFI_ERROR (Status
)) {
611 for (Index
= 0, CurrentRow
= 0; Index
< MemMapSize
/DescriptorSize
; Index
++) {
612 EntrySize
= LShiftU64 (MemMap
->NumberOfPages
, 12);
613 AsciiPrint ("\n%a %016lx - %016lx: # %08lx %016lx", gMemMapType
[MemMap
->Type
% EfiMaxMemoryType
], MemMap
->PhysicalStart
, MemMap
->PhysicalStart
+ EntrySize
-1, MemMap
->NumberOfPages
, MemMap
->Attribute
);
614 if (EblAnyKeyToContinueQtoQuit (&CurrentRow
, TRUE
)) {
618 PageCount
[MemMap
->Type
% EfiMaxMemoryType
] += MemMap
->NumberOfPages
;
619 MemMap
= NEXT_MEMORY_DESCRIPTOR (MemMap
, DescriptorSize
);
623 for (Index
= 0, TotalMemory
= 0; Index
< EfiMaxMemoryType
; Index
++) {
624 if (PageCount
[Index
] != 0) {
625 AsciiPrint ("\n %a %,7ld Pages (%,14ld)", gMemMapType
[Index
], PageCount
[Index
], LShiftU64 (PageCount
[Index
], 12));
626 if (Index
== EfiLoaderCode
||
627 Index
== EfiLoaderData
||
628 Index
== EfiBootServicesCode
||
629 Index
== EfiBootServicesData
||
630 Index
== EfiRuntimeServicesCode
||
631 Index
== EfiRuntimeServicesData
||
632 Index
== EfiConventionalMemory
||
633 Index
== EfiACPIReclaimMemory
||
634 Index
== EfiACPIMemoryNVS
||
637 // Count total memory
638 TotalMemory
+= PageCount
[Index
];
643 AsciiPrint ("\nTotal Memory: %,ld MB (%,ld bytes)\n", RShiftU64 (TotalMemory
, 8), LShiftU64 (TotalMemory
, 12));
645 FreePool (OrigMemMap
);
657 Load a file into memory and optionally jump to it. A load addres can be
658 specified or automatically allocated. A quoted command line can optionally
659 be passed into the image.
662 Argv[1] - Device Name:path for the file to load
663 Argv[2] - Address to load to or '*' if the load address will be allocated
664 Argv[3] - Optional Entry point to the image. Image will be called if present
665 Argv[4] - "" string that will be passed as Argc & Argv to EntryPoint. Needs
666 to include the command name
668 go fv1:\EblCmdX 0x10000 0x10010 "EblCmdX Arg2 Arg3 Arg4"; - load EblCmdX
669 from FV1 to location 0x10000 and call the entry point at 0x10010 passing
670 in "EblCmdX Arg2 Arg3 Arg4" as the arguments.
672 go fv0:\EblCmdX * 0x10 "EblCmdX Arg2 Arg3 Arg4"; - load EblCmdX from FS0
673 to location allocated by this comamnd and call the entry point at offset 0x10
674 passing in "EblCmdX Arg2 Arg3 Arg4" as the arguments.
676 go fv1:\EblCmdX 0x10000; Load EblCmdX to address 0x10000 and return
678 @param Argc Number of command arguments in Argv
679 @param Argv Array of strings that represent the parsed command line.
680 Argv[0] is the comamnd name
695 EBL_COMMMAND EntryPoint
;
696 UINTN EntryPointArgc
;
697 CHAR8
*EntryPointArgv
[MAX_ARGS
];
701 // device name and laod address are required
705 File
= EfiOpen (Argv
[1], EFI_FILE_MODE_READ
, 0);
707 AsciiPrint (" %a is not a valid path\n", Argv
[1]);
711 EntryPoint
= (EBL_COMMMAND
)((Argc
> 3) ? (UINTN
)AsciiStrHexToUintn (Argv
[3]) : (UINTN
)NULL
);
712 if (Argv
[2][0] == '*') {
713 // * Means allocate the buffer
714 Status
= EfiReadAllocatePool (File
, &Address
, &Size
);
716 // EntryPoint is relatvie to the start of the image
717 EntryPoint
= (EBL_COMMMAND
)((UINTN
)EntryPoint
+ (UINTN
)Address
);
720 Address
= (VOID
*)AsciiStrHexToUintn (Argv
[2]);
723 // File->Size for LoadFile is lazy so we need to use the tell to figure it out
724 EfiTell (File
, NULL
);
725 Status
= EfiRead (File
, Address
, &Size
);
728 if (!EFI_ERROR (Status
)) {
729 AsciiPrint ("Loaded %,d bytes to 0x%08x\n", Size
, Address
);
733 ParseArguments (Argv
[4], &EntryPointArgc
, EntryPointArgv
);
736 EntryPointArgv
[0] = File
->FileName
;
739 Status
= EntryPoint (EntryPointArgc
, EntryPointArgv
);
747 #define FILE_COPY_CHUNK 0x20000
755 EFI_OPEN_FILE
*Source
= NULL
;
756 EFI_OPEN_FILE
*Destination
= NULL
;
757 EFI_STATUS Status
= EFI_SUCCESS
;
761 UINTN Chunk
= FILE_COPY_CHUNK
;
764 return EFI_INVALID_PARAMETER
;
767 Source
= EfiOpen(Argv
[1], EFI_FILE_MODE_READ
, 0);
768 if (Source
== NULL
) {
769 AsciiPrint("Source file open error.\n");
770 return EFI_NOT_FOUND
;
773 Destination
= EfiOpen(Argv
[2], EFI_FILE_MODE_READ
| EFI_FILE_MODE_WRITE
| EFI_FILE_MODE_CREATE
, 0);
774 if (Destination
== NULL
) {
775 AsciiPrint("Destination file open error.\n");
776 return EFI_NOT_FOUND
;
779 Buffer
= AllocatePool(FILE_COPY_CHUNK
);
780 if (Buffer
== NULL
) {
784 Size
= EfiTell(Source
, NULL
);
786 for (Offset
= 0; Offset
+ FILE_COPY_CHUNK
<= Size
; Offset
+= Chunk
) {
787 Chunk
= FILE_COPY_CHUNK
;
789 Status
= EfiRead(Source
, Buffer
, &Chunk
);
790 if (EFI_ERROR(Status
)) {
791 AsciiPrint("Read file error %r\n", Status
);
795 Status
= EfiWrite(Destination
, Buffer
, &Chunk
);
796 if (EFI_ERROR(Status
)) {
797 AsciiPrint("Write file error %r\n", Status
);
804 Chunk
= Size
- Offset
;
806 Status
= EfiRead(Source
, Buffer
, &Chunk
);
807 if (EFI_ERROR(Status
)) {
808 AsciiPrint("Read file error %r\n", Status
);
812 Status
= EfiWrite(Destination
, Buffer
, &Chunk
);
813 if (EFI_ERROR(Status
)) {
814 AsciiPrint("Write file error %r\n", Status
);
821 if (Source
!= NULL
) {
822 Status
= EfiClose(Source
);
823 if (EFI_ERROR(Status
)) {
824 AsciiPrint("Source close error %r\n", Status
);
827 if (Destination
!= NULL
) {
828 Status
= EfiClose(Destination
);
829 if (EFI_ERROR(Status
)) {
830 AsciiPrint("Destination close error %r\n", Status
);
834 if (Buffer
!= NULL
) {
847 EFI_OPEN_FILE
*File1
= NULL
;
848 EFI_OPEN_FILE
*File2
= NULL
;
849 EFI_STATUS Status
= EFI_SUCCESS
;
850 VOID
*Buffer1
= NULL
;
851 VOID
*Buffer2
= NULL
;
855 UINTN Chunk
= FILE_COPY_CHUNK
;
858 return EFI_INVALID_PARAMETER
;
861 File1
= EfiOpen(Argv
[1], EFI_FILE_MODE_READ
, 0);
863 AsciiPrint("File 1 open error.\n");
864 return EFI_NOT_FOUND
;
867 File2
= EfiOpen(Argv
[2], EFI_FILE_MODE_READ
, 0);
869 AsciiPrint("File 2 open error.\n");
870 return EFI_NOT_FOUND
;
873 Size1
= EfiTell(File1
, NULL
);
874 Size2
= EfiTell(File2
, NULL
);
876 if (Size1
!= Size2
) {
877 AsciiPrint("Files differ.\n");
881 Buffer1
= AllocatePool(FILE_COPY_CHUNK
);
882 if (Buffer1
== NULL
) {
886 Buffer2
= AllocatePool(FILE_COPY_CHUNK
);
887 if (Buffer2
== NULL
) {
891 for (Offset
= 0; Offset
+ FILE_COPY_CHUNK
<= Size1
; Offset
+= Chunk
) {
892 Chunk
= FILE_COPY_CHUNK
;
894 Status
= EfiRead(File1
, Buffer1
, &Chunk
);
895 if (EFI_ERROR(Status
)) {
896 AsciiPrint("File 1 read error\n");
900 Status
= EfiRead(File2
, Buffer2
, &Chunk
);
901 if (EFI_ERROR(Status
)) {
902 AsciiPrint("File 2 read error\n");
906 if (CompareMem(Buffer1
, Buffer2
, Chunk
) != 0) {
907 AsciiPrint("Files differ.\n");
913 if (Offset
< Size1
) {
914 Chunk
= Size1
- Offset
;
916 Status
= EfiRead(File1
, Buffer1
, &Chunk
);
917 if (EFI_ERROR(Status
)) {
918 AsciiPrint("File 1 read error\n");
922 Status
= EfiRead(File2
, Buffer2
, &Chunk
);
923 if (EFI_ERROR(Status
)) {
924 AsciiPrint("File 2 read error\n");
929 if (CompareMem(Buffer1
, Buffer2
, Chunk
) != 0) {
930 AsciiPrint("Files differ.\n");
932 AsciiPrint("Files are identical.\n");
937 Status
= EfiClose(File1
);
938 if (EFI_ERROR(Status
)) {
939 AsciiPrint("File 1 close error %r\n", Status
);
944 Status
= EfiClose(File2
);
945 if (EFI_ERROR(Status
)) {
946 AsciiPrint("File 2 close error %r\n", Status
);
950 if (Buffer1
!= NULL
) {
954 if (Buffer2
!= NULL
) {
961 GLOBAL_REMOVE_IF_UNREFERENCED
const EBL_COMMAND_TABLE mCmdDeviceTemplate
[] =
965 "[d]; Connect all EFI devices. d means disconnect",
971 "; Show information about boot devices",
977 " dev:path loadaddress entrypoint args; load to given address and jump in",
983 " devname; Load PI FV from device",
989 " path; EFI Boot Device:filepath. fs1:\\EFI\\BOOT.EFI",
995 "; dump EFI memory map",
1001 " file1 file2; copy file",
1007 " file1 file2; compare files",
1015 Initialize the commands in this in this file
1019 EblInitializeDeviceCmd (
1023 EfiGetSystemConfigurationTable (&gEfiDxeServicesTableGuid
, (VOID
**) &gDS
);
1024 EblAddCommands (mCmdDeviceTemplate
, sizeof (mCmdDeviceTemplate
)/sizeof (EBL_COMMAND_TABLE
));