UINTN Index;\r
UINTN CurrentRow;\r
UINTN Max;\r
+ EFI_OPEN_FILE *File;\r
\r
CurrentRow = 0;\r
\r
// Need to call here to make sure Device Counts are valid\r
EblUpdateDeviceLists ();\r
\r
+ //\r
+ // Probe for media insertion/removal in removable media devices\r
+ //\r
+ Max = EfiGetDeviceCounts (EfiOpenBlockIo);\r
+ if (Max != 0) {\r
+ for (Index = 0; Index < Max; Index++) {\r
+ File = EfiDeviceOpenByType (EfiOpenBlockIo, Index);\r
+ if (File != NULL) {\r
+ if (File->FsBlockIoMedia->RemovableMedia) {\r
+ if (File->FsBlockIoMedia->MediaPresent) {\r
+ gBS->DisconnectController (File->EfiHandle, NULL, NULL);\r
+ }\r
+ gBS->ConnectController (File->EfiHandle, NULL, NULL, TRUE);\r
+ }\r
+ EfiClose (File);\r
+ }\r
+ }\r
+ }\r
+\r
+ // Now we can print out the info...\r
+\r
Max = EfiGetDeviceCounts (EfiOpenFirmwareVolume);\r
if (Max != 0) {\r
AsciiPrint ("Firmware Volume Devices:\n");\r
UINTN Size;\r
UINTN Offset;\r
UINTN Chunk = FILE_COPY_CHUNK;\r
- \r
+\r
if (Argc < 3) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
Status = EfiRead(Source, Buffer, &Chunk);\r
if (EFI_ERROR(Status)) {\r
- AsciiPrint("Read file error\n");\r
+ AsciiPrint("Read file error %r\n", Status);\r
goto Exit;\r
}\r
\r
Status = EfiWrite(Destination, Buffer, &Chunk);\r
if (EFI_ERROR(Status)) {\r
- AsciiPrint("Write file error\n");\r
+ AsciiPrint("Write file error %r\n", Status);\r
goto Exit;\r
} \r
}\r
\r
Status = EfiRead(Source, Buffer, &Chunk);\r
if (EFI_ERROR(Status)) {\r
- AsciiPrint("Read file error\n");\r
+ AsciiPrint("Read file error %r\n", Status);\r
goto Exit;\r
}\r
\r
Status = EfiWrite(Destination, Buffer, &Chunk);\r
if (EFI_ERROR(Status)) {\r
- AsciiPrint("Write file error\n");\r
+ AsciiPrint("Write file error %r\n", Status);\r
goto Exit;\r
} \r
}\r
\r
+\r
Exit:\r
if (Source != NULL) {\r
Status = EfiClose(Source);\r
AsciiPrint("Source close error %r\n", Status);\r
}\r
}\r
- \r
if (Destination != NULL) {\r
Status = EfiClose(Destination);\r
if (EFI_ERROR(Status)) {\r
**/
BOOLEAN
FileHandleValid (
- IN EFI_OPEN_FILE *File
- )
+ IN EFI_OPEN_FILE *File
+ )
{
EFI_OPEN_FILE_GUARD *GuardFile;
**/
VOID
EblFreePool (
- IN VOID *Buffer
- )
+ IN VOID *Buffer
+ )
{
if (Buffer != NULL) {
FreePool (Buffer);
**/
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) {
**/
BOOLEAN
EblMatchVolumeName (
- IN CHAR8 *PathName,
- IN UINTN FileStart,
- OUT UINTN *MatchIndex
- )
+ IN CHAR8 *PathName,
+ IN UINTN FileStart,
+ OUT UINTN *MatchIndex
+ )
{
UINTN Index;
UINTN Compare;
**/
UINTN
EfiGetDeviceCounts (
- IN EFI_OPEN_FILE_TYPE DeviceType
- )
+ IN EFI_OPEN_FILE_TYPE DeviceType
+ )
{
switch (DeviceType) {
case EfiOpenLoadFile:
EFI_STATUS
ConvertIpStringToEfiIp (
- IN CHAR8 *PathName,
- OUT EFI_IP_ADDRESS *ServerIp
- )
+ IN CHAR8 *PathName,
+ OUT EFI_IP_ADDRESS *ServerIp
+ )
{
CHAR8 *Str;
**/
UINTN
EblConvertDevStringToNumber (
- IN CHAR8 *Str
- )
+ IN CHAR8 *Str
+ )
{
UINTN Max;
UINTN Index;
**/
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;
EFI_STATUS
CompareGuidToString (
- IN EFI_GUID *Guid,
- IN CHAR8 *String
- )
+ IN EFI_GUID *Guid,
+ IN CHAR8 *String
+ )
{
CHAR8 AsciiGuid[64];
CHAR8 *StringPtr;
**/
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;
**/
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;
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;
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;
}
}
**/
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];
**/
EFI_STATUS
EfiClose (
- IN EFI_OPEN_FILE *File
- )
+ IN EFI_OPEN_FILE *File
+ )
{
EFI_STATUS Status;
UINT64 TftpBufferSize;
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;
}
**/
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;
**/
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;
EFI_STATUS
CacheTftpFile (
- IN OUT EFI_OPEN_FILE *File
- )
+ IN OUT EFI_OPEN_FILE *File
+ )
{
EFI_STATUS Status;
UINT64 TftpBufferSize;
**/
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;
**/
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;
**/
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;
**/
CHAR8 *
ExpandPath (
- IN CHAR8 *Cwd,
- IN CHAR8 *Path
- )
+ IN CHAR8 *Cwd,
+ IN CHAR8 *Path
+ )
{
CHAR8 *NewPath;
CHAR8 *Work, *Start, *End;
**/
EFI_STATUS
EfiSetCwd (
- IN CHAR8 *Cwd
- )
+ IN CHAR8 *Cwd
+ )
{
EFI_OPEN_FILE *File;
UINTN Len;
**/
CHAR8 *
EfiGetCwd (
- VOID
- )
+ VOID
+ )
{
if (gCwd == NULL) {
return "";