From nobody Sat Feb 7 07:10:17 2026 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.zohomail.com; dkim=fail; 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 15052938473631017.05790460195; Wed, 13 Sep 2017 02:10:47 -0700 (PDT) Received: from localhost ([::1]:41076 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ds3h0-0006KQ-HT for importer@patchew.org; Wed, 13 Sep 2017 05:10:46 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34146) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ds3cT-0001d2-Jv for qemu-devel@nongnu.org; Wed, 13 Sep 2017 05:06:11 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ds3cQ-0007Zp-Bz for qemu-devel@nongnu.org; Wed, 13 Sep 2017 05:06:05 -0400 Received: from mail-vk0-x241.google.com ([2607:f8b0:400c:c05::241]:37927) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1ds3cQ-0007ZZ-73 for qemu-devel@nongnu.org; Wed, 13 Sep 2017 05:06:02 -0400 Received: by mail-vk0-x241.google.com with SMTP id o22so3314276vke.5 for ; Wed, 13 Sep 2017 02:06:02 -0700 (PDT) Received: from localhost.localdomain ([190.66.154.128]) by smtp.gmail.com with ESMTPSA id r74sm2677601vkf.19.2017.09.13.02.06.00 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 13 Sep 2017 02:06:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=KJt+yXyDCs+mmD+C9i/So0UQSaJMwhL06MIIrpsXejc=; b=Ct5Fs14fm/y5xI9pcMAycVRJRxxIu+H4f5zDr7bOLue+XgNbz4Zd90+ov9zxD4FFTm f2wv6lZRaOMQXgzy/FiMOSfSJxp+xhQ7FSY0ctTsEKbKZOqnNGTK+6Qi5Wx6mNxbRZTH xESo1h0vTcPQAX/J9Ym2+o+0S8FTrM1FCeBZygOMVU0LbO/Z5bA21ZfmArfHzGIQoHGD YrpvhHdJcsSbpug7n72pk+sqyvbihZDu9E0FMq1y7PgBuOdb5llhnoTAdoQFPdOEumlJ I0hslUDiW1kgqZws4W8J9ag/N5KxyrnaDEGo+x2hjxsZd/lX93AEXKwhbbRe15Lg4djN 5Xtg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=KJt+yXyDCs+mmD+C9i/So0UQSaJMwhL06MIIrpsXejc=; b=ME6Sr5VCq75TzqiUt/xxnOMe2ZELh0v++OiuDZhZPEGH8/mfiAA+BFzS+CIYIgai5U maKGOsKhsF80nwHr7ScR6sR7WWnWAb370dMqqZGSmSDaiH240VXyXwRN9YoQySEAQXKM 66/g7jmXQ6wGmZaLt0bGi1v7+IzZmetKqcGBq8nuPlHuAIZ3MKR9aNzjUVn6T9vJi7+8 fmoEL5/np94VKIHp4ARUedXHot6FJtQw5lWQVgBkVw9AlWSQkNEHU0KgPA5PT9a7Lb3E 67+ZOfunsJhWhmVPTYSMXHgiD/Qyc8t5ZAz9h5KwRnG3xwOQep7pWjQo7l0OZy/+mE57 3PWA== X-Gm-Message-State: AHPjjUjOQI5yWElJjxqp8BYbrSsT2Pd1HooRLwNF7Qr9D9hPtsPvyosA Mn2XPIYo5wqjONLr X-Google-Smtp-Source: AOwi7QA8VS2N2uuiNTraPae7d4GolyCTkYISPmpHBUwVqKUFJcYF0zbeqcu6W8pL7gc0So+zWVbTVQ== X-Received: by 10.31.14.203 with SMTP id 194mr12753682vko.77.1505293561495; Wed, 13 Sep 2017 02:06:01 -0700 (PDT) From: Sergio Andres Gomez Del Real X-Google-Original-From: Sergio Andres Gomez Del Real To: qemu-devel@nongnu.org Date: Wed, 13 Sep 2017 04:05:20 -0500 Message-Id: <20170913090522.4022-13-Sergio.G.DelReal@gmail.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170913090522.4022-1-Sergio.G.DelReal@gmail.com> References: <20170913090522.4022-1-Sergio.G.DelReal@gmail.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400c:c05::241 Subject: [Qemu-devel] [PATCH v4 12/14] hvf: implement vga dirty page tracking 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: Sergio Andres Gomez Del Real , pbonzini@redhat.com, stefanha@gmail.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This patch implements setting the tracking of dirty vga pages, using hvf's interface to protect guest memory. It uses the MemoryListener callback mechanism through .log_start/stop/sync Signed-off-by: Sergio Andres Gomez Del Real --- include/sysemu/hvf.h | 5 ++++ target/i386/hvf-all.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++-= ---- 2 files changed, 72 insertions(+), 7 deletions(-) diff --git a/include/sysemu/hvf.h b/include/sysemu/hvf.h index 9230c13851..f54e043955 100644 --- a/include/sysemu/hvf.h +++ b/include/sysemu/hvf.h @@ -34,11 +34,16 @@ uint32_t hvf_get_supported_cpuid(uint32_t func, uint32_= t idx, #define hvf_get_supported_cpuid(func, idx, reg) 0 #endif =20 +/* hvf_slot flags */ +#define HVF_SLOT_LOG (1 << 0) + typedef struct hvf_slot { uint64_t start; uint64_t size; uint8_t *mem; int slot_id; + uint32_t flags; + MemoryRegion *region; } hvf_slot; =20 typedef struct hvf_vcpu_caps { diff --git a/target/i386/hvf-all.c b/target/i386/hvf-all.c index 97f4ded673..e8466e6f47 100644 --- a/target/i386/hvf-all.c +++ b/target/i386/hvf-all.c @@ -195,6 +195,7 @@ void hvf_set_phys_mem(MemoryRegionSection *section, boo= l add) mem->size =3D int128_get64(section->size); mem->mem =3D memory_region_get_ram_ptr(area) + section->offset_within_= region; mem->start =3D section->offset_within_address_space; + mem->region =3D area; =20 if (do_hvf_set_memory(mem)) { error_report("Error registering new memory slot\n"); @@ -291,8 +292,7 @@ void hvf_cpu_synchronize_post_init(CPUState *cpu_state) run_on_cpu(cpu_state, _hvf_cpu_synchronize_post_init, RUN_ON_CPU_NULL); } =20 -/* TODO: ept fault handlig */ -static bool ept_emulation_fault(uint64_t ept_qual) +static bool ept_emulation_fault(hvf_slot *slot, addr_t gpa, uint64_t ept_q= ual) { int read, write; =20 @@ -308,6 +308,14 @@ static bool ept_emulation_fault(uint64_t ept_qual) return false; } =20 + if (write && slot) { + if (slot->flags & HVF_SLOT_LOG) { + memory_region_set_dirty(slot->region, gpa - slot->start, 1); + hv_vm_protect((hv_gpaddr_t)slot->start, (size_t)slot->size, + HV_MEMORY_READ | HV_MEMORY_WRITE); + } + } + /* * The EPT violation must have been caused by accessing a * guest-physical address that is a translation of a guest-linear @@ -318,7 +326,59 @@ static bool ept_emulation_fault(uint64_t ept_qual) return false; } =20 - return true; + return !slot; +} + +static void hvf_set_dirty_tracking(MemoryRegionSection *section, bool on) +{ + struct mac_slot *macslot; + hvf_slot *slot; + + slot =3D hvf_find_overlap_slot( + section->offset_within_address_space, + section->offset_within_address_space + int128_get64(section->s= ize)); + + /* protect region against writes; begin tracking it */ + if (on) { + slot->flags |=3D HVF_SLOT_LOG; + hv_vm_protect((hv_gpaddr_t)slot->start, (size_t)slot->size, + HV_MEMORY_READ); + /* stop tracking region*/ + } else { + slot->flags &=3D ~HVF_SLOT_LOG; + hv_vm_protect((hv_gpaddr_t)slot->start, (size_t)slot->size, + HV_MEMORY_READ | HV_MEMORY_WRITE); + } +} + +static void hvf_log_start(MemoryListener *listener, + MemoryRegionSection *section, int old, int new) +{ + if (old !=3D 0) { + return; + } + + hvf_set_dirty_tracking(section, 1); +} + +static void hvf_log_stop(MemoryListener *listener, + MemoryRegionSection *section, int old, int new) +{ + if (new !=3D 0) { + return; + } + + hvf_set_dirty_tracking(section, 0); +} + +static void hvf_log_sync(MemoryListener *listener, + MemoryRegionSection *section) +{ + /* + * sync of dirty pages is handled elsewhere; just make sure we keep + * tracking the region. + */ + hvf_set_dirty_tracking(section, 1); } =20 static void hvf_region_add(MemoryListener *listener, @@ -337,6 +397,9 @@ static MemoryListener hvf_memory_listener =3D { .priority =3D 10, .region_add =3D hvf_region_add, .region_del =3D hvf_region_del, + .log_start =3D hvf_log_start, + .log_stop =3D hvf_log_stop, + .log_sync =3D hvf_log_sync, }; =20 void hvf_reset_vcpu(CPUState *cpu) { @@ -609,7 +672,7 @@ int hvf_vcpu_exec(CPUState *cpu) =20 slot =3D hvf_find_overlap_slot(gpa, gpa); /* mmio */ - if (ept_emulation_fault(exit_qual) && !slot) { + if (ept_emulation_fault(slot, gpa, exit_qual)) { struct x86_decode decode; =20 load_regs(cpu); @@ -620,9 +683,6 @@ int hvf_vcpu_exec(CPUState *cpu) store_regs(cpu); break; } -#ifdef DIRTY_VGA_TRACKING - /* TODO: handle dirty page tracking */ -#endif break; } case EXIT_REASON_INOUT: --=20 2.14.1