From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Anthony PERARD <anthony.perard@citrix.com>
Cc: EDK2 devel <edk2-devel@lists.sourceforge.net>,
Xen Devel <xen-devel@lists.xen.org>
Subject: Re: [PATCH v2 18/18] OvmfPkg/XenPvBlkDxe: Add BlockIo.
Date: Fri, 12 Sep 2014 10:57:53 -0400 [thread overview]
Message-ID: <20140912145753.GD14467@laptop.dumpdata.com> (raw)
In-Reply-To: <1409849473-9268-19-git-send-email-anthony.perard@citrix.com>
On Thu, Sep 04, 2014 at 05:51:13PM +0100, Anthony PERARD wrote:
> Install the BlockIo protocol.
Implement. Perhaps point out that the blkif.h is a good literature
to understand it?
>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
>
> ---
> Change in V2:
> - Remove blockIo2 headers.
> - Fix few comment.
> - file header, copyright
> - Rewrite few comment and error messages
> - No more callback
> - Improving block read/write, increase to the max size in one request
> (instead of only 8pages)
> - Fix lastblock when it's a cdrom
> - Do uninitialisation when fail to install fail
> - few comment
> - Licenses
> ---
> OvmfPkg/XenPvBlkDxe/BlockIo.c | 292 ++++++++++++++++++++++++++++++++++++
> OvmfPkg/XenPvBlkDxe/BlockIo.h | 124 +++++++++++++++
> OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.c | 64 ++++++++
> OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.h | 1 +
> OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.inf | 2 +
> 5 files changed, 483 insertions(+)
> create mode 100644 OvmfPkg/XenPvBlkDxe/BlockIo.c
> create mode 100644 OvmfPkg/XenPvBlkDxe/BlockIo.h
>
> diff --git a/OvmfPkg/XenPvBlkDxe/BlockIo.c b/OvmfPkg/XenPvBlkDxe/BlockIo.c
> new file mode 100644
> index 0000000..f08339b
> --- /dev/null
> +++ b/OvmfPkg/XenPvBlkDxe/BlockIo.c
> @@ -0,0 +1,292 @@
> +/** @file
> + BlockIo implementation for Xen PV Block driver.
> +
> + This file is implementing the interface between the actual driver in
> + BlockFront.c to the BlockIo protocol.
> +
> + Copyright (C) 2014, Citrix Ltd.
> +
> + Redistribution and use in source and binary forms, with or without
> + modification, are permitted provided that the following conditions
> + are met:
> +
> + * Redistributions of source code must retain the above copyright
> + notice, this list of conditions and the following disclaimer.
> + * Redistributions in binary form must reproduce the above copyright
> + notice, this list of conditions and the following disclaimer in
> + the documentation and/or other materials provided with the
> + distribution.
> +
> + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
> + FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
> + COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
> + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
> + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
> + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
> + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
> + ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
> + POSSIBILITY OF SUCH DAMAGE.
> +
> +**/
> +
> +#include "XenPvBlkDxe.h"
> +
> +#include "BlockFront.h"
> +
> +///
> +/// Block I/O Media structure
> +///
> +GLOBAL_REMOVE_IF_UNREFERENCED
> +EFI_BLOCK_IO_MEDIA gXenPvBlkDxeBlockIoMedia = {
> + 0, // MediaId
> + FALSE, // RemovableMedia
> + FALSE, // MediaPresent
> + FALSE, // LogicalPartition
> + TRUE, // ReadOnly
> + FALSE, // WriteCaching
> + 512, // BlockSize
> + 512, // IoAlign, BlockFront does not support less than 512 bits-aligned.
> + 0, // LastBlock
> + 0, // LowestAlignedLba
> + 0, // LogicalBlocksPerPhysicalBlock
> + 0 // OptimalTransferLengthGranularity
> +};
> +
> +///
> +/// Block I/O Protocol instance
> +///
> +GLOBAL_REMOVE_IF_UNREFERENCED
> +EFI_BLOCK_IO_PROTOCOL gXenPvBlkDxeBlockIo = {
> + EFI_BLOCK_IO_PROTOCOL_REVISION3, // Revision
> + &gXenPvBlkDxeBlockIoMedia, // Media
> + XenPvBlkDxeBlockIoReset, // Reset
> + XenPvBlkDxeBlockIoReadBlocks, // ReadBlocks
> + XenPvBlkDxeBlockIoWriteBlocks, // WriteBlocks
> + XenPvBlkDxeBlockIoFlushBlocks // FlushBlocks
> +};
> +
> +
> +
> +
> +/**
> + Read/Write BufferSize bytes from Lba into Buffer.
> +
> + This function is commun to XenPvBlkDxeBlockIoReadBlocks and
> + XenPvBlkDxeBlockIoWriteBlocks.
> +
> + @param This Indicates a pointer to the calling context.
> + @param MediaId Id of the media, changes every time the media is replaced.
> + @param Lba The starting Logical Block Address to read from/write to.
> + @param BufferSize Size of Buffer, must be a multiple of device block size.
> + @param Buffer A pointer to the destination/source buffer for the data.
> + @param IsWrite Indicate if the operation is write or read.
> +
> + @return See description of XenPvBlkDxeBlockIoReadBlocks and
> + XenPvBlkDxeBlockIoWriteBlocks.
> +**/
> +STATIC
> +EFI_STATUS
> +XenPvBlkDxeBlockIoReadWriteBlocks (
> + IN EFI_BLOCK_IO_PROTOCOL *This,
> + IN UINT32 MediaId,
> + IN EFI_LBA Lba,
> + IN UINTN BufferSize,
> + IN OUT VOID *Buffer,
> + IN BOOLEAN IsWrite
> + )
> +{
> + XEN_BLOCK_FRONT_IO IoData;
> + EFI_BLOCK_IO_MEDIA *Media;
> + UINTN NextOffset;
> + EFI_STATUS Status;
> +
> + if (Buffer == NULL) {
> + return EFI_INVALID_PARAMETER;
> + }
> + if (BufferSize == 0) {
> + return EFI_SUCCESS;
> + }
> +
> + Media = This->Media;
> +
> + if (BufferSize % Media->BlockSize != 0) {
> + DEBUG ((EFI_D_ERROR, "XenPvBlkDxe: Bad buffer size: 0x%X\n", BufferSize));
> + return EFI_BAD_BUFFER_SIZE;
> + }
> +
> + if (Lba > Media->LastBlock ||
> + (BufferSize / Media->BlockSize) - 1 > Media->LastBlock - Lba) {
> + DEBUG ((EFI_D_ERROR, "XenPvBlkDxe: %a with invalid LBA: 0x%LX, size: 0x%x\n",
> + IsWrite ? "Write" : "Read", Lba, BufferSize));
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + if (IsWrite && Media->ReadOnly) {
> + return EFI_WRITE_PROTECTED;
> + }
> +
> + if ((Media->IoAlign > 1) && (UINTN)Buffer & (Media->IoAlign - 1)) {
> + //
> + // Grub2 does not appear to respect IoAlign of 512, so reallocate the
> + // buffer here.
> + //
> + VOID *NewBuffer;
> +
> + //
> + // Try again with a properly aligned buffer.
> + //
> + NewBuffer = AllocateAlignedPages((BufferSize + EFI_PAGE_SIZE) / EFI_PAGE_SIZE,
> + Media->IoAlign);
> + if (!IsWrite) {
> + Status = XenPvBlkDxeBlockIoReadBlocks (This, MediaId,
> + Lba, BufferSize, NewBuffer);
> + CopyMem (Buffer, NewBuffer, BufferSize);
> + } else {
> + CopyMem (NewBuffer, Buffer, BufferSize);
> + Status = XenPvBlkDxeBlockIoWriteBlocks (This, MediaId,
> + Lba, BufferSize, NewBuffer);
> + }
> + FreeAlignedPages (NewBuffer, (BufferSize + EFI_PAGE_SIZE) / EFI_PAGE_SIZE);
> + return Status;
> + }
> +
> + IoData.Dev = XEN_BLOCK_FRONT_FROM_BLOCK_IO (This);
> + NextOffset = Lba * Media->BlockSize;
Perhaps instead of calling it 'Offset' could it be Sector? SAy 'NextSector' ?
[edit: Just ditch this]
> +
> + while (BufferSize > 0) {
> + if (((UINTN)Buffer & EFI_PAGE_MASK) == 0) {
> + IoData.Size = MIN (BLKIF_MAX_SEGMENTS_PER_REQUEST * EFI_PAGE_SIZE,
> + BufferSize);
> + } else {
> + IoData.Size = MIN ((BLKIF_MAX_SEGMENTS_PER_REQUEST - 1) * EFI_PAGE_SIZE,
> + BufferSize);
> + }
> +
> + IoData.Buffer = Buffer;
> + IoData.Offset = NextOffset;
And this would be 'IoData.Lba = NextSector' or perhaps to make obvious:
IoData.Lba = Lba * Media->BlockSize;
Thought why even bother with the multiplication of BlockSize when you are going to
divide it in the XenPvBlockIo again? Perhaps just do
IoData.Lba = Lba;
[edit: Use that]
And modify the 'Lba' value ?
> + BufferSize -= IoData.Size;
> + Buffer = (VOID*) ((UINTN) Buffer + IoData.Size);
> + NextOffset += IoData.Size;
So this would be 'Lba += IoData.Size'
That would make this easier - and you can ditch the NextOffset altogther?
[edit: And Dev.Lba would have the LBA value instead of the odd 'Offset' thing]
> + Status = XenPvBlockIo (&IoData, IsWrite);
> + if (EFI_ERROR (Status)) {
> + DEBUG ((EFI_D_ERROR, "XenPvBlkDxe: Error durring %a operation.\n",
> + IsWrite ? "write" : "read"));
> + return Status;
> + }
> + }
> + return EFI_SUCCESS;
> +}
> +
> +
> +/**
> + Read BufferSize bytes from Lba into Buffer.
> +
> + @param This Indicates a pointer to the calling context.
> + @param MediaId Id of the media, changes every time the media is replaced.
> + @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.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +XenPvBlkDxeBlockIoReadBlocks (
> + IN EFI_BLOCK_IO_PROTOCOL *This,
> + IN UINT32 MediaId,
> + IN EFI_LBA Lba,
> + IN UINTN BufferSize,
> + OUT VOID *Buffer
> + )
> +{
> + return XenPvBlkDxeBlockIoReadWriteBlocks (This,
> + MediaId, Lba, BufferSize, Buffer, FALSE);
> +}
> +
> +/**
> + Write BufferSize bytes from Lba into Buffer.
> +
> + @param This Indicates a pointer to the calling context.
> + @param MediaId The media ID that the write request is for.
> + @param Lba The starting logical block address to be written. The caller is
> + responsible for writing to only legitimate locations.
> + @param BufferSize Size of Buffer, must be a multiple of device block size.
> + @param Buffer A pointer to the source buffer for the data.
> +
> + @retval EFI_SUCCESS The data was written correctly to the device.
> + @retval EFI_WRITE_PROTECTED The device can not be written to.
> + @retval EFI_DEVICE_ERROR The device reported an error while performing the write.
> + @retval EFI_NO_MEDIA There is no media in the device.
> + @retval EFI_MEDIA_CHNAGED 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 write request contains LBAs that are not valid,
> + or the buffer is not on proper alignment.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +XenPvBlkDxeBlockIoWriteBlocks (
> + IN EFI_BLOCK_IO_PROTOCOL *This,
> + IN UINT32 MediaId,
> + IN EFI_LBA Lba,
> + IN UINTN BufferSize,
> + IN VOID *Buffer
> + )
> +{
> + return XenPvBlkDxeBlockIoReadWriteBlocks (This,
> + MediaId, Lba, BufferSize, Buffer, TRUE);
> +}
> +
> +/**
> + Flush the Block Device.
> +
> + @param This Indicates a pointer to the calling context.
> +
> + @retval EFI_SUCCESS All outstanding data was written to the device
> + @retval EFI_DEVICE_ERROR The device reported an error while writting back the data
> + @retval EFI_NO_MEDIA There is no media in the device.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +XenPvBlkDxeBlockIoFlushBlocks (
> + IN EFI_BLOCK_IO_PROTOCOL *This
> + )
> +{
> + XenPvBlockSync (XEN_BLOCK_FRONT_FROM_BLOCK_IO (This));
> + return EFI_SUCCESS;
> +}
> +
> +/**
> + Reset the block device hardware.
> +
> + @param[in] This Indicates a pointer to the calling context.
> + @param[in] ExtendedVerification Not used.
> +
> + @retval EFI_SUCCESS The device was reset.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +XenPvBlkDxeBlockIoReset (
> + IN EFI_BLOCK_IO_PROTOCOL *This,
> + IN BOOLEAN ExtendedVerification
> + )
> +{
> + //
> + // Since the initialization of the devices is done, then the device is
> + // working correctly.
> + //
> + return EFI_SUCCESS;
> +}
> diff --git a/OvmfPkg/XenPvBlkDxe/BlockIo.h b/OvmfPkg/XenPvBlkDxe/BlockIo.h
> new file mode 100644
> index 0000000..22b6de2
> --- /dev/null
> +++ b/OvmfPkg/XenPvBlkDxe/BlockIo.h
> @@ -0,0 +1,124 @@
> +/** @file
> + BlockIo function declaration for Xen PV block driver.
> +
> + Copyright (C) 2014, Citrix Ltd.
> +
> + Redistribution and use in source and binary forms, with or without
> + modification, are permitted provided that the following conditions
> + are met:
> +
> + * Redistributions of source code must retain the above copyright
> + notice, this list of conditions and the following disclaimer.
> + * Redistributions in binary form must reproduce the above copyright
> + notice, this list of conditions and the following disclaimer in
> + the documentation and/or other materials provided with the
> + distribution.
> +
> + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
> + FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
> + COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
> + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
> + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
> + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
> + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
> + ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
> + POSSIBILITY OF SUCH DAMAGE.
> +
> +**/
> +
> +/**
> + Read BufferSize bytes from Lba into Buffer.
The caller has to ensure that the XenPvBlkDxeBlockIoFlushBlocks or
Reset are not called when this is executing.
> +
> + @param This Indicates a pointer to the calling context.
> + @param MediaId Id of the media, changes every time the media is replaced.
> + @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.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +XenPvBlkDxeBlockIoReadBlocks (
> + IN EFI_BLOCK_IO_PROTOCOL *This,
> + IN UINT32 MediaId,
> + IN EFI_LBA Lba,
> + IN UINTN BufferSize,
> + OUT VOID *Buffer
> + );
> +
> +/**
> + Write BufferSize bytes from Lba into Buffer.
The caller has to ensure that the XenPvBlkDxeBlockIoFlushBlocks or
Reset are not called when this is executing.
> +
> + @param This Indicates a pointer to the calling context.
> + @param MediaId The media ID that the write request is for.
> + @param Lba The starting logical block address to be written. The caller is
> + responsible for writing to only legitimate locations.
> + @param BufferSize Size of Buffer, must be a multiple of device block size.
> + @param Buffer A pointer to the source buffer for the data.
> +
> + @retval EFI_SUCCESS The data was written correctly to the device.
> + @retval EFI_WRITE_PROTECTED The device can not be written to.
> + @retval EFI_DEVICE_ERROR The device reported an error while performing the write.
> + @retval EFI_NO_MEDIA There is no media in the device.
> + @retval EFI_MEDIA_CHNAGED 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 write request contains LBAs that are not valid,
> + or the buffer is not on proper alignment.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +XenPvBlkDxeBlockIoWriteBlocks (
> + IN EFI_BLOCK_IO_PROTOCOL *This,
> + IN UINT32 MediaId,
> + IN EFI_LBA Lba,
> + IN UINTN BufferSize,
> + IN VOID *Buffer
> + );
> +
> +/**
> + Flush the Block Device.
The caller has to ensure that there are no other calls to read/write to the
device when this is executued.
> +
> + @param This Indicates a pointer to the calling context.
> +
> + @retval EFI_SUCCESS All outstanding data was written to the device
> + @retval EFI_DEVICE_ERROR The device reported an error while writting back the data
> + @retval EFI_NO_MEDIA There is no media in the device.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +XenPvBlkDxeBlockIoFlushBlocks (
> + IN EFI_BLOCK_IO_PROTOCOL *This
> + );
> +
> +/**
> + Reset the block device hardware.
Ditto.
> +
> + @param[in] This Indicates a pointer to the calling context.
> + @param[in] ExtendedVerification Not used.
> +
> + @retval EFI_SUCCESS The device was reset.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +XenPvBlkDxeBlockIoReset (
> + IN EFI_BLOCK_IO_PROTOCOL *This,
> + IN BOOLEAN ExtendedVerification
> + );
> +
> +extern EFI_BLOCK_IO_MEDIA gXenPvBlkDxeBlockIoMedia;
> +extern EFI_BLOCK_IO_PROTOCOL gXenPvBlkDxeBlockIo;
> diff --git a/OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.c b/OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.c
> index 930333f..d530600 100644
> --- a/OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.c
> +++ b/OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.c
> @@ -281,6 +281,7 @@ XenPvBlkDxeDriverBindingStart (
> EFI_STATUS Status;
> XENBUS_PROTOCOL *XenBusIo;
> XEN_BLOCK_FRONT_DEVICE *Dev;
> + EFI_BLOCK_IO_MEDIA *Media;
>
> Status = gBS->OpenProtocol (
> ControllerHandle,
> @@ -299,8 +300,44 @@ XenPvBlkDxeDriverBindingStart (
> goto CloseProtocol;
> }
>
> + CopyMem (&Dev->BlockIo, &gXenPvBlkDxeBlockIo, sizeof (EFI_BLOCK_IO_PROTOCOL));
> + Media = AllocateCopyPool (sizeof (EFI_BLOCK_IO_MEDIA),
> + &gXenPvBlkDxeBlockIoMedia);
> + if (Dev->MediaInfo.VDiskInfo & VDISK_REMOVABLE) {
> + Media->RemovableMedia = TRUE;
> + }
> + Media->MediaPresent = TRUE;
> + Media->ReadOnly = !Dev->MediaInfo.ReadWrite;
> + if (Dev->MediaInfo.CdRom) {
> + //
> + // If it's a cdrom, the blocksize value need to be 2048 for OVMF to
> + // recognize it as a cdrom:
> + // MdeModulePkg/Universal/Disk/PartitionDxe/ElTorito.c
> + //
> + Media->BlockSize = 2048;
> + Media->LastBlock = DivU64x32 (Dev->MediaInfo.Sectors,
> + Media->BlockSize / Dev->MediaInfo.SectorSize) - 1;
> + } else {
> + Media->BlockSize = Dev->MediaInfo.SectorSize;
> + Media->LastBlock = Dev->MediaInfo.Sectors - 1;
> + }
> + Dev->BlockIo.Media = Media;
> +
> + Status = gBS->InstallMultipleProtocolInterfaces (
> + &ControllerHandle,
> + &gEfiBlockIoProtocolGuid, &Dev->BlockIo,
> + NULL
> + );
> + if (EFI_ERROR (Status)) {
> + DEBUG ((EFI_D_ERROR, "XenPvBlk: install protocol fail: %r\n", Status));
> + goto UninitBlockFront;
> + }
> +
> return EFI_SUCCESS;
>
> +UninitBlockFront:
> + FreePool (Media);
> + XenPvBlockFrontShutdown (Dev);
> CloseProtocol:
> gBS->CloseProtocol (ControllerHandle, &gXenBusProtocolGuid,
> This->DriverBindingHandle, ControllerHandle);
> @@ -342,6 +379,33 @@ XenPvBlkDxeDriverBindingStop (
> IN EFI_HANDLE *ChildHandleBuffer OPTIONAL
> )
> {
> + EFI_BLOCK_IO_PROTOCOL *BlockIo;
> + XEN_BLOCK_FRONT_DEVICE *Dev;
> + EFI_BLOCK_IO_MEDIA *Media;
> + EFI_STATUS Status;
> +
> + Status = gBS->OpenProtocol (
> + ControllerHandle, &gEfiBlockIoProtocolGuid,
> + (VOID **)&BlockIo,
> + This->DriverBindingHandle, ControllerHandle,
> + EFI_OPEN_PROTOCOL_GET_PROTOCOL
> + );
> + if (EFI_ERROR (Status)) {
> + return Status;
> + }
> +
> + Status = gBS->UninstallProtocolInterface (ControllerHandle,
> + &gEfiBlockIoProtocolGuid, BlockIo);
> + if (EFI_ERROR (Status)) {
> + return Status;
> + }
> +
> + Media = BlockIo->Media;
> + Dev = XEN_BLOCK_FRONT_FROM_BLOCK_IO (BlockIo);
> + XenPvBlockFrontShutdown (Dev);
> +
> + FreePool (Media);
> +
> gBS->CloseProtocol (ControllerHandle, &gXenBusProtocolGuid,
> This->DriverBindingHandle, ControllerHandle);
>
> diff --git a/OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.h b/OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.h
> index 14c65b2..420e751 100644
> --- a/OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.h
> +++ b/OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.h
> @@ -93,6 +93,7 @@ extern EFI_COMPONENT_NAME_PROTOCOL gXenPvBlkDxeComponentName;
> //
> #include "DriverBinding.h"
> #include "ComponentName.h"
> +#include "BlockIo.h"
>
>
> #endif
> diff --git a/OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.inf b/OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.inf
> index 619ed8f..b7c4a1f 100644
> --- a/OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.inf
> +++ b/OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.inf
> @@ -52,6 +52,8 @@
> ComponentName.h
> BlockFront.c
> BlockFront.h
> + BlockIo.c
> + BlockIo.h
>
>
> [LibraryClasses]
> --
> Anthony PERARD
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xen.org
> http://lists.xen.org/xen-devel
next prev parent reply other threads:[~2014-09-12 14:57 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <1409849473-9268-1-git-send-email-anthony.perard@citrix.com>
2014-09-04 16:50 ` [PATCH v2 01/18] OvmfPkg: Add public headers from Xen Project Anthony PERARD
2014-09-04 16:50 ` [PATCH v2 02/18] OvmfPkg: Add basic skeleton for the XenBus bus driver Anthony PERARD
2014-09-04 16:50 ` [PATCH v2 03/18] OvmfPkg/XenBusDxe: Add device state struct and create an ExitBoot services event Anthony PERARD
2014-09-04 16:50 ` [PATCH v2 04/18] OvmfPkg/XenBusDxe: Add support to make Xen Hypercalls Anthony PERARD
2014-09-04 16:51 ` [PATCH v2 05/18] OvmfPkg/XenBusDxe: Open PciIo protocol Anthony PERARD
2014-09-04 16:51 ` [PATCH v2 06/18] OvmfPkg: Introduce XenBus Protocol Anthony PERARD
2014-09-04 16:51 ` [PATCH v2 07/18] OvmfPkg/XenBusDxe: Add InterlockedCompareExchange16 Anthony PERARD
2014-09-04 16:51 ` [PATCH v2 08/18] OvmfPkg/XenBusDxe: Add Grant Table functions Anthony PERARD
2014-09-04 16:51 ` [PATCH v2 09/18] OvmfPkg/XenBusDxe: Add Event Channel Notify Anthony PERARD
2014-09-04 16:51 ` [PATCH v2 10/18] OvmfPkg/XenBusDxe: Add TestAndClearBit Anthony PERARD
2014-09-04 16:51 ` [PATCH v2 11/18] OvmfPkg/XenBusDxe: Add XenStore client implementation Anthony PERARD
2014-09-04 16:51 ` [PATCH v2 12/18] OvmfPkg/XenBusDxe: Add an helper AsciiStrDup Anthony PERARD
2014-09-04 16:51 ` [PATCH v2 13/18] OvmfPkg/XenBusDxe: Add XenStore function into the XenBus protocol Anthony PERARD
2014-09-04 16:51 ` [PATCH v2 14/18] OvmfPkg/XenBusDxe: Indroduce XenBus support itself Anthony PERARD
2014-09-04 16:51 ` [PATCH v2 15/18] OvmfPkg/XenBusDxe: Add Event Channel into XenBus protocol Anthony PERARD
2014-09-04 16:51 ` [PATCH v2 16/18] OvmfPkg/XenPvBlkDxe: Xen PV Block device, initial skeleton Anthony PERARD
2014-09-04 16:51 ` [PATCH v2 17/18] OvmfPkg/XenPvBlkDxe: Add BlockFront client Anthony PERARD
2014-09-04 16:51 ` [PATCH v2 18/18] OvmfPkg/XenPvBlkDxe: Add BlockIo Anthony PERARD
2014-09-04 18:01 ` [edk2] [PATCH v2 00/18] Introducing Xen PV block driver to OVMF Laszlo Ersek
[not found] ` <5408A8E3.2020805@redhat.com>
2014-09-05 13:34 ` Anthony PERARD
[not found] ` <20140905133440.GB1654@perard.uk.xensource.com>
2014-09-05 19:30 ` Jordan Justen
2014-09-05 21:14 ` Laszlo Ersek
[not found] ` <CAFe8ug86UtwYQY-1P5wp6tQ_2Yi2fwgNU7+knHV0JH4SDz07jQ@mail.gmail.com>
2014-09-08 15:36 ` Anthony PERARD
[not found] ` <1409849473-9268-2-git-send-email-anthony.perard@citrix.com>
2014-09-10 19:43 ` [PATCH v2 01/18] OvmfPkg: Add public headers from Xen Project Konrad Rzeszutek Wilk
[not found] ` <1409849473-9268-3-git-send-email-anthony.perard@citrix.com>
2014-09-10 19:49 ` [PATCH v2 02/18] OvmfPkg: Add basic skeleton for the XenBus bus driver Konrad Rzeszutek Wilk
[not found] ` <1409849473-9268-4-git-send-email-anthony.perard@citrix.com>
2014-09-10 19:58 ` [PATCH v2 03/18] OvmfPkg/XenBusDxe: Add device state struct and create an ExitBoot services event Konrad Rzeszutek Wilk
2014-09-18 10:33 ` Anthony PERARD
[not found] ` <1409849473-9268-5-git-send-email-anthony.perard@citrix.com>
2014-09-10 20:01 ` [PATCH v2 04/18] OvmfPkg/XenBusDxe: Add support to make Xen Hypercalls Konrad Rzeszutek Wilk
[not found] ` <1409849473-9268-6-git-send-email-anthony.perard@citrix.com>
2014-09-10 20:03 ` [PATCH v2 05/18] OvmfPkg/XenBusDxe: Open PciIo protocol Konrad Rzeszutek Wilk
[not found] ` <1409849473-9268-7-git-send-email-anthony.perard@citrix.com>
2014-09-10 20:05 ` [PATCH v2 06/18] OvmfPkg: Introduce XenBus Protocol Konrad Rzeszutek Wilk
[not found] ` <1409849473-9268-8-git-send-email-anthony.perard@citrix.com>
2014-09-10 20:09 ` [PATCH v2 07/18] OvmfPkg/XenBusDxe: Add InterlockedCompareExchange16 Konrad Rzeszutek Wilk
2014-09-18 10:55 ` Anthony PERARD
[not found] ` <1409849473-9268-9-git-send-email-anthony.perard@citrix.com>
2014-09-10 20:12 ` [PATCH v2 08/18] OvmfPkg/XenBusDxe: Add Grant Table functions Konrad Rzeszutek Wilk
[not found] ` <1409849473-9268-10-git-send-email-anthony.perard@citrix.com>
2014-09-10 20:15 ` [PATCH v2 09/18] OvmfPkg/XenBusDxe: Add Event Channel Notify Konrad Rzeszutek Wilk
2014-09-18 10:56 ` Anthony PERARD
[not found] ` <1409849473-9268-11-git-send-email-anthony.perard@citrix.com>
2014-09-10 20:18 ` [PATCH v2 10/18] OvmfPkg/XenBusDxe: Add TestAndClearBit Konrad Rzeszutek Wilk
[not found] ` <1409849473-9268-12-git-send-email-anthony.perard@citrix.com>
2014-09-10 20:48 ` [PATCH v2 11/18] OvmfPkg/XenBusDxe: Add XenStore client implementation Konrad Rzeszutek Wilk
2014-09-18 11:10 ` Anthony PERARD
[not found] ` <1409849473-9268-13-git-send-email-anthony.perard@citrix.com>
2014-09-10 20:50 ` [PATCH v2 12/18] OvmfPkg/XenBusDxe: Add an helper AsciiStrDup Konrad Rzeszutek Wilk
[not found] ` <1409849473-9268-14-git-send-email-anthony.perard@citrix.com>
2014-09-10 20:54 ` [PATCH v2 13/18] OvmfPkg/XenBusDxe: Add XenStore function into the XenBus protocol Konrad Rzeszutek Wilk
[not found] ` <1409849473-9268-15-git-send-email-anthony.perard@citrix.com>
2014-09-11 17:10 ` [PATCH v2 14/18] OvmfPkg/XenBusDxe: Indroduce XenBus support itself Konrad Rzeszutek Wilk
2014-09-18 11:26 ` Anthony PERARD
[not found] ` <1409849473-9268-16-git-send-email-anthony.perard@citrix.com>
2014-09-12 13:58 ` [PATCH v2 15/18] OvmfPkg/XenBusDxe: Add Event Channel into XenBus protocol Konrad Rzeszutek Wilk
2014-09-18 11:28 ` Anthony PERARD
[not found] ` <1409849473-9268-17-git-send-email-anthony.perard@citrix.com>
2014-09-12 14:03 ` [PATCH v2 16/18] OvmfPkg/XenPvBlkDxe: Xen PV Block device, initial skeleton Konrad Rzeszutek Wilk
2014-09-18 11:31 ` Anthony PERARD
[not found] ` <1409849473-9268-18-git-send-email-anthony.perard@citrix.com>
2014-09-12 14:47 ` [PATCH v2 17/18] OvmfPkg/XenPvBlkDxe: Add BlockFront client Konrad Rzeszutek Wilk
2014-09-18 11:53 ` Anthony PERARD
[not found] ` <1409849473-9268-19-git-send-email-anthony.perard@citrix.com>
2014-09-12 14:57 ` Konrad Rzeszutek Wilk [this message]
2014-09-18 15:00 ` [PATCH v2 18/18] OvmfPkg/XenPvBlkDxe: Add BlockIo Anthony PERARD
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140912145753.GD14467@laptop.dumpdata.com \
--to=konrad.wilk@oracle.com \
--cc=anthony.perard@citrix.com \
--cc=edk2-devel@lists.sourceforge.net \
--cc=xen-devel@lists.xen.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).