diff options
Diffstat (limited to 'EmbeddedPkg')
-rw-r--r-- | EmbeddedPkg/Ebl/Ebl.h | 1 | ||||
-rw-r--r-- | EmbeddedPkg/Ebl/EfiDevice.c | 34 | ||||
-rw-r--r-- | EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c | 189 |
3 files changed, 111 insertions, 113 deletions
diff --git a/EmbeddedPkg/Ebl/Ebl.h b/EmbeddedPkg/Ebl/Ebl.h index b1931a47fa..04f75d0f76 100644 --- a/EmbeddedPkg/Ebl/Ebl.h +++ b/EmbeddedPkg/Ebl/Ebl.h @@ -51,6 +51,7 @@ #include <Library/DevicePathLib.h> #include <Library/UefiLib.h> #include <Library/EblNetworkLib.h> +#include <Library/TimerLib.h> #include <IndustryStandard/Pci.h> diff --git a/EmbeddedPkg/Ebl/EfiDevice.c b/EmbeddedPkg/Ebl/EfiDevice.c index 9b08fda12a..70ba70383c 100644 --- a/EmbeddedPkg/Ebl/EfiDevice.c +++ b/EmbeddedPkg/Ebl/EfiDevice.c @@ -210,12 +210,34 @@ EblDeviceCmd ( UINTN Index;
UINTN CurrentRow;
UINTN Max;
+ EFI_OPEN_FILE *File;
CurrentRow = 0;
// Need to call here to make sure Device Counts are valid
EblUpdateDeviceLists ();
+ //
+ // 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) {
+ if (File->FsBlockIoMedia->MediaPresent) {
+ gBS->DisconnectController (File->EfiHandle, NULL, NULL);
+ }
+ gBS->ConnectController (File->EfiHandle, NULL, NULL, TRUE);
+ }
+ EfiClose (File);
+ }
+ }
+ }
+
+ // Now we can print out the info...
+
Max = EfiGetDeviceCounts (EfiOpenFirmwareVolume);
if (Max != 0) {
AsciiPrint ("Firmware Volume Devices:\n");
@@ -730,7 +752,7 @@ EblFileCopyCmd ( UINTN Size;
UINTN Offset;
UINTN Chunk = FILE_COPY_CHUNK;
-
+
if (Argc < 3) {
return EFI_INVALID_PARAMETER;
}
@@ -759,13 +781,13 @@ EblFileCopyCmd ( Status = EfiRead(Source, Buffer, &Chunk);
if (EFI_ERROR(Status)) {
- AsciiPrint("Read file error\n");
+ AsciiPrint("Read file error %r\n", Status);
goto Exit;
}
Status = EfiWrite(Destination, Buffer, &Chunk);
if (EFI_ERROR(Status)) {
- AsciiPrint("Write file error\n");
+ AsciiPrint("Write file error %r\n", Status);
goto Exit;
}
}
@@ -776,17 +798,18 @@ EblFileCopyCmd ( Status = EfiRead(Source, Buffer, &Chunk);
if (EFI_ERROR(Status)) {
- AsciiPrint("Read file error\n");
+ AsciiPrint("Read file error %r\n", Status);
goto Exit;
}
Status = EfiWrite(Destination, Buffer, &Chunk);
if (EFI_ERROR(Status)) {
- AsciiPrint("Write file error\n");
+ AsciiPrint("Write file error %r\n", Status);
goto Exit;
}
}
+
Exit:
if (Source != NULL) {
Status = EfiClose(Source);
@@ -794,7 +817,6 @@ Exit: AsciiPrint("Source close error %r\n", Status);
}
}
-
if (Destination != NULL) {
Status = EfiClose(Destination);
if (EFI_ERROR(Status)) {
diff --git a/EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c b/EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c index 8ef0790a81..1db7d7d035 100644 --- a/EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c +++ b/EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c @@ -100,8 +100,8 @@ Internal worker function to validate a File handle. **/ BOOLEAN FileHandleValid ( - IN EFI_OPEN_FILE *File - ) + IN EFI_OPEN_FILE *File + ) { EFI_OPEN_FILE_GUARD *GuardFile; @@ -123,8 +123,8 @@ Internal worker function. If Buffer is not NULL free it. **/ VOID EblFreePool ( - IN VOID *Buffer - ) + IN VOID *Buffer + ) { if (Buffer != NULL) { FreePool (Buffer); @@ -137,45 +137,20 @@ Update Device List Global Variables **/ VOID EblUpdateDeviceLists ( - VOID - ) + VOID + ) { EFI_STATUS Status; UINTN Size; EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Fs; - EFI_BLOCK_IO_PROTOCOL *BlkIo; EFI_FILE_HANDLE Root; UINTN Index; - BOOLEAN Update; if (mBlkIo != NULL) { FreePool (mBlkIo); } gBS->LocateHandleBuffer (ByProtocol, &gEfiBlockIoProtocolGuid, NULL, &mBlkIoCount, &mBlkIo); - // - // This is a trick to trigger the gBS->ReinstallProtocolInterface () in a removable media - // device to make a filesystem layer on. Probing devices will detect if media has been - // inserted and create - // - for (Index =0, Update = FALSE; Index < mBlkIoCount; Index++) { - Status = gBS->HandleProtocol (mBlkIo[Index], &gEfiBlockIoProtocolGuid, (VOID **)&BlkIo); - if (!EFI_ERROR (Status)) { - if (BlkIo->Media->RemovableMedia) { - gBS->DisconnectController (mBlkIo[Index], NULL, NULL); - gBS->ConnectController (mBlkIo[Index], NULL, NULL, TRUE); - Update = TRUE; - } - } - } - - if (Update) { - // In case we caused media to be detected that contains a partition (SD Card, ...) rescan - if (mBlkIo != NULL) { - FreePool (mBlkIo); - } - gBS->LocateHandleBuffer (ByProtocol, &gEfiBlockIoProtocolGuid, NULL, &mBlkIoCount, &mBlkIo); - } if (mFv != NULL) { @@ -248,10 +223,10 @@ and it can be used with mFs[] to find the handle that needs to be opened **/ BOOLEAN EblMatchVolumeName ( - IN CHAR8 *PathName, - IN UINTN FileStart, - OUT UINTN *MatchIndex - ) + IN CHAR8 *PathName, + IN UINTN FileStart, + OUT UINTN *MatchIndex + ) { UINTN Index; UINTN Compare; @@ -297,8 +272,8 @@ Return the number of devices of the current type active in the system **/ UINTN EfiGetDeviceCounts ( - IN EFI_OPEN_FILE_TYPE DeviceType - ) + IN EFI_OPEN_FILE_TYPE DeviceType + ) { switch (DeviceType) { case EfiOpenLoadFile: @@ -316,9 +291,9 @@ EfiGetDeviceCounts ( EFI_STATUS ConvertIpStringToEfiIp ( - IN CHAR8 *PathName, - OUT EFI_IP_ADDRESS *ServerIp - ) + IN CHAR8 *PathName, + OUT EFI_IP_ADDRESS *ServerIp + ) { CHAR8 *Str; @@ -362,8 +337,8 @@ text. Easy way to extract numbers from strings like blk7:. **/ UINTN EblConvertDevStringToNumber ( - IN CHAR8 *Str - ) + IN CHAR8 *Str + ) { UINTN Max; UINTN Index; @@ -392,10 +367,10 @@ Internal work function to fill in EFI_OPEN_FILE information for the Fs and BlkIo **/ EFI_STATUS EblFileDevicePath ( - IN OUT EFI_OPEN_FILE *File, - IN CHAR8 *FileName, - IN CONST UINT64 OpenMode - ) + IN OUT EFI_OPEN_FILE *File, + IN CHAR8 *FileName, + IN CONST UINT64 OpenMode + ) { EFI_STATUS Status; UINTN Size; @@ -481,9 +456,9 @@ EblFileDevicePath ( EFI_STATUS CompareGuidToString ( - IN EFI_GUID *Guid, - IN CHAR8 *String - ) + IN EFI_GUID *Guid, + IN CHAR8 *String + ) { CHAR8 AsciiGuid[64]; CHAR8 *StringPtr; @@ -528,10 +503,10 @@ Internal work function to fill in EFI_OPEN_FILE information for the FV **/ EFI_STATUS EblFvFileDevicePath ( - IN OUT EFI_OPEN_FILE *File, - IN CHAR8 *FileName, - IN CONST UINT64 OpenMode - ) + IN OUT EFI_OPEN_FILE *File, + IN CHAR8 *FileName, + IN CONST UINT64 OpenMode + ) { EFI_STATUS Status; EFI_STATUS GetNextFileStatus; @@ -678,10 +653,10 @@ For any file that is opened with EfiOpen() must be closed with EfiClose(). **/ EFI_OPEN_FILE * EfiOpen ( - IN CHAR8 *PathName, - IN CONST UINT64 OpenMode, - IN CONST EFI_SECTION_TYPE SectionType - ) + IN CHAR8 *PathName, + IN CONST UINT64 OpenMode, + IN CONST EFI_SECTION_TYPE SectionType + ) { EFI_STATUS Status; EFI_OPEN_FILE *File; @@ -937,9 +912,9 @@ ErrorExit: EFI_STATUS EfiCopyFile ( - IN CHAR8 *DestinationFile, - IN CHAR8 *SourceFile - ) + IN CHAR8 *DestinationFile, + IN CHAR8 *SourceFile + ) { EFI_OPEN_FILE *Source = NULL; EFI_OPEN_FILE *Destination = NULL; @@ -976,13 +951,13 @@ EfiCopyFile ( Status = EfiRead(Source, Buffer, &Chunk); if (EFI_ERROR(Status)) { - AsciiPrint("Read file error\n"); + AsciiPrint("Read file error %r\n", Status); goto Exit; } Status = EfiWrite(Destination, Buffer, &Chunk); if (EFI_ERROR(Status)) { - AsciiPrint("Write file error\n"); + AsciiPrint("Write file error %r\n", Status); goto Exit; } } @@ -1038,9 +1013,9 @@ Use DeviceType and Index to form a valid PathName and try and open it. **/ EFI_OPEN_FILE * EfiDeviceOpenByType ( - IN EFI_OPEN_FILE_TYPE DeviceType, - IN UINTN Index - ) + IN EFI_OPEN_FILE_TYPE DeviceType, + IN UINTN Index + ) { CHAR8 *DevStr; CHAR8 Path[MAX_CMD_LINE]; @@ -1083,8 +1058,8 @@ EfiOpen(). **/ EFI_STATUS EfiClose ( - IN EFI_OPEN_FILE *File - ) + IN EFI_OPEN_FILE *File + ) { EFI_STATUS Status; UINT64 TftpBufferSize; @@ -1117,21 +1092,21 @@ EfiClose ( if ((File->Type == EfiOpenLoadFile) || ((File->Type == EfiOpenTftp) && (File->IsBufferValid == TRUE)) || ((File->Type == EfiOpenFirmwareVolume) && (File->IsBufferValid == TRUE))) { - EblFreePool(File->Buffer); - } + EblFreePool(File->Buffer); + } - EblFreePool (File->DevicePath); - EblFreePool (File->DeviceName); - EblFreePool (File->FsFileInfo); - EblFreePool (File->FsInfo); + EblFreePool (File->DevicePath); + EblFreePool (File->DeviceName); + EblFreePool (File->FsFileInfo); + EblFreePool (File->FsInfo); - if (File->FsFileHandle != NULL) { - File->FsFileHandle->Close (File->FsFileHandle); - } + if (File->FsFileHandle != NULL) { + File->FsFileHandle->Close (File->FsFileHandle); + } - // Need to free File and it's Guard structures - EblFreePool (BASE_CR (File, EFI_OPEN_FILE_GUARD, File)); - return EFI_SUCCESS; + // Need to free File and it's Guard structures + EblFreePool (BASE_CR (File, EFI_OPEN_FILE_GUARD, File)); + return EFI_SUCCESS; } @@ -1147,9 +1122,9 @@ LoadFile is an exception as a load file size is set to zero. **/ UINTN EfiTell ( - IN EFI_OPEN_FILE *File, - OUT EFI_LBA *CurrentPosition OPTIONAL - ) + IN EFI_OPEN_FILE *File, + OUT EFI_LBA *CurrentPosition OPTIONAL + ) { EFI_STATUS Status; UINT64 BufferSize = 0; @@ -1221,10 +1196,10 @@ EfiSeekEnd : Only supported if Offset is zero to seek to end of file. **/ EFI_STATUS EfiSeek ( - IN EFI_OPEN_FILE *File, - IN EFI_LBA Offset, - IN EFI_SEEK_TYPE SeekType - ) + IN EFI_OPEN_FILE *File, + IN EFI_LBA Offset, + IN EFI_SEEK_TYPE SeekType + ) { EFI_STATUS Status; UINT64 CurrentPosition; @@ -1280,8 +1255,8 @@ EfiSeek ( EFI_STATUS CacheTftpFile ( - IN OUT EFI_OPEN_FILE *File - ) + IN OUT EFI_OPEN_FILE *File + ) { EFI_STATUS Status; UINT64 TftpBufferSize; @@ -1341,10 +1316,10 @@ FV, and TFTP case you must read the entire file. **/ EFI_STATUS EfiRead ( - IN EFI_OPEN_FILE *File, - OUT VOID *Buffer, - OUT UINTN *BufferSize - ) + IN EFI_OPEN_FILE *File, + OUT VOID *Buffer, + OUT UINTN *BufferSize + ) { EFI_STATUS Status; UINT32 AuthenticationStatus; @@ -1472,10 +1447,10 @@ must be. **/ EFI_STATUS EfiReadAllocatePool ( - IN EFI_OPEN_FILE *File, - OUT VOID **Buffer, - OUT UINTN *BufferSize - ) + IN EFI_OPEN_FILE *File, + OUT VOID **Buffer, + OUT UINTN *BufferSize + ) { if (!FileHandleValid (File)) { return EFI_INVALID_PARAMETER; @@ -1511,10 +1486,10 @@ Write data back to the file. For TFTP case you must write the entire file. **/ EFI_STATUS EfiWrite ( - IN EFI_OPEN_FILE *File, - OUT VOID *Buffer, - OUT UINTN *BufferSize - ) + IN EFI_OPEN_FILE *File, + OUT VOID *Buffer, + OUT UINTN *BufferSize + ) { EFI_STATUS Status; EFI_FV_WRITE_FILE_DATA FileData; @@ -1628,9 +1603,9 @@ directory names. **/ CHAR8 * ExpandPath ( - IN CHAR8 *Cwd, - IN CHAR8 *Path - ) + IN CHAR8 *Cwd, + IN CHAR8 *Path + ) { CHAR8 *NewPath; CHAR8 *Work, *Start, *End; @@ -1705,8 +1680,8 @@ the path does not contain a device name, The CWD is prepended to the path. **/ EFI_STATUS EfiSetCwd ( - IN CHAR8 *Cwd - ) + IN CHAR8 *Cwd + ) { EFI_OPEN_FILE *File; UINTN Len; @@ -1781,8 +1756,8 @@ this funciton. **/ CHAR8 * EfiGetCwd ( - VOID - ) + VOID + ) { if (gCwd == NULL) { return ""; |