summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--EmbeddedPkg/Ebl/EfiDevice.c13
-rw-r--r--EmbeddedPkg/Include/Library/EfiFileLib.h1
-rw-r--r--EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c10
3 files changed, 21 insertions, 3 deletions
diff --git a/EmbeddedPkg/Ebl/EfiDevice.c b/EmbeddedPkg/Ebl/EfiDevice.c
index 70ba70383c..80dcfcb5cc 100644
--- a/EmbeddedPkg/Ebl/EfiDevice.c
+++ b/EmbeddedPkg/Ebl/EfiDevice.c
@@ -207,13 +207,14 @@ EblDeviceCmd (
IN CHAR8 **Argv
)
{
+ EFI_STATUS Status;
UINTN Index;
UINTN CurrentRow;
UINTN Max;
EFI_OPEN_FILE *File;
CurrentRow = 0;
-
+
// Need to call here to make sure Device Counts are valid
EblUpdateDeviceLists ();
@@ -227,9 +228,15 @@ EblDeviceCmd (
if (File != NULL) {
if (File->FsBlockIoMedia->RemovableMedia) {
if (File->FsBlockIoMedia->MediaPresent) {
- gBS->DisconnectController (File->EfiHandle, NULL, NULL);
+ // Probe to see if media is present
+ Status = File->FsBlockIo->ReadBlocks (File->FsBlockIo, File->FsBlockIo->Media->MediaId, (EFI_LBA)0, 0, NULL);
+ if (Status == EFI_NO_MEDIA) {
+ gBS->DisconnectController (File->EfiHandle, NULL, NULL);
+ }
+ } else {
+ // Probe for media insertion and connect partition and filesystem drivers if needed
+ gBS->ConnectController (File->EfiHandle, NULL, NULL, TRUE);
}
- gBS->ConnectController (File->EfiHandle, NULL, NULL, TRUE);
}
EfiClose (File);
}
diff --git a/EmbeddedPkg/Include/Library/EfiFileLib.h b/EmbeddedPkg/Include/Library/EfiFileLib.h
index 9d98b19000..9ec5246358 100644
--- a/EmbeddedPkg/Include/Library/EfiFileLib.h
+++ b/EmbeddedPkg/Include/Library/EfiFileLib.h
@@ -94,6 +94,7 @@ typedef struct {
EFI_FILE_SYSTEM_INFO *FsInfo;
EFI_FILE_INFO *FsFileInfo;
EFI_BLOCK_IO_MEDIA *FsBlockIoMedia; // Information valid for Fs#: or B#:
+ EFI_BLOCK_IO_PROTOCOL *FsBlockIo; // Information valid for Fs#: or B#:
UINTN DiskOffset; // Information valid for B#:
diff --git a/EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c b/EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c
index 1db7d7d035..c93304d537 100644
--- a/EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c
+++ b/EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c
@@ -409,6 +409,7 @@ EblFileDevicePath (
Status = gBS->HandleProtocol (File->EfiHandle, &gEfiBlockIoProtocolGuid, (VOID **)&BlkIo);
if (!EFI_ERROR (Status)) {
File->FsBlockIoMedia = BlkIo->Media;
+ File->FsBlockIo = BlkIo;
// If we are not opening the device this will get over written with file info
File->MaxPosition = MultU64x32 (BlkIo->Media->LastBlock + 1, BlkIo->Media->BlockSize);
@@ -1732,6 +1733,15 @@ EfiSetCwd (
return EFI_INVALID_PARAMETER;
}
+ AsciiStrCpy (gCwd, File->DeviceName);
+ if (File->FileName == NULL) {
+ AsciiStrCat (gCwd, ":\\");
+ } else {
+ AsciiStrCat (gCwd, ":");
+ AsciiStrCat (gCwd, File->FileName);
+ }
+
+
EfiClose (File);
if (Path != Cwd) {
FreePool (Path);