From patchwork Mon Dec 13 23:25:38 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Kiszka X-Patchwork-Id: 407952 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 oBDNQ1l2015942 for ; Mon, 13 Dec 2010 23:26:01 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756619Ab0LMXZ7 (ORCPT ); Mon, 13 Dec 2010 18:25:59 -0500 Received: from fmmailgate01.web.de ([217.72.192.221]:43010 "EHLO fmmailgate01.web.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756423Ab0LMXZ5 (ORCPT ); Mon, 13 Dec 2010 18:25:57 -0500 Received: from smtp08.web.de ( [172.20.5.216]) by fmmailgate01.web.de (Postfix) with ESMTP id F3299181CF851; Tue, 14 Dec 2010 00:25:56 +0100 (CET) Received: from [109.41.109.52] (helo=localhost.localdomain) by smtp08.web.de with asmtp (TLSv1:AES256-SHA:256) (WEB.DE 4.110 #24) id 1PSHmG-0002er-00; Tue, 14 Dec 2010 00:25:56 +0100 From: Jan Kiszka To: Avi Kivity , Marcelo Tosatti Cc: kvm@vger.kernel.org, Alex Williamson , "Michael S. Tsirkin" , Jan Kiszka Subject: [PATCH 2/5] pci-assign: Fix dword read at PCI_COMMAND Date: Tue, 14 Dec 2010 00:25:38 +0100 Message-Id: <5c4909dd1796ece440be44c6c07a70dbed3887bd.1292282738.git.jan.kiszka@web.de> X-Mailer: git-send-email 1.7.1 In-Reply-To: References: In-Reply-To: References: X-Sender: jan.kiszka@web.de X-Provags-ID: V01U2FsdGVkX1+EBqBsF0tbJLAPO7NfTgEDo31Gl1nJSsADP2DK V1YyxVjkW8zSWNPrZTxlZb5q/u7oYt0oWz3b+XRqE33KgdXIiW 7/xY7G4FM= 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.3 (demeter1.kernel.org [140.211.167.41]); Mon, 13 Dec 2010 23:26:02 +0000 (UTC) diff --git a/hw/device-assignment.c b/hw/device-assignment.c index bc3a57b..6ff1456 100644 --- a/hw/device-assignment.c +++ b/hw/device-assignment.c @@ -494,14 +494,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)) { @@ -533,6 +530,17 @@ 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 && + ranges_overlap(address, len, PCI_COMMAND, 2)) { + if (address == PCI_COMMAND) { + val &= 0xffff0000; + val |= pci_default_read_config(d, PCI_COMMAND, 2); + } else { + /* high-byte access */ + val = pci_default_read_config(d, PCI_COMMAND+1, 1); + } + } + if (!pci_dev->cap.available) { /* kill the special capabilities */ if (address == PCI_COMMAND && len == 4) {