On Feb 12, 2013, at 1:08 PM, "David F." <[email protected]> wrote:
> Are you saying in an application:
>
> OpenProtocol(Handle, &gEfiDiskIoProtocolGuid, (void**) &DiskIO,
> ImageHandle, NULL, EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL)
>
> is not safe - it will still invalidate the pointers in DiskIO when
> removed and won't wait until CloseProtocol is used?
>
You need to use BY_DRIVER to be safe. The AgentHandle would point to your
EFI_DRIVER_BINDING_PROTOCOL instance and EFI_DRIVER_BINDING_PROTOCOL.Stop()
will get called at the right spot when the surprise disconnect happens. The
ControlHandle can point to Handle.
The history here is EFI 1.0 was rushed out to sync up with the first Itanium
platforms. EFI 1.10 came along later and added the driver model. So for example
OpenProtocol() (and the rest of that chapter) did not exist in EFI 1.0, but
HandleProtocol() did. So BY_HANDLE_PROTOCOL maps to the old EFI 1.0 no hot-plug
behavior.
So the library in the patch hides all this and converts it to:
SafeHandle = SafeBlockIoOpen (Handle, NULL);
...
Status = SafeBlockIoRead (SafeHandle, Lba, BufferSize, &Buffer);
....
SafeBlockIoClose (SafeHandle);
If you get EFI_NO_MAPPING you know a surprise hot-unplug happened and your
application can do the right thing.
Thanks,
Andrew Fish
/**
Locates the installed BlockIo protocol instance for the handle. Usage
information
is registered in the protocol data base.
@param UserHandle The handle to obtain the protocol interface on
@param StopEvent Event that is signaled if the protocol is
stopped
@retval A pointer to the library handle that represents the opened protocol
or NULL on failure.
**/
SAFE_BLOCK_IO_HANDLE *
EFIAPI
SafeBlockIoOpen (
IN EFI_HANDLE UserHandle,
IN EFI_EVENT StopEvent OPTIONAL
);
/**
Read BufferSize bytes from Lba into Buffer.
@param Entry The library handle returned from SafeBlockIoOpen()
@param Lba The starting Logical Block Address to read from
@param BufferSize Size of Buffer, must be a multiple of device block size.
@param Buffer A pointer to the destination buffer for the data. The
caller is
responsible for either having implicit or explicit
ownership of the buffer.
@retval EFI_SUCCESS The data was read correctly from the device.
@retval EFI_DEVICE_ERROR The device reported an error while performing
the read.
@retval EFI_NO_MEDIA There is no media in the device.
@retval EFI_MEDIA_CHANGED The MediaId does not matched the current device.
@retval EFI_BAD_BUFFER_SIZE The Buffer was not a multiple of the block size
of the device.
@retval EFI_INVALID_PARAMETER The read request contains LBAs that are not
valid,
or the buffer is not on proper alignment.
@retval EFI_NO_MAPPING Protocol is no longer availible
**/
EFI_STATUS
EFIAPI
SafeBlockIoRead (
IN SAFE_BLOCK_IO_HANDLE *Entry,
IN EFI_LBA Lba,
IN UINTN BufferSize,
OUT VOID *Buffer
);
EFI_STATUS
EFIAPI
SafeBlockIoClose (
IN SAFE_BLOCK_IO_HANDLE *Entry
);
> On Tue, Feb 12, 2013 at 12:19 PM, Andrew Fish <[email protected]> wrote:
>>
>> On Feb 12, 2013, at 10:48 AM, David F. <[email protected]> wrote:
>>
>>> I mean the device itself may be removed, USB hard drive, 1394, etc..
>>> I presume it would still be safe and attempts to access it would
>>> simply fail?
>>>
>>
>> The bus driver (USB Bus Driver for example) does a
>> gBS->DisconnectController() and causes the Block IO driver to stop. Stop
>> means uninstall your protocols. This works fine for the EFI driver model as
>> the leaf gets stopped first. So the file system driver first, then the
>> partition driver, and then the Block IO driver get stopped. The problem we
>> run into is the EFI application may do a HandleProtocol() and in this case
>> it will not be notified when the stack gets torn down.
>>
>> In my other mail where I attached a patch, there was a library that wraps
>> Block IO and makes it safe to use by following the driver model. Basically
>> you just call library functions and if you application is in the middle of a
>> block IO call you fail the stop. This library implements the BY_DRIVER
>> attribute of OpenProtocol() and produces a driver binding protocol instance
>> so a surprise removal request can be detected or deferred.
>>
>> This model is a side effect of some of the other rules we have. For example
>> device paths must be unique, only one instance of a protocol per handle, and
>> how the DXE core tracks all the drivers and their parent child relationships.
>>
>> Thanks,
>>
>> Andrew Fish
>>
>>> On Tue, Feb 12, 2013 at 8:44 AM, Andrew Fish <[email protected]> wrote:
>>>> What do you mean by device being removed? Media being removed from a
>>>> device is a different case than unplugging an USB disk.
>>>>
>>>> Andrew Fish
>>>>
>>>>
>>>> On Feb 11, 2013, at 7:38 PM, "David F." <[email protected]> wrote:
>>>>
>>>>> Hi,
>>>>>
>>>>> I'd like to open the DISK_IO protocol and leave it open for quite a
>>>>> while (hours). In the mean time the device may be removed. I would
>>>>> assume that I can continue to try using the protocol to read/write and
>>>>> there would simply be a failure (as long as its detached - if
>>>>> something else in its place may fail due to media-id difference, but
>>>>> that is understood). Once I close the protocol, then the item is
>>>>> cleaned up.
>>>>>
>>>>> Is the assumption good?
>>>>>
>>>>> TIA!!
>>>>>
>>>>> ------------------------------------------------------------------------------
>>>>> Free Next-Gen Firewall Hardware Offer
>>>>> Buy your Sophos next-gen firewall before the end March 2013
>>>>> and get the hardware for free! Learn more.
>>>>> http://p.sf.net/sfu/sophos-d2d-feb
>>>>> _______________________________________________
>>>>> edk2-devel mailing list
>>>>> [email protected]
>>>>> https://lists.sourceforge.net/lists/listinfo/edk2-devel
>>>>
>>>>
>>>> ------------------------------------------------------------------------------
>>>> Free Next-Gen Firewall Hardware Offer
>>>> Buy your Sophos next-gen firewall before the end March 2013
>>>> and get the hardware for free! Learn more.
>>>> http://p.sf.net/sfu/sophos-d2d-feb
>>>> _______________________________________________
>>>> edk2-devel mailing list
>>>> [email protected]
>>>> https://lists.sourceforge.net/lists/listinfo/edk2-devel
>>>
>>> ------------------------------------------------------------------------------
>>> Free Next-Gen Firewall Hardware Offer
>>> Buy your Sophos next-gen firewall before the end March 2013
>>> and get the hardware for free! Learn more.
>>> http://p.sf.net/sfu/sophos-d2d-feb
>>> _______________________________________________
>>> edk2-devel mailing list
>>> [email protected]
>>> https://lists.sourceforge.net/lists/listinfo/edk2-devel
>>
>>
>> ------------------------------------------------------------------------------
>> Free Next-Gen Firewall Hardware Offer
>> Buy your Sophos next-gen firewall before the end March 2013
>> and get the hardware for free! Learn more.
>> http://p.sf.net/sfu/sophos-d2d-feb
>> _______________________________________________
>> edk2-devel mailing list
>> [email protected]
>> https://lists.sourceforge.net/lists/listinfo/edk2-devel
>
> ------------------------------------------------------------------------------
> Free Next-Gen Firewall Hardware Offer
> Buy your Sophos next-gen firewall before the end March 2013
> and get the hardware for free! Learn more.
> http://p.sf.net/sfu/sophos-d2d-feb
> _______________________________________________
> edk2-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/edk2-devel
------------------------------------------------------------------------------
Free Next-Gen Firewall Hardware Offer
Buy your Sophos next-gen firewall before the end March 2013
and get the hardware for free! Learn more.
http://p.sf.net/sfu/sophos-d2d-feb
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-devel