From patchwork Mon Aug 21 21:53:39 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Zhang, Xiong Y" X-Patchwork-Id: 9914213 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 23440603F9 for ; Tue, 22 Aug 2017 04:55:06 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2F0ED28747 for ; Tue, 22 Aug 2017 04:55:06 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2372B28764; Tue, 22 Aug 2017 04:55:06 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.7 required=2.0 tests=BAYES_00, DATE_IN_PAST_06_12, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id A7E2B28755 for ; Tue, 22 Aug 2017 04:55:05 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dk1AR-00087N-Um; Tue, 22 Aug 2017 04:51:55 +0000 Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dk1AQ-00087H-2z for xen-devel@lists.xenproject.org; Tue, 22 Aug 2017 04:51:54 +0000 Received: from [85.158.137.68] by server-3.bemta-3.messagelabs.com id 0A/4E-01987-968BB995; Tue, 22 Aug 2017 04:51:53 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrMLMWRWlGSWpSXmKPExsXS1tYhopuxY3a kQcsuHYvvWyYzOTB6HP5whSWAMYo1My8pvyKBNePFNY+CqyIVy1e9ZWpg/MfXxcjJISQwjVGi bR43iC0hwCtxZNkMVgg7QGLFtEesEDVVEj0vdjGD2GwC2hJr/55iA7FFBJQk7q2azARiMwtES lyd0gVmCwtESDT8nQ5mswioSrT8uMcIYvMKuEk8fvyLBWK+nMTNc53MExi5FzAyrGJUL04tKk st0jXSSyrKTM8oyU3MzNE1NDDWy00tLk5MT81JTCrWS87P3cQI9Gw9AwPjDsZTzc6HGCU5mJR EeTekzooU4kvKT6nMSCzOiC8qzUktPsQow8GhJMGrtH12pJBgUWp6akVaZg4wxGDSEhw8SiK8 3NuA0rzFBYm5xZnpEKlTjIpS4rxXQRICIImM0jy4NlhYX2KUlRLmZWRgYBDiKUgtys0sQZV/x SjOwagkzPsPZApPZl4J3PRXQIuZgBYbtk4DWVySiJCSamDs/5BccmIX39enTS4FRfrPEkoeKj Vq8e+sPtNpUJGykEVy2W6FzTeULZ4tFMhPDDbd1XI+0fxMT7BV/QnlH5emzHU6vsxPMvbYIZE 5/2OUjmoGfF94c87u1a+v1hxd5uvyJ6AoIEbvrtS11a5/Lkqzb/y7Myg2hW1FQDrvUZ95qofK 9/SoRgorsRRnJBpqMRcVJwIARSgG22YCAAA= X-Env-Sender: xiong.y.zhang@intel.com X-Msg-Ref: server-14.tower-31.messagelabs.com!1503377510!110824416!1 X-Originating-IP: [134.134.136.20] X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: VHJ1c3RlZCBJUDogMTM0LjEzNC4xMzYuMjAgPT4gMzU1MzU4\n X-StarScan-Received: X-StarScan-Version: 9.4.45; banners=-,-,- X-VirusChecked: Checked Received: (qmail 10193 invoked from network); 22 Aug 2017 04:51:52 -0000 Received: from mga02.intel.com (HELO mga02.intel.com) (134.134.136.20) by server-14.tower-31.messagelabs.com with DHE-RSA-AES256-GCM-SHA384 encrypted SMTP; 22 Aug 2017 04:51:52 -0000 Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga101.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 21 Aug 2017 21:51:48 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos; i="5.41,410,1498546800"; d="scan'208"; a="1006256044" Received: from test-kbl.bj.intel.com ([10.238.158.145]) by orsmga003.jf.intel.com with ESMTP; 21 Aug 2017 21:51:47 -0700 From: Xiong Zhang To: xen-devel@lists.xenproject.org Date: Tue, 22 Aug 2017 05:53:39 +0800 Message-Id: <1503352419-2851-1-git-send-email-xiong.y.zhang@intel.com> X-Mailer: git-send-email 2.7.4 Cc: Xiong Zhang , andrew.cooper3@citrix.com, JBeulich@suse.com Subject: [Xen-devel] [PATCH] tools/hvmloader: Use base instead of pci_mem_start for find_next_rmrr() X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP find_next_rmrr(base) is used to find the lowest RMRR ending above base but below 4G. Current method couldn't cover the following situation: a. two rmrr exist, small gap between them b. pci_mem_start and mem_resource.base is below the first rmrr.base c. find_next_rmrr(pci_mem_start) will find the first rmrr d. After aligning mem_resource.base to bar size, first_rmrr.end < new_base < second_rmrr.base and new_base + bar_sz > second_rmrr.base. So the new bar will overlap with the second rmrr and don't overlap with the first rmrr. But the next_rmrr point to the first rmrr, then check_overlap() couldn't find the overlap. Finally assign a wrong bar address to bar. This patch using aligned new base to find the next rmrr, could fix the above case and find all the overlapped rmrr with new base. Signed-off-by: Xiong Zhang --- tools/firmware/hvmloader/pci.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/tools/firmware/hvmloader/pci.c b/tools/firmware/hvmloader/pci.c index f4288a3..16fccbf 100644 --- a/tools/firmware/hvmloader/pci.c +++ b/tools/firmware/hvmloader/pci.c @@ -405,8 +405,6 @@ void pci_setup(void) io_resource.base = 0xc000; io_resource.max = 0x10000; - next_rmrr = find_next_rmrr(pci_mem_start); - /* Assign iomem and ioport resources in descending order of size. */ for ( i = 0; i < nr_bars; i++ ) { @@ -464,15 +462,19 @@ void pci_setup(void) base = (resource->base + bar_sz - 1) & ~(uint64_t)(bar_sz - 1); /* If we're using mem_resource, check for RMRR conflicts. */ - while ( resource == &mem_resource && - next_rmrr >= 0 && - check_overlap(base, bar_sz, - memory_map.map[next_rmrr].addr, - memory_map.map[next_rmrr].size) ) + if ( resource == &mem_resource) { - base = memory_map.map[next_rmrr].addr + memory_map.map[next_rmrr].size; - base = (base + bar_sz - 1) & ~(bar_sz - 1); next_rmrr = find_next_rmrr(base); + while ( next_rmrr >= 0 && + check_overlap(base, bar_sz, + memory_map.map[next_rmrr].addr, + memory_map.map[next_rmrr].size) ) + { + base = memory_map.map[next_rmrr].addr + + memory_map.map[next_rmrr].size; + base = (base + bar_sz - 1) & ~(bar_sz - 1); + next_rmrr = find_next_rmrr(base); + } } bar_data |= (uint32_t)base;