[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 12/21] hax: Fix memory mapping de-duplication logic
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PULL 12/21] hax: Fix memory mapping de-duplication logic |
Date: |
Fri, 5 May 2017 12:13:28 +0200 |
From: Yu Ning <address@hidden>
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 <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Paolo Bonzini <address@hidden>
---
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 2884040021..af090343f3 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,
uint32_t size,
uint64_t host_va, uint8_t flags)
{
uint64_t end_pa = start_pa + size;
- uint32_t chunk_sz;
HAXMapping *entry, *next;
QTAILQ_FOREACH_SAFE(entry, &mappings, entry, next) {
+ uint32_t chunk_sz;
if (start_pa >= entry->start_pa + entry->size) {
continue;
}
@@ -121,7 +121,16 @@ static void hax_update_mapping(uint64_t start_pa, uint32_t
size,
start_pa += chunk_sz;
host_va += chunk_sz;
size -= chunk_sz;
+ } else if (start_pa > entry->start_pa) {
+ /* split the existing chunk at start_pa */
+ chunk_sz = start_pa - entry->start_pa;
+ hax_insert_mapping_before(entry, entry->start_pa, chunk_sz,
+ entry->host_va, entry->flags);
+ entry->start_pa += chunk_sz;
+ entry->host_va += chunk_sz;
+ entry->size -= chunk_sz;
}
+ /* now start_pa == entry->start_pa */
chunk_sz = MIN(size, entry->size);
if (chunk_sz) {
bool nop = hax_mapping_is_opposite(entry, host_va, flags);
@@ -165,8 +174,14 @@ static void hax_process_section(MemoryRegionSection
*section, uint8_t flags)
unsigned int delta;
uint64_t host_va;
- /* 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" PRIx64
+ "->0x%016" PRIx64 "\n", __func__, start_pa,
+ start_pa + size);
+ }
return;
}
--
2.12.2
- [Qemu-devel] [PULL 03/21] char: Fix removing wrong GSource that be found by fd_in_tag, (continued)
- [Qemu-devel] [PULL 03/21] char: Fix removing wrong GSource that be found by fd_in_tag, Paolo Bonzini, 2017/05/05
- [Qemu-devel] [PULL 05/21] use _Static_assert in QEMU_BUILD_BUG_ON, Paolo Bonzini, 2017/05/05
- [Qemu-devel] [PULL 01/21] hw/i386: Use Rev3 FADT (ACPI 2.0) instead of Rev1 to improve guest OS support., Paolo Bonzini, 2017/05/05
- [Qemu-devel] [PULL 04/21] target/i386: Add GDB XML register description support, Paolo Bonzini, 2017/05/05
- [Qemu-devel] [PULL 06/21] vl: deprecate the "-hdachs" option, Paolo Bonzini, 2017/05/05
- [Qemu-devel] [PULL 07/21] scsi: avoid an off-by-one error in megasas_mmio_write, Paolo Bonzini, 2017/05/05
- [Qemu-devel] [PULL 10/21] trace: add qemu mutex lock and unlock trace events, Paolo Bonzini, 2017/05/05
- [Qemu-devel] [PULL 11/21] checkpatch: Disallow glib asserts in main code, Paolo Bonzini, 2017/05/05
- [Qemu-devel] [PULL 13/21] dump: Acquire BQL around vm_start() in dump thread, Paolo Bonzini, 2017/05/05
- [Qemu-devel] [PULL 08/21] sgabios: update for "fix wrong video attrs for int 10h, ah==13h", Paolo Bonzini, 2017/05/05
- [Qemu-devel] [PULL 12/21] hax: Fix memory mapping de-duplication logic,
Paolo Bonzini <=
- [Qemu-devel] [PULL 09/21] vmw_pvscsi: check message ring page count at initialisation, Paolo Bonzini, 2017/05/05
- [Qemu-devel] [PULL 14/21] Fix the -accel parameter and the documentation for 'hax', Paolo Bonzini, 2017/05/05
- [Qemu-devel] [PULL 15/21] MAINTAINERS: Add "R:" tag for self-appointed reviewers, Paolo Bonzini, 2017/05/05
- [Qemu-devel] [PULL 16/21] get_maintainer: Teach get_maintainer.pl about the new "R:" tag, Paolo Bonzini, 2017/05/05
- [Qemu-devel] [PULL 19/21] get_maintainer: add subsystem to reviewer output, Paolo Bonzini, 2017/05/05
- [Qemu-devel] [PULL 17/21] get_maintainer: it's '--pattern-depth', not '-pattern-depth', Paolo Bonzini, 2017/05/05
- [Qemu-devel] [PULL 20/21] libvhost-user: replace vasprintf() to fix build, Paolo Bonzini, 2017/05/05
- [Qemu-devel] [PULL 18/21] get_maintainer: --r (list reviewer) is on by default, Paolo Bonzini, 2017/05/05
- [Qemu-devel] [PULL 21/21] vhost-scsi: create a vhost-scsi-common abstraction, Paolo Bonzini, 2017/05/05