From mboxrd@z Thu Jan 1 00:00:00 1970 From: NISHIGUCHI Naoki Subject: [PATCH] ioemu: pass-through: pt_bar_mapping fix Date: Wed, 09 Jul 2008 15:46:15 +0900 Message-ID: <48745EB7.2080704@jp.fujitsu.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------050908020505090801020805" Return-path: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org This is a multi-part message in MIME format. --------------050908020505090801020805 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit Hi, In pt_bar_mapping function, r->addr should not be changed by invalid value(-1). This value(-1) causes failure of mapping BAR when I/O Space or Memory Space enable bit is updated repeatedly by native windows driver. This situation occurs in Windows Vista guest. Attached patch fixes this problem. Signed-off-by: Naoki Nishiguchi Regards, Naoki Nishiguchi --------------050908020505090801020805 Content-Type: text/x-patch; name="fix_pt_bar_mapping.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="fix_pt_bar_mapping.patch" diff -r bd97e45e073a tools/ioemu/hw/pass-through.c --- a/tools/ioemu/hw/pass-through.c Tue Jul 08 09:28:50 2008 +0100 +++ b/tools/ioemu/hw/pass-through.c Wed Jul 09 15:36:14 2008 +0900 @@ -1519,7 +1519,7 @@ static void pt_bar_mapping(struct pt_dev PCIDevice *dev = (PCIDevice *)&ptdev->dev; PCIIORegion *r; struct pt_region *base = NULL; - uint32_t r_size = 0; + uint32_t r_size = 0, r_addr = -1; int ret = 0; int i; @@ -1537,30 +1537,33 @@ static void pt_bar_mapping(struct pt_dev (base->bar_flag == PT_BAR_FLAG_UPPER)) continue; + /* copy region address to temporary */ + r_addr = r->addr; + /* clear region address in case I/O Space or Memory Space disable */ if (((base->bar_flag == PT_BAR_FLAG_IO) && !io_enable ) || ((base->bar_flag == PT_BAR_FLAG_MEM) && !mem_enable )) - r->addr = -1; + r_addr = -1; /* prevent guest software mapping memory resource to 00000000h */ - if ((base->bar_flag == PT_BAR_FLAG_MEM) && (r->addr == 0)) - r->addr = -1; + if ((base->bar_flag == PT_BAR_FLAG_MEM) && (r_addr == 0)) + r_addr = -1; /* align resource size (memory type only) */ r_size = r->size; PT_GET_EMUL_SIZE(base->bar_flag, r_size); /* check overlapped address */ - ret = pt_chk_bar_overlap(dev->bus, dev->devfn, r->addr, r_size); + ret = pt_chk_bar_overlap(dev->bus, dev->devfn, r_addr, r_size); if (ret > 0) PT_LOG("Base Address[%d] is overlapped. " - "[Address:%08xh][Size:%04xh]\n", i, r->addr, r_size); + "[Address:%08xh][Size:%04xh]\n", i, r_addr, r_size); /* check whether we need to update the mapping or not */ - if (r->addr != ptdev->bases[i].e_physbase) + if (r_addr != ptdev->bases[i].e_physbase) { /* mapping BAR */ - r->map_func((PCIDevice *)ptdev, i, r->addr, + r->map_func((PCIDevice *)ptdev, i, r_addr, r_size, r->type); } } --------------050908020505090801020805 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel --------------050908020505090801020805--