/** Send null requests to all removable media block IO devices so the a media add/remove/change can be detected in real before we execute a command. This is mainly due to the fact that the FAT driver does not do this today so you can get stale dir commands after an SD Card has been removed. **/ VOID EblProbeRemovableMedia ( VOID ) { UINTN Index; UINTN Max; EFI_OPEN_FILE *File; // // Probe for media insertion/removal in removable media devices // Max = EfiGetDeviceCounts (EfiOpenBlockIo); if (Max != 0) { for (Index = 0; Index < Max; Index++) { File = EfiDeviceOpenByType (EfiOpenBlockIo, Index); if (File != NULL) { if (File->FsBlockIoMedia->RemovableMedia) { // Probe to see if media is present (or not) or media changed // this causes the ReinstallProtocolInterface() to fire in the // block io driver to update the system about media change events File->FsBlockIo->ReadBlocks (File->FsBlockIo, File->FsBlockIo->Media->MediaId, (EFI_LBA)0, 0, NULL); } EfiClose (File); } } } }
/** Print information about the Blk IO devices. If the device supports PXE dump out extra information @param File Open File for the device **/ VOID EblPrintBlkIoInfo ( IN EFI_OPEN_FILE *File ) { UINT64 DeviceSize; UINTN Index; UINTN Max; EFI_OPEN_FILE *FsFile; if (File == NULL) { return; } AsciiPrint (" %a: ", File->DeviceName); // print out name of file system, if any, on this block device Max = EfiGetDeviceCounts (EfiOpenFileSystem); if (Max != 0) { for (Index = 0; Index < Max; Index++) { FsFile = EfiDeviceOpenByType (EfiOpenFileSystem, Index); if (FsFile != NULL) { if (FsFile->EfiHandle == File->EfiHandle) { AsciiPrint ("fs%d: ", Index); EfiClose (FsFile); break; } EfiClose (FsFile); } } } // Print out useful Block IO media properties if (File->FsBlockIoMedia->RemovableMedia) { AsciiPrint ("Removable "); } if (!File->FsBlockIoMedia->MediaPresent) { AsciiPrint ("No Media\n"); } else { if (File->FsBlockIoMedia->LogicalPartition) { AsciiPrint ("Partition "); } DeviceSize = MultU64x32 (File->FsBlockIoMedia->LastBlock + 1, File->FsBlockIoMedia->BlockSize); AsciiPrint ("Size = 0x%lX\n", DeviceSize); } EfiClose (File); }
/** Dump information about devices in the system. fv: PI Firmware Volume fs: EFI Simple File System blk: EFI Block IO LoadFile: EFI Load File Protocol (commonly PXE network boot) Argv[0] - "device" @param Argc Number of command arguments in Argv @param Argv Array of strings that represent the parsed command line. Argv[0] is the command name @return EFI_SUCCESS **/ EFI_STATUS EblDeviceCmd ( IN UINTN Argc, IN CHAR8 **Argv ) { UINTN Index; UINTN CurrentRow; UINTN Max; CurrentRow = 0; // Need to call here to make sure Device Counts are valid EblUpdateDeviceLists (); // Now we can print out the info... Max = EfiGetDeviceCounts (EfiOpenFirmwareVolume); if (Max != 0) { AsciiPrint ("Firmware Volume Devices:\n"); for (Index = 0; Index < Max; Index++) { EblPrintFvbInfo (EfiDeviceOpenByType (EfiOpenFirmwareVolume, Index)); if (EblAnyKeyToContinueQtoQuit (&CurrentRow, TRUE)) { break; } } } Max = EfiGetDeviceCounts (EfiOpenFileSystem); if (Max != 0) { AsciiPrint ("File System Devices:\n"); for (Index = 0; Index < Max; Index++) { EblPrintFsInfo (EfiDeviceOpenByType (EfiOpenFileSystem, Index)); if (EblAnyKeyToContinueQtoQuit (&CurrentRow, TRUE)) { break; } } } Max = EfiGetDeviceCounts (EfiOpenBlockIo); if (Max != 0) { AsciiPrint ("Block IO Devices:\n"); for (Index = 0; Index < Max; Index++) { EblPrintBlkIoInfo (EfiDeviceOpenByType (EfiOpenBlockIo, Index)); if (EblAnyKeyToContinueQtoQuit (&CurrentRow, TRUE)) { break; } } } Max = EfiGetDeviceCounts (EfiOpenLoadFile); if (Max != 0) { AsciiPrint ("LoadFile Devices: (usually network)\n"); for (Index = 0; Index < Max; Index++) { EblPrintLoadFileInfo (EfiDeviceOpenByType (EfiOpenLoadFile, Index)); if (EblAnyKeyToContinueQtoQuit (&CurrentRow, TRUE)) { break; } } } return EFI_SUCCESS; }