From nobody Mon May 6 19:37:34 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1493364643223189.58315738371869; Fri, 28 Apr 2017 00:30:43 -0700 (PDT) Received: from localhost ([::1]:35585 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d40MT-0002eH-Iy for importer@patchew.org; Fri, 28 Apr 2017 03:30:41 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53065) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d40LY-00026U-To for qemu-devel@nongnu.org; Fri, 28 Apr 2017 03:29:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d40LU-0003x6-VR for qemu-devel@nongnu.org; Fri, 28 Apr 2017 03:29:44 -0400 Received: from mga07.intel.com ([134.134.136.100]:56787) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1d40LU-0003uO-Mb for qemu-devel@nongnu.org; Fri, 28 Apr 2017 03:29:40 -0400 Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga105.jf.intel.com with ESMTP; 28 Apr 2017 00:29:38 -0700 Received: from otcsdk-dev2.bj.intel.com ([10.238.158.186]) by FMSMGA003.fm.intel.com with ESMTP; 28 Apr 2017 00:29:26 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.37,387,1488873600"; d="scan'208";a="850733953" From: Yu Ning To: qemu-devel@nongnu.org Date: Fri, 28 Apr 2017 15:27:23 +0800 Message-Id: <20170428072723.7036-1-yu.ning@linux.intel.com> X-Mailer: git-send-email 2.9.3 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 134.134.136.100 Subject: [Qemu-devel] [PATCH] hax: Fix memory mapping de-duplication logic X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Yu Ning , vpalatin@chromium.org, ehabkost@redhat.com, sw@weilnetz.de, pbonzini@redhat.com, rth@twiddle.net Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" hax_update_mapping() avoids unnecessary and potentially expensive calls to HAX_VM_IOCTL_SET_RAM by computing the net result (i.e. effective mapping changes) of each MemoryRegion transaction, with the help of a linked list of HAXMapping objects. However, when processing a new mapping that overlaps with an existing mapping in the list, it fails to handle the case where the start address of the new mapping is above that of the existing mapping in the guest physical address space. This happens when QEMU is launched with "-machine q35 -enable-hax", which involves the following MemoryRegion transaction for digging the VGA hole: region_del: 0x00000000->0x08000000 VA 05fa0000 ('pc.ram') region_add: 0x00000000->0x000a0000 VA 05fa0000 ('pc.ram') region_add: 0x000a0000->0x000c0000 VA 00000000 ('vga-lowmem') region_add: 0x000c0000->0x08000000 VA 06060000 ('pc.ram') where the third MemoryRegion is MMIO and is ignored. The current de-duplication logic handles the last MemoryRegion incorrectly and produces the following result: hax_mapping_dump_list updates: + 0x000c0000->0x08000000 VA 0x06060000 - 0x07fe0000->0x08000000 VA 0x0df80000 which is why VGA emulation does not work for Q35. With this patch, one can see VGA output as Q35 boots up. Note that Q35 support also requires a change to HAXM kernel module, which is not available in the current HAXM release (6.1.2). + Add a warning if the input MemoryRegion is a ROM device, which is not supported by HAXM kernel module at this time. Signed-off-by: Yu Ning --- target/i386/hax-mem.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/target/i386/hax-mem.c b/target/i386/hax-mem.c index 2884040..af09034 100644 --- a/target/i386/hax-mem.c +++ b/target/i386/hax-mem.c @@ -106,10 +106,10 @@ static void hax_update_mapping(uint64_t start_pa, uin= t32_t size, uint64_t host_va, uint8_t flags) { uint64_t end_pa =3D start_pa + size; - uint32_t chunk_sz; HAXMapping *entry, *next; =20 QTAILQ_FOREACH_SAFE(entry, &mappings, entry, next) { + uint32_t chunk_sz; if (start_pa >=3D entry->start_pa + entry->size) { continue; } @@ -121,7 +121,16 @@ static void hax_update_mapping(uint64_t start_pa, uint= 32_t size, start_pa +=3D chunk_sz; host_va +=3D chunk_sz; size -=3D chunk_sz; + } else if (start_pa > entry->start_pa) { + /* split the existing chunk at start_pa */ + chunk_sz =3D start_pa - entry->start_pa; + hax_insert_mapping_before(entry, entry->start_pa, chunk_sz, + entry->host_va, entry->flags); + entry->start_pa +=3D chunk_sz; + entry->host_va +=3D chunk_sz; + entry->size -=3D chunk_sz; } + /* now start_pa =3D=3D entry->start_pa */ chunk_sz =3D MIN(size, entry->size); if (chunk_sz) { bool nop =3D hax_mapping_is_opposite(entry, host_va, flags); @@ -165,8 +174,14 @@ static void hax_process_section(MemoryRegionSection *s= ection, uint8_t flags) unsigned int delta; uint64_t host_va; =20 - /* We only care about RAM pages */ + /* We only care about RAM and ROM regions */ if (!memory_region_is_ram(mr)) { + if (memory_region_is_romd(mr)) { + /* HAXM kernel module does not support ROMD yet */ + fprintf(stderr, "%s: Warning: Ignoring ROMD region 0x%016" PRI= x64 + "->0x%016" PRIx64 "\n", __func__, start_pa, + start_pa + size); + } return; } =20 --=20 2.9.3