From patchwork Thu Apr 28 08:59:51 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Kiszka X-Patchwork-Id: 738741 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id p3S90JHW016769 for ; Thu, 28 Apr 2011 09:00:19 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757627Ab1D1JAI (ORCPT ); Thu, 28 Apr 2011 05:00:08 -0400 Received: from david.siemens.de ([192.35.17.14]:27000 "EHLO david.siemens.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757425Ab1D1JAF (ORCPT ); Thu, 28 Apr 2011 05:00:05 -0400 Received: from mail1.siemens.de (localhost [127.0.0.1]) by david.siemens.de (8.13.6/8.13.6) with ESMTP id p3S8xsCH025136; Thu, 28 Apr 2011 10:59:55 +0200 Received: from mchn199C.mchp.siemens.de ([139.25.109.49]) by mail1.siemens.de (8.13.6/8.13.6) with ESMTP id p3S8xspY021662; Thu, 28 Apr 2011 10:59:54 +0200 From: Jan Kiszka To: Avi Kivity , Marcelo Tosatti Cc: kvm@vger.kernel.org, Alex Williamson Subject: [PATCH 3/5] pci-assign: Fix dword read at PCI_COMMAND Date: Thu, 28 Apr 2011 10:59:51 +0200 Message-Id: <0fe595f76c6b3d72df01a575b26b754f6e411021.1303981185.git.jan.kiszka@siemens.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: References: In-Reply-To: References: Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter1.kernel.org [140.211.167.41]); Thu, 28 Apr 2011 09:00:20 +0000 (UTC) If we emulate the command register, we must only read its content from the shadow config space. For dword read of both PCI_COMMAND and PCI_STATUS, at least the latter must be read from the device. For simplicity reasons and as the code path is not considered performance critical for the affected SRIOV devices, the fix performes device access to the command word unconditionally, even if emulation is enabled and only that word is read. Signed-off-by: Jan Kiszka --- hw/device-assignment.c | 8 +++++--- 1 files changed, 5 insertions(+), 3 deletions(-) diff --git a/hw/device-assignment.c b/hw/device-assignment.c index f37f108..ee81434 100644 --- a/hw/device-assignment.c +++ b/hw/device-assignment.c @@ -482,14 +482,11 @@ static uint32_t assigned_dev_pci_read_config(PCIDevice *d, uint32_t address, /* * Catch access to * - vendor & device ID - * - command register (if emulation needed) * - base address registers * - ROM base address & capability pointer * - interrupt line & pin */ if (ranges_overlap(address, len, PCI_VENDOR_ID, 4) || - (pci_dev->need_emulate_cmd && - ranges_overlap(address, len, PCI_COMMAND, 2)) || ranges_overlap(address, len, PCI_BASE_ADDRESS_0, 24) || ranges_overlap(address, len, PCI_ROM_ADDRESS, 8) || ranges_overlap(address, len, PCI_INTERRUPT_LINE, 2)) { @@ -521,6 +518,11 @@ do_log: DEBUG("(%x.%x): address=%04x val=0x%08x len=%d\n", (d->devfn >> 3) & 0x1F, (d->devfn & 0x7), address, val, len); + if (pci_dev->need_emulate_cmd) { + val = merge_bits(val, pci_default_read_config(d, PCI_COMMAND, 2), + address, len, PCI_COMMAND, 0xffff); + } + if (!pci_dev->cap.available) { /* kill the special capabilities */ if (address == PCI_COMMAND && len == 4) {