X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=OvmfPkg%2FVirtioBlkDxe%2FVirtioBlk.c;h=b2bfcdf7b72aecb2c66613b77933bc8c8aee772c;hb=16e0ece611a3f1bc82855c6c52957e22533d8257;hp=44a05cfb5f8be21a546ed48deb95605fed21ea95;hpb=e371e7e545b266ce4ae8ff76da6c98616214599f;p=mirror_edk2.git diff --git a/OvmfPkg/VirtioBlkDxe/VirtioBlk.c b/OvmfPkg/VirtioBlkDxe/VirtioBlk.c index 44a05cfb5f..b2bfcdf7b7 100644 --- a/OvmfPkg/VirtioBlkDxe/VirtioBlk.c +++ b/OvmfPkg/VirtioBlkDxe/VirtioBlk.c @@ -11,6 +11,7 @@ synchronous requests and EFI_BLOCK_IO_PROTOCOL for now. Copyright (C) 2012, Red Hat, Inc. + Copyright (c) 2012, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this @@ -271,7 +272,7 @@ SynchronousRequest ( (BufferSize == 0 ? VIRTIO_BLK_T_FLUSH : VIRTIO_BLK_T_OUT) : VIRTIO_BLK_T_IN; Request.IoPrio = 0; - Request.Sector = Lba * (BlockSize / 512); + Request.Sector = MultU64x32(Lba, BlockSize / 512); VirtioPrepare (&Dev->Ring, &Indices); @@ -664,7 +665,7 @@ VirtioBlkInit ( goto Failed; } if (BlockSize == 0 || BlockSize % 512 != 0 || - NumSectors % (BlockSize / 512) != 0) { + ModU64x32 (NumSectors, BlockSize / 512) != 0) { // // We can only handle a logical block consisting of whole sectors, // and only a disk composed of whole logical blocks. @@ -747,7 +748,8 @@ VirtioBlkInit ( Dev->BlockIoMedia.WriteCaching = !!(Features & VIRTIO_BLK_F_FLUSH); Dev->BlockIoMedia.BlockSize = BlockSize; Dev->BlockIoMedia.IoAlign = 0; - Dev->BlockIoMedia.LastBlock = NumSectors / (BlockSize / 512) - 1; + Dev->BlockIoMedia.LastBlock = DivU64x32 (NumSectors, + BlockSize / 512) - 1; return EFI_SUCCESS; ReleaseQueue: @@ -942,18 +944,32 @@ VirtioBlkDriverBindingStop ( IN EFI_HANDLE *ChildHandleBuffer ) { - VBLK_DEV *Dev; - EFI_STATUS Status; + EFI_STATUS Status; + EFI_BLOCK_IO_PROTOCOL *BlockIo; + VBLK_DEV *Dev; - Dev = VIRTIO_BLK_FROM_BLOCK_IO (This); + Status = gBS->OpenProtocol ( + DeviceHandle, // candidate device + &gEfiBlockIoProtocolGuid, // retrieve the BlockIo iface + (VOID **)&BlockIo, // target pointer + This->DriverBindingHandle, // requestor driver identity + DeviceHandle, // requesting lookup for dev. + EFI_OPEN_PROTOCOL_GET_PROTOCOL // lookup only, no ref. added + ); + if (EFI_ERROR (Status)) { + return Status; + } + + Dev = VIRTIO_BLK_FROM_BLOCK_IO (BlockIo); // - // If DriverBindingStop() is called with the driver instance still in use, - // or any of the parameters are invalid, we've caught a bug. + // Handle Stop() requests for in-use driver instances gracefully. // Status = gBS->UninstallProtocolInterface (DeviceHandle, &gEfiBlockIoProtocolGuid, &Dev->BlockIo); - ASSERT (Status == EFI_SUCCESS); + if (EFI_ERROR (Status)) { + return Status; + } VirtioBlkUninit (Dev); @@ -997,13 +1013,13 @@ STATIC EFI_DRIVER_BINDING_PROTOCOL gDriverBinding = { // for unambiguous identification. // -STATIC GLOBAL_REMOVE_IF_UNREFERENCED +STATIC EFI_UNICODE_STRING_TABLE mDriverNameTable[] = { { "eng;en", L"Virtio Block Driver" }, { NULL, NULL } }; -STATIC GLOBAL_REMOVE_IF_UNREFERENCED +STATIC EFI_COMPONENT_NAME_PROTOCOL gComponentName; EFI_STATUS @@ -1036,14 +1052,14 @@ VirtioBlkGetDeviceName ( return EFI_UNSUPPORTED; } -STATIC GLOBAL_REMOVE_IF_UNREFERENCED +STATIC EFI_COMPONENT_NAME_PROTOCOL gComponentName = { &VirtioBlkGetDriverName, &VirtioBlkGetDeviceName, "eng" // SupportedLanguages, ISO 639-2 language codes }; -STATIC GLOBAL_REMOVE_IF_UNREFERENCED +STATIC EFI_COMPONENT_NAME2_PROTOCOL gComponentName2 = { (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) &VirtioBlkGetDriverName, (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) &VirtioBlkGetDeviceName,