EmulatorPkg: BlockIo2 APIs do not signal event

BlockIo2 Read/Write/Flush APIs should signal the token's event when the
I/O operation completes, but the Emulator APIs do not. As a result, any
code that tries to implement async I/O will hang on emulator.

Both Windows and Unix emulator hosts work the same way:

- All I/O is completed synchronously.
- All I/O implementations contain the comment:
  `// Caller is responsible for signaling EFI Event`

However, the protocol implementations do not signal the event, so the
event is never signalled.

Fix is to signal the event in the appropriate protocol implementations.

- If the host API returns success then the I/O is complete since it's
  always synchronous.
- If there is a Token and Token->Event is not null and the I/O is
  successful then the event should be signalled.

Signed-off-by: Doug Cook <idigdoug@gmail.com>
This commit is contained in:
Doug Cook (WINDOWS) 2024-11-30 17:47:38 -08:00 committed by mergify[bot]
parent 5158b598f7
commit 9098efdf0d
1 changed files with 15 additions and 0 deletions

View File

@ -96,6 +96,11 @@ EmuBlockIo2ReadBlocksEx (
Status = Private->Io->ReadBlocks (Private->Io, MediaId, LBA, Token, BufferSize, Buffer);
gBS->RestoreTPL (OldTpl);
if (Token && Token->Event && !EFI_ERROR (Status)) {
gBS->SignalEvent (Token->Event);
}
return Status;
}
@ -152,6 +157,11 @@ EmuBlockIo2WriteBlocksEx (
Status = Private->Io->WriteBlocks (Private->Io, MediaId, LBA, Token, BufferSize, Buffer);
gBS->RestoreTPL (OldTpl);
if (Token && Token->Event && !EFI_ERROR (Status)) {
gBS->SignalEvent (Token->Event);
}
return Status;
}
@ -195,6 +205,11 @@ EmuBlockIo2Flush (
Status = Private->Io->FlushBlocks (Private->Io, Token);
gBS->RestoreTPL (OldTpl);
if (Token && Token->Event && !EFI_ERROR (Status)) {
gBS->SignalEvent (Token->Event);
}
return Status;
}