From nobody Sun Feb 8 18:47:51 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1646228465718719.8747324637262; Wed, 2 Mar 2022 05:41:05 -0800 (PST) Received: from localhost ([::1]:54910 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nPPE0-0000ZQ-I0 for importer@patchew.org; Wed, 02 Mar 2022 08:41:04 -0500 Received: from eggs.gnu.org ([209.51.188.92]:47836) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nPO47-00017F-Ju for qemu-devel@nongnu.org; Wed, 02 Mar 2022 07:26:47 -0500 Received: from [2607:f8b0:4864:20::635] (port=42833 helo=mail-pl1-x635.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nPO45-0000e1-63 for qemu-devel@nongnu.org; Wed, 02 Mar 2022 07:26:47 -0500 Received: by mail-pl1-x635.google.com with SMTP id p17so1412228plo.9 for ; Wed, 02 Mar 2022 04:26:44 -0800 (PST) Received: from localhost.localdomain (2001-b011-e000-59d7-a02b-4f1b-c415-11a0.dynamic-ip6.hinet.net. [2001:b011:e000:59d7:a02b:4f1b:c415:11a0]) by smtp.gmail.com with ESMTPSA id mu1-20020a17090b388100b001bedddf2000sm4912971pjb.14.2022.03.02.04.26.41 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Wed, 02 Mar 2022 04:26:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=XTRZpcX8yriwglYSRcjxYmIcll43aiYpHGHO2GnCCJQ=; b=FZeyPNl4ERr2n+2RtsxlmbgQxgHATIhdD0ywxo7Zg1GVSaKzMhuFqUxnEpOjx0T2pu GPCscqTwV66pm5CMYA7XCk/2zIjREV6NACi0b7k3A4WCyaORbYzAwpKcEO05ZGoTYbZH iiTkbT+DFYKjieb+nPLXTUQXmuNB/eW9BzcXLMrqh0ayoDi65979eqI2djptPUGgbbus mPfZxSIn+AHJ4mC5OpR5BeIjs2/HnVC1AvFThj9HcTCY1EtSWKhNRmhqPoXFpVpi+Fkv /ynfDdGgv4Sn4H7TLVshO38n8BWmRShkEderr2nPZJxCfaXdGT04AIqmAD25lTZshaXm 5IZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=XTRZpcX8yriwglYSRcjxYmIcll43aiYpHGHO2GnCCJQ=; b=6i76hmG2nV7Sy382FLI8632fZ4JgRR2Jq1jZOrCIbpM0Yp94Ur5lkN70EadFrX3Ooh Prr1hmfEYWLRNNGpYc1bFPQWDPMsPfoyFzZ/KqMS/zDq3U3kh9tBPGz1KnKoYJlBI0tz 2iKyI9lDFJGoffSGVKgfH+dCzBzJg3Wqot/cZMsCMjpPHeIJfcE90TFqehLsoxIwLi9J o/RVf5bt3qeC0XsTu5WZKIdmHLQ2jqEIPjZpTd8dznrhWjFmlVxfIrAk4Nq5x2Gh5QqV mvW0ymJmnw/y8pT2D83JwcVm3+xyfOLyhk/ZIwESKmW6uDuE2n9lODAlJvt9oLkKK53h zi1g== X-Gm-Message-State: AOAM531OX5AoEsfg/jKlvKYzqSHUyAWqWfST8a3QiV7RlVZ4w7ckle7B TDx3xE5yQWJVqbUZkY3WcmxlE21QfHXQKA== X-Google-Smtp-Source: ABdhPJxYZV+TPlTWiolglJXWoLDKMUrkCtKHx1j7t/8vocu8G4YdYhgd4szxi+e4QN+gPkOh1UOVdg== X-Received: by 2002:a17:902:ea0c:b0:151:5a16:4f56 with SMTP id s12-20020a170902ea0c00b001515a164f56mr18545911plg.1.1646224003393; Wed, 02 Mar 2022 04:26:43 -0800 (PST) From: Yan-Jie Wang To: qemu-devel@nongnu.org Subject: [PATCH v2 1/9] hvf: move memory related functions from hvf-accel-ops.c to hvf-mem.c Date: Wed, 2 Mar 2022 20:26:03 +0800 Message-Id: <20220302122611.15237-2-ubzeme@gmail.com> X-Mailer: git-send-email 2.32.0 (Apple Git-132) In-Reply-To: <20220302122611.15237-1-ubzeme@gmail.com> References: <20220302122611.15237-1-ubzeme@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2607:f8b0:4864:20::635 (failed) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::635; envelope-from=ubzeme@gmail.com; helo=mail-pl1-x635.google.com X-Spam_score_int: -6 X-Spam_score: -0.7 X-Spam_bar: / X-Spam_report: (-0.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Peter Maydell , Roman Bolshakov , Alexander Graf , Cameron Esfahani , Yan-Jie Wang Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1646228467392100001 Content-Type: text/plain; charset="utf-8" Signed-off-by: Yan-Jie Wang --- accel/hvf/hvf-accel-ops.c | 220 +-------------------------------- accel/hvf/hvf-mem.c | 252 ++++++++++++++++++++++++++++++++++++++ accel/hvf/meson.build | 1 + include/sysemu/hvf_int.h | 2 + 4 files changed, 256 insertions(+), 219 deletions(-) create mode 100644 accel/hvf/hvf-mem.c diff --git a/accel/hvf/hvf-accel-ops.c b/accel/hvf/hvf-accel-ops.c index 54457c76c2..50a563bfe0 100644 --- a/accel/hvf/hvf-accel-ops.c +++ b/accel/hvf/hvf-accel-ops.c @@ -48,7 +48,6 @@ */ =20 #include "qemu/osdep.h" -#include "qemu/error-report.h" #include "qemu/main-loop.h" #include "exec/address-spaces.h" #include "exec/exec-all.h" @@ -64,143 +63,6 @@ HVFState *hvf_state; #define HV_VM_DEFAULT NULL #endif =20 -/* Memory slots */ - -hvf_slot *hvf_find_overlap_slot(uint64_t start, uint64_t size) -{ - hvf_slot *slot; - int x; - for (x =3D 0; x < hvf_state->num_slots; ++x) { - slot =3D &hvf_state->slots[x]; - if (slot->size && start < (slot->start + slot->size) && - (start + size) > slot->start) { - return slot; - } - } - return NULL; -} - -struct mac_slot { - int present; - uint64_t size; - uint64_t gpa_start; - uint64_t gva; -}; - -struct mac_slot mac_slots[32]; - -static int do_hvf_set_memory(hvf_slot *slot, hv_memory_flags_t flags) -{ - struct mac_slot *macslot; - hv_return_t ret; - - macslot =3D &mac_slots[slot->slot_id]; - - if (macslot->present) { - if (macslot->size !=3D slot->size) { - macslot->present =3D 0; - ret =3D hv_vm_unmap(macslot->gpa_start, macslot->size); - assert_hvf_ok(ret); - } - } - - if (!slot->size) { - return 0; - } - - macslot->present =3D 1; - macslot->gpa_start =3D slot->start; - macslot->size =3D slot->size; - ret =3D hv_vm_map(slot->mem, slot->start, slot->size, flags); - assert_hvf_ok(ret); - return 0; -} - -static void hvf_set_phys_mem(MemoryRegionSection *section, bool add) -{ - hvf_slot *mem; - MemoryRegion *area =3D section->mr; - bool writeable =3D !area->readonly && !area->rom_device; - hv_memory_flags_t flags; - uint64_t page_size =3D qemu_real_host_page_size; - - if (!memory_region_is_ram(area)) { - if (writeable) { - return; - } else if (!memory_region_is_romd(area)) { - /* - * If the memory device is not in romd_mode, then we actually = want - * to remove the hvf memory slot so all accesses will trap. - */ - add =3D false; - } - } - - if (!QEMU_IS_ALIGNED(int128_get64(section->size), page_size) || - !QEMU_IS_ALIGNED(section->offset_within_address_space, page_size))= { - /* Not page aligned, so we can not map as RAM */ - add =3D false; - } - - mem =3D hvf_find_overlap_slot( - section->offset_within_address_space, - int128_get64(section->size)); - - if (mem && add) { - if (mem->size =3D=3D int128_get64(section->size) && - mem->start =3D=3D section->offset_within_address_space && - mem->mem =3D=3D (memory_region_get_ram_ptr(area) + - section->offset_within_region)) { - return; /* Same region was attempted to register, go away. */ - } - } - - /* Region needs to be reset. set the size to 0 and remap it. */ - if (mem) { - mem->size =3D 0; - if (do_hvf_set_memory(mem, 0)) { - error_report("Failed to reset overlapping slot"); - abort(); - } - } - - if (!add) { - return; - } - - if (area->readonly || - (!memory_region_is_ram(area) && memory_region_is_romd(area))) { - flags =3D HV_MEMORY_READ | HV_MEMORY_EXEC; - } else { - flags =3D HV_MEMORY_READ | HV_MEMORY_WRITE | HV_MEMORY_EXEC; - } - - /* Now make a new slot. */ - int x; - - for (x =3D 0; x < hvf_state->num_slots; ++x) { - mem =3D &hvf_state->slots[x]; - if (!mem->size) { - break; - } - } - - if (x =3D=3D hvf_state->num_slots) { - error_report("No free slots"); - abort(); - } - - 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; - - if (do_hvf_set_memory(mem, flags)) { - error_report("Error registering new memory slot"); - abort(); - } -} - static void do_hvf_cpu_synchronize_state(CPUState *cpu, run_on_cpu_data ar= g) { if (!cpu->vcpu_dirty) { @@ -238,79 +100,6 @@ static void hvf_cpu_synchronize_pre_loadvm(CPUState *c= pu) run_on_cpu(cpu, do_hvf_cpu_synchronize_set_dirty, RUN_ON_CPU_NULL); } =20 -static void hvf_set_dirty_tracking(MemoryRegionSection *section, bool on) -{ - hvf_slot *slot; - - slot =3D hvf_find_overlap_slot( - section->offset_within_address_space, - int128_get64(section->size)); - - /* protect region against writes; begin tracking it */ - if (on) { - slot->flags |=3D HVF_SLOT_LOG; - hv_vm_protect((uintptr_t)slot->start, (size_t)slot->size, - HV_MEMORY_READ | HV_MEMORY_EXEC); - /* stop tracking region*/ - } else { - slot->flags &=3D ~HVF_SLOT_LOG; - hv_vm_protect((uintptr_t)slot->start, (size_t)slot->size, - HV_MEMORY_READ | HV_MEMORY_WRITE | HV_MEMORY_EXEC); - } -} - -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); -} - -static void hvf_region_add(MemoryListener *listener, - MemoryRegionSection *section) -{ - hvf_set_phys_mem(section, true); -} - -static void hvf_region_del(MemoryListener *listener, - MemoryRegionSection *section) -{ - hvf_set_phys_mem(section, false); -} - -static MemoryListener hvf_memory_listener =3D { - .name =3D "hvf", - .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, -}; - static void dummy_signal(int sig) { } @@ -319,7 +108,6 @@ bool hvf_allowed; =20 static int hvf_accel_init(MachineState *ms) { - int x; hv_return_t ret; HVFState *s; =20 @@ -328,14 +116,8 @@ static int hvf_accel_init(MachineState *ms) =20 s =3D g_new0(HVFState, 1); =20 - s->num_slots =3D ARRAY_SIZE(s->slots); - for (x =3D 0; x < s->num_slots; ++x) { - s->slots[x].size =3D 0; - s->slots[x].slot_id =3D x; - } - hvf_state =3D s; - memory_listener_register(&hvf_memory_listener, &address_space_memory); + hvf_init_memslots(); =20 return hvf_arch_init(); } diff --git a/accel/hvf/hvf-mem.c b/accel/hvf/hvf-mem.c new file mode 100644 index 0000000000..3712731ed9 --- /dev/null +++ b/accel/hvf/hvf-mem.c @@ -0,0 +1,252 @@ +/* + * Copyright 2008 IBM Corporation + * 2008 Red Hat, Inc. + * Copyright 2011 Intel Corporation + * Copyright 2016 Veertu, Inc. + * Copyright 2017 The Android Open Source Project + * + * QEMU Hypervisor.framework support + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ + +#include "qemu/osdep.h" +#include "qemu/error-report.h" +#include "exec/address-spaces.h" +#include "sysemu/hvf.h" +#include "sysemu/hvf_int.h" + +/* Memory slots */ + +hvf_slot *hvf_find_overlap_slot(uint64_t start, uint64_t size) +{ + hvf_slot *slot; + int x; + for (x =3D 0; x < hvf_state->num_slots; ++x) { + slot =3D &hvf_state->slots[x]; + if (slot->size && start < (slot->start + slot->size) && + (start + size) > slot->start) { + return slot; + } + } + return NULL; +} + +struct mac_slot { + int present; + uint64_t size; + uint64_t gpa_start; + uint64_t gva; +}; + +struct mac_slot mac_slots[32]; + +static int do_hvf_set_memory(hvf_slot *slot, hv_memory_flags_t flags) +{ + struct mac_slot *macslot; + hv_return_t ret; + + macslot =3D &mac_slots[slot->slot_id]; + + if (macslot->present) { + if (macslot->size !=3D slot->size) { + macslot->present =3D 0; + ret =3D hv_vm_unmap(macslot->gpa_start, macslot->size); + assert_hvf_ok(ret); + } + } + + if (!slot->size) { + return 0; + } + + macslot->present =3D 1; + macslot->gpa_start =3D slot->start; + macslot->size =3D slot->size; + ret =3D hv_vm_map(slot->mem, slot->start, slot->size, flags); + assert_hvf_ok(ret); + return 0; +} + +static void hvf_set_phys_mem(MemoryRegionSection *section, bool add) +{ + hvf_slot *mem; + MemoryRegion *area =3D section->mr; + bool writeable =3D !area->readonly && !area->rom_device; + hv_memory_flags_t flags; + uint64_t page_size =3D qemu_real_host_page_size; + + if (!memory_region_is_ram(area)) { + if (writeable) { + return; + } else if (!memory_region_is_romd(area)) { + /* + * If the memory device is not in romd_mode, then we actually = want + * to remove the hvf memory slot so all accesses will trap. + */ + add =3D false; + } + } + + if (!QEMU_IS_ALIGNED(int128_get64(section->size), page_size) || + !QEMU_IS_ALIGNED(section->offset_within_address_space, page_size))= { + /* Not page aligned, so we can not map as RAM */ + add =3D false; + } + + mem =3D hvf_find_overlap_slot( + section->offset_within_address_space, + int128_get64(section->size)); + + if (mem && add) { + if (mem->size =3D=3D int128_get64(section->size) && + mem->start =3D=3D section->offset_within_address_space && + mem->mem =3D=3D (memory_region_get_ram_ptr(area) + + section->offset_within_region)) { + return; /* Same region was attempted to register, go away. */ + } + } + + /* Region needs to be reset. set the size to 0 and remap it. */ + if (mem) { + mem->size =3D 0; + if (do_hvf_set_memory(mem, 0)) { + error_report("Failed to reset overlapping slot"); + abort(); + } + } + + if (!add) { + return; + } + + if (area->readonly || + (!memory_region_is_ram(area) && memory_region_is_romd(area))) { + flags =3D HV_MEMORY_READ | HV_MEMORY_EXEC; + } else { + flags =3D HV_MEMORY_READ | HV_MEMORY_WRITE | HV_MEMORY_EXEC; + } + + /* Now make a new slot. */ + int x; + + for (x =3D 0; x < hvf_state->num_slots; ++x) { + mem =3D &hvf_state->slots[x]; + if (!mem->size) { + break; + } + } + + if (x =3D=3D hvf_state->num_slots) { + error_report("No free slots"); + abort(); + } + + 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; + + if (do_hvf_set_memory(mem, flags)) { + error_report("Error registering new memory slot"); + abort(); + } +} + + +static void hvf_set_dirty_tracking(MemoryRegionSection *section, bool on) +{ + hvf_slot *slot; + + slot =3D hvf_find_overlap_slot( + section->offset_within_address_space, + int128_get64(section->size)); + + /* protect region against writes; begin tracking it */ + if (on) { + slot->flags |=3D HVF_SLOT_LOG; + hv_vm_protect((uintptr_t)slot->start, (size_t)slot->size, + HV_MEMORY_READ | HV_MEMORY_EXEC); + /* stop tracking region*/ + } else { + slot->flags &=3D ~HVF_SLOT_LOG; + hv_vm_protect((uintptr_t)slot->start, (size_t)slot->size, + HV_MEMORY_READ | HV_MEMORY_WRITE | HV_MEMORY_EXEC); + } +} + +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); +} + +static void hvf_region_add(MemoryListener *listener, + MemoryRegionSection *section) +{ + hvf_set_phys_mem(section, true); +} + +static void hvf_region_del(MemoryListener *listener, + MemoryRegionSection *section) +{ + hvf_set_phys_mem(section, false); +} + +static MemoryListener hvf_memory_listener =3D { + .name =3D "hvf", + .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, +}; + +void hvf_init_memslots(void) +{ + int x; + HVFState *s =3D hvf_state; + + s->num_slots =3D ARRAY_SIZE(s->slots); + for (x =3D 0; x < s->num_slots; ++x) { + s->slots[x].size =3D 0; + s->slots[x].slot_id =3D x; + } + + memory_listener_register(&hvf_memory_listener, &address_space_memory); +} diff --git a/accel/hvf/meson.build b/accel/hvf/meson.build index fc52cb7843..7e7a2034f1 100644 --- a/accel/hvf/meson.build +++ b/accel/hvf/meson.build @@ -2,6 +2,7 @@ hvf_ss =3D ss.source_set() hvf_ss.add(files( 'hvf-all.c', 'hvf-accel-ops.c', + 'hvf-mem.c', )) =20 specific_ss.add_all(when: 'CONFIG_HVF', if_true: hvf_ss) diff --git a/include/sysemu/hvf_int.h b/include/sysemu/hvf_int.h index 6545f7cd61..cef20d750d 100644 --- a/include/sysemu/hvf_int.h +++ b/include/sysemu/hvf_int.h @@ -65,4 +65,6 @@ int hvf_put_registers(CPUState *); int hvf_get_registers(CPUState *); void hvf_kick_vcpu_thread(CPUState *cpu); =20 +void hvf_init_memslots(void); + #endif --=20 2.32.0 (Apple Git-132) From nobody Sun Feb 8 18:47:51 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1646227132447749.0567037679135; Wed, 2 Mar 2022 05:18:52 -0800 (PST) Received: from localhost ([::1]:45586 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nPOsP-0006uN-09 for importer@patchew.org; Wed, 02 Mar 2022 08:18:45 -0500 Received: from eggs.gnu.org ([209.51.188.92]:47856) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nPO49-0001FI-Ec for qemu-devel@nongnu.org; Wed, 02 Mar 2022 07:26:49 -0500 Received: from [2607:f8b0:4864:20::42f] (port=45754 helo=mail-pf1-x42f.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nPO47-0000eP-E9 for qemu-devel@nongnu.org; Wed, 02 Mar 2022 07:26:49 -0500 Received: by mail-pf1-x42f.google.com with SMTP id u16so1797203pfg.12 for ; Wed, 02 Mar 2022 04:26:47 -0800 (PST) Received: from localhost.localdomain (2001-b011-e000-59d7-a02b-4f1b-c415-11a0.dynamic-ip6.hinet.net. [2001:b011:e000:59d7:a02b:4f1b:c415:11a0]) by smtp.gmail.com with ESMTPSA id mu1-20020a17090b388100b001bedddf2000sm4912971pjb.14.2022.03.02.04.26.43 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Wed, 02 Mar 2022 04:26:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=EcGgDc6OGKcQA4p0Ncm8XhFop9pHI02HEIveclFCx2Y=; b=oI3xtj0TjVCa83mULmd8q+nvoj+KktV8OnJj3hNj8MsrltDA/Eo5G/6aV+Kbe3ehKr VyQjOJyFU2e1qDOIBVuwXf2vERJu2sB4K76ykIc7B4pxBlKMcweDnTFCJ8xqBp/L40LP h9zrvq7flAKy1Aqp7eXwHt5/bFvcL6Vjrv7jvoHKMvRgGfz4lvREAQYTXNSTk3Yyweon 8jpvXsQUJ/PHYIa0rUgjIsCLWPB/YQig6S0B2E8/K3XbiPZYPk8INUXvJldWv5T5HneY 3yE/xzQjXQU04QhWeweCGysb7fXN/6U+SEd2Wwv1Jn5qHdE/jz6DZwSMjfHE3YzjmjFT bVhw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=EcGgDc6OGKcQA4p0Ncm8XhFop9pHI02HEIveclFCx2Y=; b=H1Krv8PIcHr6jHwGxNw0viMzKYHAX65pj22bbNXBHsd48hdoErnfAe2jsN9WhoEw5p Eglilnr8veTedqIGaVwFr3E6WUimbOpLu+G6clxDqrNlzjgLJx4GnAKPgf+lEBkNQTsr roOhEW6N4mbOHxjyDonaJ9dUcFJv8UJwPpiSsOnhPVRA6ACcn6+MTSmQVlfIZbO4VAQA 1/v4HEKAbfOO/XP5NWMCBrie2085ufm/0fpTwraT89tdXP/umGFZb7GFxRi4YxW8sH8O ubjyE5ywAKRQCm/9AkmxrxAyLiTFGY5v3JA00cA2k6TNNe3H3B66bDF8FOAqj0Fs6Stx AvFA== X-Gm-Message-State: AOAM530ALbTkbXQK0e9Op7EKzLCDq5kF2pRcHd1yQmf661fv2NKvjZ4n SjoxgOa8tF+qsCNWlWiUuL+bR5M2H2uVXQ== X-Google-Smtp-Source: ABdhPJx6/xzdgiDwL347bN4LqZLARq3swErz4sKzRb12yu2zDhcyK6OQV/+Zrgw9O/qrn46EpExoVA== X-Received: by 2002:a05:6a00:1a07:b0:4f3:eba5:42ae with SMTP id g7-20020a056a001a0700b004f3eba542aemr21501921pfv.53.1646224005521; Wed, 02 Mar 2022 04:26:45 -0800 (PST) From: Yan-Jie Wang To: qemu-devel@nongnu.org Subject: [PATCH v2 2/9] hvf: simplify data structures and codes of memory related functions Date: Wed, 2 Mar 2022 20:26:04 +0800 Message-Id: <20220302122611.15237-3-ubzeme@gmail.com> X-Mailer: git-send-email 2.32.0 (Apple Git-132) In-Reply-To: <20220302122611.15237-1-ubzeme@gmail.com> References: <20220302122611.15237-1-ubzeme@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2607:f8b0:4864:20::42f (failed) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::42f; envelope-from=ubzeme@gmail.com; helo=mail-pf1-x42f.google.com X-Spam_score_int: -6 X-Spam_score: -0.7 X-Spam_bar: / X-Spam_report: (-0.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Peter Maydell , Roman Bolshakov , Alexander Graf , Cameron Esfahani , Yan-Jie Wang Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1646227134148100001 Content-Type: text/plain; charset="utf-8" * Remove mac_slot and use hvf_slot only. The function of the two structures are similar. * Refactor function hvf_set_phys_mem(): - Remove unnecessary checks because any modified memory sections will be removed first (region_del called first) before being added. Therefore, new sections do not overlap with existing sections. - Try to align memory sections first before giving up sections that are not aligned to host page size. Signed-off-by: Yan-Jie Wang --- accel/hvf/hvf-accel-ops.c | 1 - accel/hvf/hvf-mem.c | 211 +++++++++++++++++++------------------- include/sysemu/hvf_int.h | 8 +- 3 files changed, 107 insertions(+), 113 deletions(-) diff --git a/accel/hvf/hvf-accel-ops.c b/accel/hvf/hvf-accel-ops.c index 50a563bfe0..c77f142f2b 100644 --- a/accel/hvf/hvf-accel-ops.c +++ b/accel/hvf/hvf-accel-ops.c @@ -49,7 +49,6 @@ =20 #include "qemu/osdep.h" #include "qemu/main-loop.h" -#include "exec/address-spaces.h" #include "exec/exec-all.h" #include "sysemu/cpus.h" #include "sysemu/hvf.h" diff --git a/accel/hvf/hvf-mem.c b/accel/hvf/hvf-mem.c index 3712731ed9..32452696b6 100644 --- a/accel/hvf/hvf-mem.c +++ b/accel/hvf/hvf-mem.c @@ -28,12 +28,16 @@ =20 /* Memory slots */ =20 +#define HVF_NUM_SLOTS 32 + +static hvf_slot memslots[HVF_NUM_SLOTS]; + hvf_slot *hvf_find_overlap_slot(uint64_t start, uint64_t size) { hvf_slot *slot; int x; - for (x =3D 0; x < hvf_state->num_slots; ++x) { - slot =3D &hvf_state->slots[x]; + for (x =3D 0; x < HVF_NUM_SLOTS; ++x) { + slot =3D &memslots[x]; if (slot->size && start < (slot->start + slot->size) && (start + size) > slot->start) { return slot; @@ -42,128 +46,130 @@ hvf_slot *hvf_find_overlap_slot(uint64_t start, uint6= 4_t size) return NULL; } =20 -struct mac_slot { - int present; - uint64_t size; - uint64_t gpa_start; - uint64_t gva; -}; - -struct mac_slot mac_slots[32]; - -static int do_hvf_set_memory(hvf_slot *slot, hv_memory_flags_t flags) +static hvf_slot *hvf_find_free_slot(void) { - struct mac_slot *macslot; - hv_return_t ret; - - macslot =3D &mac_slots[slot->slot_id]; - - if (macslot->present) { - if (macslot->size !=3D slot->size) { - macslot->present =3D 0; - ret =3D hv_vm_unmap(macslot->gpa_start, macslot->size); - assert_hvf_ok(ret); + hvf_slot *slot; + int x; + for (x =3D 0; x < HVF_NUM_SLOTS; x++) { + slot =3D &memslots[x]; + if (!slot->size) { + return slot; } } =20 - if (!slot->size) { - return 0; - } - - macslot->present =3D 1; - macslot->gpa_start =3D slot->start; - macslot->size =3D slot->size; - ret =3D hv_vm_map(slot->mem, slot->start, slot->size, flags); - assert_hvf_ok(ret); - return 0; + return NULL; +} + +/* + * Hypervisor.framework requires that the host virtual address, + * the guest physical address and the size of memory regions are aligned + * to the host page size. + * + * The function here tries to align the guest physical address and the siz= e. + * + * The return value is the aligned size. + * The aligned guest physical address will be written to `start'. + * The delta between the aligned address and the original address will be + * written to `delta'. + */ +static hwaddr hvf_align_section(MemoryRegionSection *section, + hwaddr *start, hwaddr *delta) +{ + hwaddr unaligned, _start, size, _delta; + + unaligned =3D section->offset_within_address_space; + size =3D int128_get64(section->size); + _start =3D ROUND_UP(unaligned, qemu_real_host_page_size); + _delta =3D _start - unaligned; + size =3D (size - _delta) & qemu_real_host_page_mask; + + *start =3D _start; + *delta =3D _delta; + + return size; } =20 static void hvf_set_phys_mem(MemoryRegionSection *section, bool add) { - hvf_slot *mem; + hvf_slot *slot; + hwaddr start, size, offset, delta; + uint8_t *host_addr; MemoryRegion *area =3D section->mr; - bool writeable =3D !area->readonly && !area->rom_device; + bool readonly, dirty_tracking; hv_memory_flags_t flags; - uint64_t page_size =3D qemu_real_host_page_size; + hv_return_t ret; =20 - if (!memory_region_is_ram(area)) { - if (writeable) { + if (add && !memory_region_is_ram(area) && !memory_region_is_romd(area)= ) { + /* + * If the memory region is not RAM and is in ROMD mode, + * do not map it to the guest. + */ + return; + } + + size =3D hvf_align_section(section, &start, &delta); + + if (!size) { + /* The size is 0 after aligned. Do not map the region */ + return; + } + + if (add) { + /* add memory region */ + offset =3D section->offset_within_region + delta; + host_addr =3D memory_region_get_ram_ptr(area) + offset; + + if (!QEMU_PTR_IS_ALIGNED(host_addr, qemu_real_host_page_size)) { + /* The host virtual address is not aligned. It cannot be mappe= d */ return; - } else if (!memory_region_is_romd(area)) { - /* - * If the memory device is not in romd_mode, then we actually = want - * to remove the hvf memory slot so all accesses will trap. - */ - add =3D false; } - } =20 - if (!QEMU_IS_ALIGNED(int128_get64(section->size), page_size) || - !QEMU_IS_ALIGNED(section->offset_within_address_space, page_size))= { - /* Not page aligned, so we can not map as RAM */ - add =3D false; - } + dirty_tracking =3D !!memory_region_get_dirty_log_mask(area); + readonly =3D memory_region_is_rom(area) || memory_region_is_romd(a= rea); =20 - mem =3D hvf_find_overlap_slot( - section->offset_within_address_space, - int128_get64(section->size)); - - if (mem && add) { - if (mem->size =3D=3D int128_get64(section->size) && - mem->start =3D=3D section->offset_within_address_space && - mem->mem =3D=3D (memory_region_get_ram_ptr(area) + - section->offset_within_region)) { - return; /* Same region was attempted to register, go away. */ - } - } - - /* Region needs to be reset. set the size to 0 and remap it. */ - if (mem) { - mem->size =3D 0; - if (do_hvf_set_memory(mem, 0)) { - error_report("Failed to reset overlapping slot"); + /* setup a slot */ + slot =3D hvf_find_free_slot(); + if (!slot) { + error_report("No free slots"); abort(); } - } =20 - if (!add) { - return; - } + slot->start =3D start; + slot->size =3D size; + slot->offset =3D offset; + slot->flags =3D 0; + slot->region =3D area; =20 - if (area->readonly || - (!memory_region_is_ram(area) && memory_region_is_romd(area))) { - flags =3D HV_MEMORY_READ | HV_MEMORY_EXEC; + if (readonly) { + slot->flags |=3D HVF_SLOT_READONLY; + } + + if (dirty_tracking) { + slot->flags |=3D HVF_SLOT_LOG; + } + + /* set Hypervisor.framework memory mapping flags */ + if (readonly || dirty_tracking) { + flags =3D HV_MEMORY_READ | HV_MEMORY_EXEC; + } else { + flags =3D HV_MEMORY_READ | HV_MEMORY_WRITE | HV_MEMORY_EXEC; + } + + ret =3D hv_vm_map(host_addr, start, size, flags); + assert_hvf_ok(ret); } else { - flags =3D HV_MEMORY_READ | HV_MEMORY_WRITE | HV_MEMORY_EXEC; - } + /* remove memory region */ + slot =3D hvf_find_overlap_slot(start, size); =20 - /* Now make a new slot. */ - int x; + if (slot) { + ret =3D hv_vm_unmap(start, size); + assert_hvf_ok(ret); =20 - for (x =3D 0; x < hvf_state->num_slots; ++x) { - mem =3D &hvf_state->slots[x]; - if (!mem->size) { - break; + slot->size =3D 0; } } - - if (x =3D=3D hvf_state->num_slots) { - error_report("No free slots"); - abort(); - } - - 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; - - if (do_hvf_set_memory(mem, flags)) { - error_report("Error registering new memory slot"); - abort(); - } } =20 - static void hvf_set_dirty_tracking(MemoryRegionSection *section, bool on) { hvf_slot *slot; @@ -239,14 +245,5 @@ static MemoryListener hvf_memory_listener =3D { =20 void hvf_init_memslots(void) { - int x; - HVFState *s =3D hvf_state; - - s->num_slots =3D ARRAY_SIZE(s->slots); - for (x =3D 0; x < s->num_slots; ++x) { - s->slots[x].size =3D 0; - s->slots[x].slot_id =3D x; - } - memory_listener_register(&hvf_memory_listener, &address_space_memory); } diff --git a/include/sysemu/hvf_int.h b/include/sysemu/hvf_int.h index cef20d750d..8ee31a16ac 100644 --- a/include/sysemu/hvf_int.h +++ b/include/sysemu/hvf_int.h @@ -19,12 +19,12 @@ =20 /* hvf_slot flags */ #define HVF_SLOT_LOG (1 << 0) +#define HVF_SLOT_READONLY (1 << 1) =20 typedef struct hvf_slot { uint64_t start; - uint64_t size; - uint8_t *mem; - int slot_id; + uint64_t size; /* 0 if the slot is free */ + uint64_t offset; /* offset within memory region */ uint32_t flags; MemoryRegion *region; } hvf_slot; @@ -40,8 +40,6 @@ typedef struct hvf_vcpu_caps { =20 struct HVFState { AccelState parent; - hvf_slot slots[32]; - int num_slots; =20 hvf_vcpu_caps *hvf_caps; uint64_t vtimer_offset; --=20 2.32.0 (Apple Git-132) From nobody Sun Feb 8 18:47:51 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1646228657150148.7312901406849; Wed, 2 Mar 2022 05:44:17 -0800 (PST) Received: from localhost ([::1]:35180 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nPPH6-0006Wi-3H for importer@patchew.org; Wed, 02 Mar 2022 08:44:16 -0500 Received: from eggs.gnu.org ([209.51.188.92]:47866) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nPO4A-0001L3-OU for qemu-devel@nongnu.org; Wed, 02 Mar 2022 07:26:50 -0500 Received: from [2607:f8b0:4864:20::52f] (port=46053 helo=mail-pg1-x52f.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nPO49-0000em-9K for qemu-devel@nongnu.org; Wed, 02 Mar 2022 07:26:50 -0500 Received: by mail-pg1-x52f.google.com with SMTP id z4so1474171pgh.12 for ; Wed, 02 Mar 2022 04:26:48 -0800 (PST) Received: from localhost.localdomain (2001-b011-e000-59d7-a02b-4f1b-c415-11a0.dynamic-ip6.hinet.net. [2001:b011:e000:59d7:a02b:4f1b:c415:11a0]) by smtp.gmail.com with ESMTPSA id mu1-20020a17090b388100b001bedddf2000sm4912971pjb.14.2022.03.02.04.26.45 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Wed, 02 Mar 2022 04:26:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=tFB9N0+6/fehwQuRXDdcYFp1qjN2m+rAm/M1d8WEXJE=; b=hLMsPPbRtgGX1MCepAvM4Xp6CIf7oGKkXK6yuJe+4Uwx1/P0ht0qbFYblj1mvIxVMR 7AyrNbY4uBZ2qkvyULtcxjiKRkQhDj4W4feMIQhB9EV9YEEe9OJLYCLVipfBrme0bPRa M+7tV/HcyJyqTTFrfaUA0wBfWBYaf98VMWXlsI/KhBjRbqvWrY6vlSF1jFkDp44MlGbn Rm/0nDljFF4vrFBtuTGMdcGrhBa6DaJXN3rs71a4E22oYHx1Ldpx0zvlGM3Dut8LUbeE RVzn0gx6P8a61hih9fItCR9DMGjYyRPvxVld4HxMb4CzPN4fO/BrSs6XOZSp5/RT8kSt J0Mg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=tFB9N0+6/fehwQuRXDdcYFp1qjN2m+rAm/M1d8WEXJE=; b=7+MRcwpupNCW82zq4YiCLaeZiuBZrue3QktHcYi2LgJrWnM5zeSKtdkVw/tFLfO/Ur AChsuro6enHk0s3fqmiJyS4QgNk04+0hmqh8doz+ZWm6kCK+Wo0Sq9ci6av0SJQbpzmX MpKJSIZufZbSEujxknOWtUxeW39b8vTSFzA4heVYI5td5jjnOjdf7W7hNUMxuCW4fD0C gUoCdvPZteAOf+0N3O0U3qc5o9NcTD+RkRCHnuVZCW9pVKLXtZRqSpQcfwI7DUhBs1jE chlZSBRSEcv+acVl1J7RudZnQLR2ALLoSfAXn2rq/KKINqDPzfTQ08ZXUpcK8YLzcM4R CMZA== X-Gm-Message-State: AOAM5324bnyDunD8j4Yxhk0I1QMRyLVVeLtdlZV8hKH4WHnxjhK2T5rm A/iqhvIe2lUznBPcbRUmd6UgRDCRq62IIg== X-Google-Smtp-Source: ABdhPJx1G9XM6aBAdmojaHe09mrUEIUgj5sO9zUuxq6Y/UozsN9Uu5Sk/hDghVXVnTMR4PCukdPxGg== X-Received: by 2002:a05:6a00:c95:b0:4e1:3259:f7ad with SMTP id a21-20020a056a000c9500b004e13259f7admr32387248pfv.43.1646224007581; Wed, 02 Mar 2022 04:26:47 -0800 (PST) From: Yan-Jie Wang To: qemu-devel@nongnu.org Subject: [PATCH v2 3/9] hvf: use correct data types for addresses in memory related functions Date: Wed, 2 Mar 2022 20:26:05 +0800 Message-Id: <20220302122611.15237-4-ubzeme@gmail.com> X-Mailer: git-send-email 2.32.0 (Apple Git-132) In-Reply-To: <20220302122611.15237-1-ubzeme@gmail.com> References: <20220302122611.15237-1-ubzeme@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2607:f8b0:4864:20::52f (failed) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::52f; envelope-from=ubzeme@gmail.com; helo=mail-pg1-x52f.google.com X-Spam_score_int: -6 X-Spam_score: -0.7 X-Spam_bar: / X-Spam_report: (-0.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Peter Maydell , Roman Bolshakov , Alexander Graf , Cameron Esfahani , Yan-Jie Wang Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1646228660230100001 Content-Type: text/plain; charset="utf-8" Follow the QEMU coding style. Use hwaddr for guest physical address. Signed-off-by: Yan-Jie Wang --- accel/hvf/hvf-mem.c | 2 +- include/sysemu/hvf_int.h | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/accel/hvf/hvf-mem.c b/accel/hvf/hvf-mem.c index 32452696b6..6b82be3220 100644 --- a/accel/hvf/hvf-mem.c +++ b/accel/hvf/hvf-mem.c @@ -32,7 +32,7 @@ =20 static hvf_slot memslots[HVF_NUM_SLOTS]; =20 -hvf_slot *hvf_find_overlap_slot(uint64_t start, uint64_t size) +hvf_slot *hvf_find_overlap_slot(hwaddr start, hwaddr size) { hvf_slot *slot; int x; diff --git a/include/sysemu/hvf_int.h b/include/sysemu/hvf_int.h index 8ee31a16ac..2c4a97debe 100644 --- a/include/sysemu/hvf_int.h +++ b/include/sysemu/hvf_int.h @@ -22,9 +22,9 @@ #define HVF_SLOT_READONLY (1 << 1) =20 typedef struct hvf_slot { - uint64_t start; - uint64_t size; /* 0 if the slot is free */ - uint64_t offset; /* offset within memory region */ + hwaddr start; + hwaddr size; /* 0 if the slot is free */ + hwaddr offset; /* offset within memory region */ uint32_t flags; MemoryRegion *region; } hvf_slot; @@ -58,7 +58,7 @@ int hvf_arch_init(void); int hvf_arch_init_vcpu(CPUState *cpu); void hvf_arch_vcpu_destroy(CPUState *cpu); int hvf_vcpu_exec(CPUState *); -hvf_slot *hvf_find_overlap_slot(uint64_t, uint64_t); +hvf_slot *hvf_find_overlap_slot(hwaddr, hwaddr); int hvf_put_registers(CPUState *); int hvf_get_registers(CPUState *); void hvf_kick_vcpu_thread(CPUState *cpu); --=20 2.32.0 (Apple Git-132) From nobody Sun Feb 8 18:47:51 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 164622741307323.353508922273136; Wed, 2 Mar 2022 05:23:33 -0800 (PST) Received: from localhost ([::1]:54036 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nPOx2-0004tn-06 for importer@patchew.org; Wed, 02 Mar 2022 08:23:32 -0500 Received: from eggs.gnu.org ([209.51.188.92]:47882) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nPO4C-0001TJ-VH for qemu-devel@nongnu.org; Wed, 02 Mar 2022 07:26:53 -0500 Received: from [2607:f8b0:4864:20::530] (port=36494 helo=mail-pg1-x530.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nPO4B-0000f6-BZ for qemu-devel@nongnu.org; Wed, 02 Mar 2022 07:26:52 -0500 Received: by mail-pg1-x530.google.com with SMTP id t14so1499873pgr.3 for ; Wed, 02 Mar 2022 04:26:50 -0800 (PST) Received: from localhost.localdomain (2001-b011-e000-59d7-a02b-4f1b-c415-11a0.dynamic-ip6.hinet.net. [2001:b011:e000:59d7:a02b:4f1b:c415:11a0]) by smtp.gmail.com with ESMTPSA id mu1-20020a17090b388100b001bedddf2000sm4912971pjb.14.2022.03.02.04.26.47 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Wed, 02 Mar 2022 04:26:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=ynqt3y5s/uUAaEi3pDIc2AV9gtv8UZRUMS//euNtFRg=; b=gUmPBL/k7lAfumaVWyYy4Xim2PIXtKlr052WgI8flxq9T18PcYFfmJp3X6bvtr2mhg gVIA6FGHjpgoBp78OanXAxokw65cvSnvWGj4K8v9xGkO1ozRnZIl1GoP/9nRkfm1zQiu ph0JZWSUgw00L5d8C36fQ0GtQXAwDZDapIwamqYcNWHIso4iH1SpLz8X3Q9RSTwNoU3n E1gqyqU5lZa49d55fs7HVKAUFF6TcVx+iNJiCKms+UCETN+h2Wv/sCBwJ3vXKg8l52PP tq4d3jh/RWSIZ13D9aQPsVVWXakwZjW5nmKAuJAddmaUeXXii+RLoSYDN4yF6HMZAIR1 ErsA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=ynqt3y5s/uUAaEi3pDIc2AV9gtv8UZRUMS//euNtFRg=; b=RrmIAyVKO79Bdu6MlVLxSQcdKk6aNssTpZUKhVbwyGeiyKuHA/T6/w9sL1vFtu5878 2e1LMRBYSR7mUzWZxu+S/sn5ANDSNN3EN3lItn4iiiN1Cdpvdj0f2xZO8f89ql8A6iKL OhxMaLDEvSebjLt1BmEAkeiByYfy9B6hXqaZJj4zKz2ogJa6i/Smzz4ZQSVau/b4Ts15 ub2He5G4FvXBxT/mN8RyXjnwv98Gs2kuE7w5slVZEGRtNBbhTyOUpEAD1Yxkn+pgM3lB 6QekSCDPU2ua3Qe9YOF0KnXoXr8KVgGHnA3yUT5FQpvprr0LExyuHbZz7eUleGRya5A5 2BXw== X-Gm-Message-State: AOAM530UnDOT4JVNS3N/MVslJZAGd7k/5ygjrfHPWpExs21zgJZ9JHV5 kw30WoidLVHS8WTsLmY4pXgksRk6lWafuw== X-Google-Smtp-Source: ABdhPJzP9/vBPNM+TYnEb/5zwgbxTY006PL5Do96f+3qCH5TxAFa+Jlkt7bVuk3kbMlPX8wdax2p3g== X-Received: by 2002:a05:6a00:124f:b0:4c0:6242:c14e with SMTP id u15-20020a056a00124f00b004c06242c14emr32670178pfi.83.1646224009642; Wed, 02 Mar 2022 04:26:49 -0800 (PST) From: Yan-Jie Wang To: qemu-devel@nongnu.org Subject: [PATCH v2 4/9] hvf: rename struct hvf_slot to HVFSlot Date: Wed, 2 Mar 2022 20:26:06 +0800 Message-Id: <20220302122611.15237-5-ubzeme@gmail.com> X-Mailer: git-send-email 2.32.0 (Apple Git-132) In-Reply-To: <20220302122611.15237-1-ubzeme@gmail.com> References: <20220302122611.15237-1-ubzeme@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2607:f8b0:4864:20::530 (failed) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::530; envelope-from=ubzeme@gmail.com; helo=mail-pg1-x530.google.com X-Spam_score_int: -6 X-Spam_score: -0.7 X-Spam_bar: / X-Spam_report: (-0.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Peter Maydell , Roman Bolshakov , Alexander Graf , Cameron Esfahani , Yan-Jie Wang Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1646227414391100001 Content-Type: text/plain; charset="utf-8" Follow the QEMU coding style. Structured type names are in CamelCase. Signed-off-by: Yan-Jie Wang --- accel/hvf/hvf-mem.c | 14 +++++++------- include/sysemu/hvf_int.h | 8 ++++---- target/i386/hvf/hvf.c | 4 ++-- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/accel/hvf/hvf-mem.c b/accel/hvf/hvf-mem.c index 6b82be3220..b8e9f30e4c 100644 --- a/accel/hvf/hvf-mem.c +++ b/accel/hvf/hvf-mem.c @@ -30,11 +30,11 @@ =20 #define HVF_NUM_SLOTS 32 =20 -static hvf_slot memslots[HVF_NUM_SLOTS]; +static HVFSlot memslots[HVF_NUM_SLOTS]; =20 -hvf_slot *hvf_find_overlap_slot(hwaddr start, hwaddr size) +HVFSlot *hvf_find_overlap_slot(hwaddr start, hwaddr size) { - hvf_slot *slot; + HVFSlot *slot; int x; for (x =3D 0; x < HVF_NUM_SLOTS; ++x) { slot =3D &memslots[x]; @@ -46,9 +46,9 @@ hvf_slot *hvf_find_overlap_slot(hwaddr start, hwaddr size) return NULL; } =20 -static hvf_slot *hvf_find_free_slot(void) +static HVFSlot *hvf_find_free_slot(void) { - hvf_slot *slot; + HVFSlot *slot; int x; for (x =3D 0; x < HVF_NUM_SLOTS; x++) { slot =3D &memslots[x]; @@ -91,7 +91,7 @@ static hwaddr hvf_align_section(MemoryRegionSection *sect= ion, =20 static void hvf_set_phys_mem(MemoryRegionSection *section, bool add) { - hvf_slot *slot; + HVFSlot *slot; hwaddr start, size, offset, delta; uint8_t *host_addr; MemoryRegion *area =3D section->mr; @@ -172,7 +172,7 @@ static void hvf_set_phys_mem(MemoryRegionSection *secti= on, bool add) =20 static void hvf_set_dirty_tracking(MemoryRegionSection *section, bool on) { - hvf_slot *slot; + HVFSlot *slot; =20 slot =3D hvf_find_overlap_slot( section->offset_within_address_space, diff --git a/include/sysemu/hvf_int.h b/include/sysemu/hvf_int.h index 2c4a97debe..0aafbc9357 100644 --- a/include/sysemu/hvf_int.h +++ b/include/sysemu/hvf_int.h @@ -17,17 +17,17 @@ #include #endif =20 -/* hvf_slot flags */ +/* HVFSlot flags */ #define HVF_SLOT_LOG (1 << 0) #define HVF_SLOT_READONLY (1 << 1) =20 -typedef struct hvf_slot { +typedef struct HVFSlot { hwaddr start; hwaddr size; /* 0 if the slot is free */ hwaddr offset; /* offset within memory region */ uint32_t flags; MemoryRegion *region; -} hvf_slot; +} HVFSlot; =20 typedef struct hvf_vcpu_caps { uint64_t vmx_cap_pinbased; @@ -58,7 +58,7 @@ int hvf_arch_init(void); int hvf_arch_init_vcpu(CPUState *cpu); void hvf_arch_vcpu_destroy(CPUState *cpu); int hvf_vcpu_exec(CPUState *); -hvf_slot *hvf_find_overlap_slot(hwaddr, hwaddr); +HVFSlot *hvf_find_overlap_slot(hwaddr, hwaddr); int hvf_put_registers(CPUState *); int hvf_get_registers(CPUState *); void hvf_kick_vcpu_thread(CPUState *cpu); diff --git a/target/i386/hvf/hvf.c b/target/i386/hvf/hvf.c index 4ba6e82fab..2ddb4fc825 100644 --- a/target/i386/hvf/hvf.c +++ b/target/i386/hvf/hvf.c @@ -113,7 +113,7 @@ void hvf_handle_io(CPUArchState *env, uint16_t port, vo= id *buffer, } } =20 -static bool ept_emulation_fault(hvf_slot *slot, uint64_t gpa, uint64_t ept= _qual) +static bool ept_emulation_fault(HVFSlot *slot, uint64_t gpa, uint64_t ept_= qual) { int read, write; =20 @@ -469,7 +469,7 @@ int hvf_vcpu_exec(CPUState *cpu) /* Need to check if MMIO or unmapped fault */ case EXIT_REASON_EPT_FAULT: { - hvf_slot *slot; + HVFSlot *slot; uint64_t gpa =3D rvmcs(cpu->hvf->fd, VMCS_GUEST_PHYSICAL_ADDRE= SS); =20 if (((idtvec_info & VMCS_IDT_VEC_VALID) =3D=3D 0) && --=20 2.32.0 (Apple Git-132) From nobody Sun Feb 8 18:47:51 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 16462288200681007.5039847607081; Wed, 2 Mar 2022 05:47:00 -0800 (PST) Received: from localhost ([::1]:44608 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nPPJj-0004U0-B3 for importer@patchew.org; Wed, 02 Mar 2022 08:46:59 -0500 Received: from eggs.gnu.org ([209.51.188.92]:47896) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nPO4F-0001c8-KF for qemu-devel@nongnu.org; Wed, 02 Mar 2022 07:26:55 -0500 Received: from [2607:f8b0:4864:20::52e] (port=41514 helo=mail-pg1-x52e.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nPO4D-0000h2-JD for qemu-devel@nongnu.org; Wed, 02 Mar 2022 07:26:55 -0500 Received: by mail-pg1-x52e.google.com with SMTP id o26so1484183pgb.8 for ; Wed, 02 Mar 2022 04:26:53 -0800 (PST) Received: from localhost.localdomain (2001-b011-e000-59d7-a02b-4f1b-c415-11a0.dynamic-ip6.hinet.net. [2001:b011:e000:59d7:a02b:4f1b:c415:11a0]) by smtp.gmail.com with ESMTPSA id mu1-20020a17090b388100b001bedddf2000sm4912971pjb.14.2022.03.02.04.26.50 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Wed, 02 Mar 2022 04:26:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=2T+NCiBAVUTU368d4Yz1z1btdsU5CgR5N/ysNvhlN6k=; b=e6LI0lF1mguaCrofiTCr2Be66Z9DLbOOv/hv2ATMkGegZrlFCKNok3rnNBHrRPMNyS JyKXTr0lwUPSNGuxolZq9/U5/np3FbSgBcUglEszjUGTXcbwaKcGQ37t4b2OEar4UxKY UAhqiVMxDBb4pygDNPG+lXQMeQ8g8gqLhzK2iT23Wr2CKh3PO6nMnrd5Aw13IrpaBmll /lHlBRBbqJimIoToCUNHhhX0sSlJ0pHGdgf3WjrftbqwOF1Q+1/ryVVs+yaKEDqR597c AIGfYLXLfKyNya5dc2sRdJCt8xY+t9nkxn0xLs4ZiV6IFgOvySQx2kt5AoWFlut53yz0 p9Yw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=2T+NCiBAVUTU368d4Yz1z1btdsU5CgR5N/ysNvhlN6k=; b=68dcpP4Wp1mMYqsT3tYHbDk4P+ffZf1z1zy9rdi//h2aI9KFw6ZearJYKTV4ctBmsa I48YB+jhdnWRBUYX9s/x/x6wwLSiOcos8B2uin/eJ7qxA7zMlB6mfu5yY+wSwqWgb5ai aoLNLAC9RssJRZgtG7cZU7qltuPulh554ylkrTcJfzCfrBCvbvVOgbgmU9TUzvXOz9IT geh5/GF34uSDEvoBKlEZSUeZpvm1ZsgWAzUy+RIQqLZh5SzSenycmkCk8yxbujrJ+ga8 eoyXUtJlL178jDKD/u2+ShJ48KKTQCvGmBIyFayK8imZWbHwe3LWeKFM47j20aXj03AD 4zrw== X-Gm-Message-State: AOAM530lHOl1Yf82UMDYhxqg8i3l+eu7lQgOwzinHrJVlop+intcGPWD ttmRHL1+linug6gR/46o8WzzAIQiugmYjg== X-Google-Smtp-Source: ABdhPJyHQiddXhD1g8aW96Wrtl3zhO4ZK/eIMZE/pnDdmXQI6qCjNNwtbfLAY1neW6Ji9qTzTsEaYw== X-Received: by 2002:a63:318f:0:b0:378:96fe:fdfb with SMTP id x137-20020a63318f000000b0037896fefdfbmr13231009pgx.120.1646224011903; Wed, 02 Mar 2022 04:26:51 -0800 (PST) From: Yan-Jie Wang To: qemu-devel@nongnu.org Subject: [PATCH v2 5/9] hvf: fix memory dirty-tracking Date: Wed, 2 Mar 2022 20:26:07 +0800 Message-Id: <20220302122611.15237-6-ubzeme@gmail.com> X-Mailer: git-send-email 2.32.0 (Apple Git-132) In-Reply-To: <20220302122611.15237-1-ubzeme@gmail.com> References: <20220302122611.15237-1-ubzeme@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2607:f8b0:4864:20::52e (failed) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::52e; envelope-from=ubzeme@gmail.com; helo=mail-pg1-x52e.google.com X-Spam_score_int: -6 X-Spam_score: -0.7 X-Spam_bar: / X-Spam_report: (-0.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Peter Maydell , Roman Bolshakov , Alexander Graf , Cameron Esfahani , Yan-Jie Wang Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1646228821709100001 Content-Type: text/plain; charset="utf-8" Dirty-tracking in HVF is not properly implemented. On Intel Macs, Ubuntu ISO boot menu does not show properly. On Apple Silicon, using bochs-display may cause the guest crashes because the guest may uses load/store instructions on framebuffer which causes vmexits and the exception register does not contain enough information (ESR_EL2.ISV =3D 0) for QEMU to emulate the memory operation. The strategy to log the dirty pages is to write-protect the memory regions that are being dirty-tracked. When the guest is trapped to the host because of memory write, check whether the address being written is being dirty-tracked. If it is being dirty-tracked, restore the write permission of the page and mark the accessed page dirty, and resume the guest without increasing program counter, and then the same instruction will be execute again. This patch fixes the problem and make the dirty-tracking work properly. Buglink: https://bugs.launchpad.net/qemu/+bug/1827005 Signed-off-by: Yan-Jie Wang --- accel/hvf/hvf-mem.c | 62 ++++++++++++++++++++++++++++++++++++---- include/sysemu/hvf_int.h | 14 +-------- target/arm/hvf/hvf.c | 5 ++++ target/i386/hvf/hvf.c | 25 ++++------------ 4 files changed, 68 insertions(+), 38 deletions(-) diff --git a/accel/hvf/hvf-mem.c b/accel/hvf/hvf-mem.c index b8e9f30e4c..896e718374 100644 --- a/accel/hvf/hvf-mem.c +++ b/accel/hvf/hvf-mem.c @@ -30,9 +30,21 @@ =20 #define HVF_NUM_SLOTS 32 =20 +/* HVFSlot flags */ +#define HVF_SLOT_LOG (1 << 0) +#define HVF_SLOT_READONLY (1 << 1) + +typedef struct HVFSlot { + hwaddr start; + hwaddr size; /* 0 if the slot is free */ + hwaddr offset; /* offset within memory region */ + uint32_t flags; + MemoryRegion *region; +} HVFSlot; + static HVFSlot memslots[HVF_NUM_SLOTS]; =20 -HVFSlot *hvf_find_overlap_slot(hwaddr start, hwaddr size) +static HVFSlot *hvf_find_overlap_slot(hwaddr start, hwaddr size) { HVFSlot *slot; int x; @@ -194,7 +206,7 @@ static void hvf_set_dirty_tracking(MemoryRegionSection = *section, bool on) static void hvf_log_start(MemoryListener *listener, MemoryRegionSection *section, int old, int new) { - if (old !=3D 0) { + if (old =3D=3D new) { return; } =20 @@ -211,12 +223,12 @@ static void hvf_log_stop(MemoryListener *listener, hvf_set_dirty_tracking(section, 0); } =20 -static void hvf_log_sync(MemoryListener *listener, +static void hvf_log_clear(MemoryListener *listener, MemoryRegionSection *section) { /* - * sync of dirty pages is handled elsewhere; just make sure we keep - * tracking the region. + * The dirty bits are being cleared. + * Make the section write-protected again. */ hvf_set_dirty_tracking(section, 1); } @@ -240,9 +252,47 @@ static MemoryListener hvf_memory_listener =3D { .region_del =3D hvf_region_del, .log_start =3D hvf_log_start, .log_stop =3D hvf_log_stop, - .log_sync =3D hvf_log_sync, + .log_clear =3D hvf_log_clear, }; =20 + +/* + * The function is called when the guest is accessing memory causing vmexi= t. + * Check whether the guest can access the memory directly and + * also mark the accessed page being written dirty + * if the page is being dirty-tracked. + * + * Return true if the access is within the mapped region, + * otherwise return false. + */ +bool hvf_access_memory(hwaddr address, bool write) +{ + HVFSlot *slot; + hv_return_t ret; + hwaddr start, size; + + slot =3D hvf_find_overlap_slot(address, 1); + + if (!slot || (write && slot->flags & HVF_SLOT_READONLY)) { + /* MMIO or unmapped area, return false */ + return false; + } + + if (write && (slot->flags & HVF_SLOT_LOG)) { + /* The slot is being dirty-tracked. Mark the accessed page dirty. = */ + start =3D address & qemu_real_host_page_mask; + size =3D qemu_real_host_page_size; + + memory_region_set_dirty(slot->region, + start - slot->start + slot->offset, size); + ret =3D hv_vm_protect(start, size, + HV_MEMORY_READ | HV_MEMORY_WRITE | HV_MEMORY_EXEC); + assert_hvf_ok(ret); + } + + return true; +} + void hvf_init_memslots(void) { memory_listener_register(&hvf_memory_listener, &address_space_memory); diff --git a/include/sysemu/hvf_int.h b/include/sysemu/hvf_int.h index 0aafbc9357..16e5faf0ff 100644 --- a/include/sysemu/hvf_int.h +++ b/include/sysemu/hvf_int.h @@ -17,18 +17,6 @@ #include #endif =20 -/* HVFSlot flags */ -#define HVF_SLOT_LOG (1 << 0) -#define HVF_SLOT_READONLY (1 << 1) - -typedef struct HVFSlot { - hwaddr start; - hwaddr size; /* 0 if the slot is free */ - hwaddr offset; /* offset within memory region */ - uint32_t flags; - MemoryRegion *region; -} HVFSlot; - typedef struct hvf_vcpu_caps { uint64_t vmx_cap_pinbased; uint64_t vmx_cap_procbased; @@ -58,11 +46,11 @@ int hvf_arch_init(void); int hvf_arch_init_vcpu(CPUState *cpu); void hvf_arch_vcpu_destroy(CPUState *cpu); int hvf_vcpu_exec(CPUState *); -HVFSlot *hvf_find_overlap_slot(hwaddr, hwaddr); int hvf_put_registers(CPUState *); int hvf_get_registers(CPUState *); void hvf_kick_vcpu_thread(CPUState *cpu); =20 +bool hvf_access_memory(hwaddr address, bool write); void hvf_init_memslots(void); =20 #endif diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c index 4d4ddab348..398ad50a29 100644 --- a/target/arm/hvf/hvf.c +++ b/target/arm/hvf/hvf.c @@ -1202,6 +1202,11 @@ int hvf_vcpu_exec(CPUState *cpu) break; } =20 + if (iswrite && + hvf_access_memory(hvf_exit->exception.physical_address, 1)) { + break; + } + assert(isv); =20 if (iswrite) { diff --git a/target/i386/hvf/hvf.c b/target/i386/hvf/hvf.c index 2ddb4fc825..c4c544dc54 100644 --- a/target/i386/hvf/hvf.c +++ b/target/i386/hvf/hvf.c @@ -113,7 +113,7 @@ void hvf_handle_io(CPUArchState *env, uint16_t port, vo= id *buffer, } } =20 -static bool ept_emulation_fault(HVFSlot *slot, uint64_t gpa, uint64_t ept_= qual) +static bool ept_emulation_fault(uint64_t gpa, uint64_t ept_qual) { int read, write; =20 @@ -129,14 +129,6 @@ static bool ept_emulation_fault(HVFSlot *slot, uint64_= t gpa, 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 @@ -147,14 +139,11 @@ static bool ept_emulation_fault(HVFSlot *slot, uint64= _t gpa, uint64_t ept_qual) return false; } =20 - if (!slot) { - return true; + if (hvf_access_memory(gpa, write)) { + return false; } - if (!memory_region_is_ram(slot->region) && - !(read && memory_region_is_romd(slot->region))) { - return true; - } - return false; + + return true; } =20 void hvf_arch_vcpu_destroy(CPUState *cpu) @@ -469,7 +458,6 @@ int hvf_vcpu_exec(CPUState *cpu) /* Need to check if MMIO or unmapped fault */ case EXIT_REASON_EPT_FAULT: { - HVFSlot *slot; uint64_t gpa =3D rvmcs(cpu->hvf->fd, VMCS_GUEST_PHYSICAL_ADDRE= SS); =20 if (((idtvec_info & VMCS_IDT_VEC_VALID) =3D=3D 0) && @@ -477,9 +465,8 @@ int hvf_vcpu_exec(CPUState *cpu) vmx_set_nmi_blocking(cpu); } =20 - slot =3D hvf_find_overlap_slot(gpa, 1); /* mmio */ - if (ept_emulation_fault(slot, gpa, exit_qual)) { + if (ept_emulation_fault(gpa, exit_qual)) { struct x86_decode decode; =20 load_regs(cpu); --=20 2.32.0 (Apple Git-132) From nobody Sun Feb 8 18:47:51 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1646227681320962.7505365566914; Wed, 2 Mar 2022 05:28:01 -0800 (PST) Received: from localhost ([::1]:34160 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nPP1L-0002gh-TN for importer@patchew.org; Wed, 02 Mar 2022 08:27:59 -0500 Received: from eggs.gnu.org ([209.51.188.92]:47912) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nPO4H-0001ig-Fb for qemu-devel@nongnu.org; Wed, 02 Mar 2022 07:26:57 -0500 Received: from [2607:f8b0:4864:20::529] (port=42620 helo=mail-pg1-x529.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nPO4F-0000iF-Pm for qemu-devel@nongnu.org; Wed, 02 Mar 2022 07:26:57 -0500 Received: by mail-pg1-x529.google.com with SMTP id o8so1482418pgf.9 for ; Wed, 02 Mar 2022 04:26:55 -0800 (PST) Received: from localhost.localdomain (2001-b011-e000-59d7-a02b-4f1b-c415-11a0.dynamic-ip6.hinet.net. [2001:b011:e000:59d7:a02b:4f1b:c415:11a0]) by smtp.gmail.com with ESMTPSA id mu1-20020a17090b388100b001bedddf2000sm4912971pjb.14.2022.03.02.04.26.52 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Wed, 02 Mar 2022 04:26:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=NNU3kDNYeQnPNa4auhryDFqI7kD27cCHuRDqOJvwXMA=; b=lwYRe5Umr+PF+OQP5b51SlW9snZPczF0z9NJ7yez/0/lxOEpq0xENdIuZK6xBPKsg3 5M5JpuNS0OXoQFmgmpG4pf6cMVIztusTl1p35xVOO6wWWLD1OKVnMzOYy6Q+86MbR7ZS twD/kXnBTzjF8Ias7iTtpzyqQKiSJaBGVQAGWfShMdPuRaAjLFKZPo/BmuHVtNdSV8bM 2uhNDfKlf7iT3SvZWhrupyzPgasLB/fVJWvsgEFYm6krw8kER482iL+KcGI1BJPbI6mr WCVQxmjtzCJwkHaEsKbSZV6cRsWsVyq/3xDyUcuWtzF2us+EnRL02+jCmb7/yIgwXtTW ZN/w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=NNU3kDNYeQnPNa4auhryDFqI7kD27cCHuRDqOJvwXMA=; b=7UCPm1aP4J94IqsQB5e6wuioiPCrMRvECRFND8XdSZmeLg8ARflheEhs0oQlpPQBql HqK7BWANdLIvTmppMJHXvf0lYpGlRpP/7rYtILMQ19LUwtFAIf/GyUpuBSr2bsyuin8e 2ERCAmLN0HiTjKZJAzNaDD772wN9zsl/IAtXn+T5+4/rZd69XvdQU1M+fh6tMfN675Wc TVtgYGhtrB2qitOqvISFJOPCb4vSTMrNnWQvWgsPHNZk1d2ikZw22YePEYZqDBLjP7d6 +r9bHh9y/mt7sWJfL4LiXao3nxZOsxdubQZPt2T7c8nzncY0Kdx39+BGRhvH6sgqK06W 7HIw== X-Gm-Message-State: AOAM531pEhvtm/7J8NMQKZrMy54w2AbNImyc79+AMBCq0A/l5eLFMYOW HIdGEjTWDAI3yQH8fjPsTNplwfe4oYypIg== X-Google-Smtp-Source: ABdhPJyNSw/iHUFmo0Hbc2oflbOgUj9CSodqMC5kB8eFFNpciKbLdSFsvGBmeL9eVW+TKgQs1CqPZQ== X-Received: by 2002:a62:8085:0:b0:4df:443c:7227 with SMTP id j127-20020a628085000000b004df443c7227mr15032163pfd.34.1646224014036; Wed, 02 Mar 2022 04:26:54 -0800 (PST) From: Yan-Jie Wang To: qemu-devel@nongnu.org Subject: [PATCH v2 6/9] hvf: add a lock for memory related functions Date: Wed, 2 Mar 2022 20:26:08 +0800 Message-Id: <20220302122611.15237-7-ubzeme@gmail.com> X-Mailer: git-send-email 2.32.0 (Apple Git-132) In-Reply-To: <20220302122611.15237-1-ubzeme@gmail.com> References: <20220302122611.15237-1-ubzeme@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2607:f8b0:4864:20::529 (failed) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::529; envelope-from=ubzeme@gmail.com; helo=mail-pg1-x529.google.com X-Spam_score_int: -6 X-Spam_score: -0.7 X-Spam_bar: / X-Spam_report: (-0.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Peter Maydell , Roman Bolshakov , Alexander Graf , Cameron Esfahani , Yan-Jie Wang Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1646227682863100001 Content-Type: text/plain; charset="utf-8" We follow how KVM accel does in its memory listener (kvm-all.c) and add a lock for the memory related functions. Signed-off-by: Yan-Jie Wang --- accel/hvf/hvf-mem.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/accel/hvf/hvf-mem.c b/accel/hvf/hvf-mem.c index 896e718374..081029ba98 100644 --- a/accel/hvf/hvf-mem.c +++ b/accel/hvf/hvf-mem.c @@ -43,6 +43,7 @@ typedef struct HVFSlot { } HVFSlot; =20 static HVFSlot memslots[HVF_NUM_SLOTS]; +static QemuMutex memlock; =20 static HVFSlot *hvf_find_overlap_slot(hwaddr start, hwaddr size) { @@ -140,6 +141,8 @@ static void hvf_set_phys_mem(MemoryRegionSection *secti= on, bool add) readonly =3D memory_region_is_rom(area) || memory_region_is_romd(a= rea); =20 /* setup a slot */ + qemu_mutex_lock(&memlock); + slot =3D hvf_find_free_slot(); if (!slot) { error_report("No free slots"); @@ -169,8 +172,12 @@ static void hvf_set_phys_mem(MemoryRegionSection *sect= ion, bool add) =20 ret =3D hv_vm_map(host_addr, start, size, flags); assert_hvf_ok(ret); + + qemu_mutex_unlock(&memlock); } else { /* remove memory region */ + qemu_mutex_lock(&memlock); + slot =3D hvf_find_overlap_slot(start, size); =20 if (slot) { @@ -179,6 +186,8 @@ static void hvf_set_phys_mem(MemoryRegionSection *secti= on, bool add) =20 slot->size =3D 0; } + + qemu_mutex_unlock(&memlock); } } =20 @@ -186,6 +195,8 @@ static void hvf_set_dirty_tracking(MemoryRegionSection = *section, bool on) { HVFSlot *slot; =20 + qemu_mutex_lock(&memlock); + slot =3D hvf_find_overlap_slot( section->offset_within_address_space, int128_get64(section->size)); @@ -201,6 +212,8 @@ static void hvf_set_dirty_tracking(MemoryRegionSection = *section, bool on) hv_vm_protect((uintptr_t)slot->start, (size_t)slot->size, HV_MEMORY_READ | HV_MEMORY_WRITE | HV_MEMORY_EXEC); } + + qemu_mutex_unlock(&memlock); } =20 static void hvf_log_start(MemoryListener *listener, @@ -271,10 +284,13 @@ bool hvf_access_memory(hwaddr address, bool write) hv_return_t ret; hwaddr start, size; =20 + qemu_mutex_lock(&memlock); + slot =3D hvf_find_overlap_slot(address, 1); =20 if (!slot || (write && slot->flags & HVF_SLOT_READONLY)) { /* MMIO or unmapped area, return false */ + qemu_mutex_unlock(&memlock); return false; } =20 @@ -290,10 +306,12 @@ bool hvf_access_memory(hwaddr address, bool write) assert_hvf_ok(ret); } =20 + qemu_mutex_unlock(&memlock); return true; } =20 void hvf_init_memslots(void) { + qemu_mutex_init(&memlock); memory_listener_register(&hvf_memory_listener, &address_space_memory); } --=20 2.32.0 (Apple Git-132) From nobody Sun Feb 8 18:47:51 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 164622796383064.36751823825045; Wed, 2 Mar 2022 05:32:43 -0800 (PST) Received: from localhost ([::1]:41658 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nPP5u-00082E-S6 for importer@patchew.org; Wed, 02 Mar 2022 08:32:42 -0500 Received: from eggs.gnu.org ([209.51.188.92]:47940) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nPO4J-0001oA-Dw for qemu-devel@nongnu.org; Wed, 02 Mar 2022 07:26:59 -0500 Received: from [2607:f8b0:4864:20::42c] (port=45752 helo=mail-pf1-x42c.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nPO4H-0000j7-TO for qemu-devel@nongnu.org; Wed, 02 Mar 2022 07:26:59 -0500 Received: by mail-pf1-x42c.google.com with SMTP id u16so1797594pfg.12 for ; Wed, 02 Mar 2022 04:26:57 -0800 (PST) Received: from localhost.localdomain (2001-b011-e000-59d7-a02b-4f1b-c415-11a0.dynamic-ip6.hinet.net. [2001:b011:e000:59d7:a02b:4f1b:c415:11a0]) by smtp.gmail.com with ESMTPSA id mu1-20020a17090b388100b001bedddf2000sm4912971pjb.14.2022.03.02.04.26.54 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Wed, 02 Mar 2022 04:26:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=gV9Cvlo7ft4KghRJ8ZPgxvTZ4fIVH8yA6Q+ea3wVuzI=; b=kHB22itj1Ar9QQ3A57iYQhI2aEh7uKLTXG/2zT/UW5YTtyfyYnzEHcw1N5nvy5/EFj BeKAe91XsoEjC2MS0DCsU6xwKFwN4oE5wTvWj2qldW5YRJ8goWI4eh3/4IiaxlRoFurD h4jOiYLmXjhmjC6f/BCdS76Xm52BaLz4Y1TsImkOzMWnMfn+jurusFIfFN3IPl+tVkiF bOwt2qi2zgzwLNBbeBWg37g4XE7npgp61UGDw+NXfEistT91aoEKFhgGZ+LjZ0KNLhKo +7EYJb1fNNrO3PaDsANk0QXY3EEo8lBIKJp3j4gdjPVmz4p6OdEzm5jZdBVnhxBUc1tR +MRw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=gV9Cvlo7ft4KghRJ8ZPgxvTZ4fIVH8yA6Q+ea3wVuzI=; b=q5TLYYsTjYyrj6MjdLkkBZEo5+RxC/2CuLJAS6V73AD1EoWREwcnCSLCPXnKwVjkA+ 2Z/+Lx0Gbw8LlRZpBLxlDm2S62DDAIBgbEpZr4r8YDfu3s186hvhlagu8dZDd58QtglC Ew/7uz/vCzlRL0F2ruXEcX8hHfmx6FVXqYywc6N5u1S9nvwk7HsCFJlH3L13IqweIhaf 3ICtsrm2nUPbNIRE0unSYRwpQ0LDdgM8ROO1hXHQAPE2APyj/msXnGSxnTXDHFepwT+H tUvRztghSxm25yg90siFc3YotxTROFd9UEPX/5CsTk4/KVFIgPiis2Imnyy6IufD1lrP 2sbA== X-Gm-Message-State: AOAM530xl2WkDFv1u9k8oL5IPAtmhLjI3mx0q3/ZeSVf9tCq4BP6NaK1 AybZ73YaDGwT8HEXuAbvLQaBXZekNYRf6g== X-Google-Smtp-Source: ABdhPJwtXyrlazsyaG4dk6fnAPxhGzixzlKd7tRjt2l0zdWs0apdrsegjKTse7RW4834k5RqOIMzdA== X-Received: by 2002:a65:6794:0:b0:36c:460e:858d with SMTP id e20-20020a656794000000b0036c460e858dmr25897380pgr.418.1646224016183; Wed, 02 Mar 2022 04:26:56 -0800 (PST) From: Yan-Jie Wang To: qemu-devel@nongnu.org Subject: [PATCH v2 7/9] hvf: use GTree to store memory slots instead of fixed-size array Date: Wed, 2 Mar 2022 20:26:09 +0800 Message-Id: <20220302122611.15237-8-ubzeme@gmail.com> X-Mailer: git-send-email 2.32.0 (Apple Git-132) In-Reply-To: <20220302122611.15237-1-ubzeme@gmail.com> References: <20220302122611.15237-1-ubzeme@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2607:f8b0:4864:20::42c (failed) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::42c; envelope-from=ubzeme@gmail.com; helo=mail-pf1-x42c.google.com X-Spam_score_int: -6 X-Spam_score: -0.7 X-Spam_bar: / X-Spam_report: (-0.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Peter Maydell , Roman Bolshakov , Alexander Graf , Cameron Esfahani , Yan-Jie Wang Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1646227965916100001 Content-Type: text/plain; charset="utf-8" Currently, there are only 32 memory slots in the fixed size array. It is not scalable. Instead of using fixed size array, use GTree (from glib library) and dynamically-allocated structures to store memory slots. Signed-off-by: Yan-Jie Wang --- accel/hvf/hvf-mem.c | 63 +++++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 31 deletions(-) diff --git a/accel/hvf/hvf-mem.c b/accel/hvf/hvf-mem.c index 081029ba98..2f70ceb307 100644 --- a/accel/hvf/hvf-mem.c +++ b/accel/hvf/hvf-mem.c @@ -28,8 +28,6 @@ =20 /* Memory slots */ =20 -#define HVF_NUM_SLOTS 32 - /* HVFSlot flags */ #define HVF_SLOT_LOG (1 << 0) #define HVF_SLOT_READONLY (1 << 1) @@ -42,35 +40,24 @@ typedef struct HVFSlot { MemoryRegion *region; } HVFSlot; =20 -static HVFSlot memslots[HVF_NUM_SLOTS]; +static GTree *memslots; static QemuMutex memlock; =20 static HVFSlot *hvf_find_overlap_slot(hwaddr start, hwaddr size) { - HVFSlot *slot; - int x; - for (x =3D 0; x < HVF_NUM_SLOTS; ++x) { - slot =3D &memslots[x]; - if (slot->size && start < (slot->start + slot->size) && - (start + size) > slot->start) { - return slot; - } - } - return NULL; + HVFSlot key =3D {.start =3D start, .size =3D 1}; + return g_tree_lookup(memslots, &key); } =20 -static HVFSlot *hvf_find_free_slot(void) +static void hvf_insert_slot(HVFSlot *slot) { - HVFSlot *slot; - int x; - for (x =3D 0; x < HVF_NUM_SLOTS; x++) { - slot =3D &memslots[x]; - if (!slot->size) { - return slot; - } - } + g_tree_insert(memslots, slot, slot); +} =20 - return NULL; +static bool hvf_remove_slot(hwaddr start) +{ + HVFSlot key =3D {.start =3D start, .size =3D 1}; + return g_tree_remove(memslots, &key); } =20 /* @@ -141,9 +128,7 @@ static void hvf_set_phys_mem(MemoryRegionSection *secti= on, bool add) readonly =3D memory_region_is_rom(area) || memory_region_is_romd(a= rea); =20 /* setup a slot */ - qemu_mutex_lock(&memlock); - - slot =3D hvf_find_free_slot(); + slot =3D g_new0(HVFSlot, 1); if (!slot) { error_report("No free slots"); abort(); @@ -170,6 +155,10 @@ static void hvf_set_phys_mem(MemoryRegionSection *sect= ion, bool add) flags =3D HV_MEMORY_READ | HV_MEMORY_WRITE | HV_MEMORY_EXEC; } =20 + qemu_mutex_lock(&memlock); + + hvf_insert_slot(slot); + ret =3D hv_vm_map(host_addr, start, size, flags); assert_hvf_ok(ret); =20 @@ -178,13 +167,9 @@ static void hvf_set_phys_mem(MemoryRegionSection *sect= ion, bool add) /* remove memory region */ qemu_mutex_lock(&memlock); =20 - slot =3D hvf_find_overlap_slot(start, size); - - if (slot) { + if (hvf_remove_slot(start)) { ret =3D hv_vm_unmap(start, size); assert_hvf_ok(ret); - - slot->size =3D 0; } =20 qemu_mutex_unlock(&memlock); @@ -310,8 +295,24 @@ bool hvf_access_memory(hwaddr address, bool write) return true; } =20 +/* compare function for GTree */ +static gint _hvf_slot_compare(gconstpointer a, gconstpointer b, gpointer d= ata) +{ + const HVFSlot *m1 =3D (const HVFSlot *)a; + const HVFSlot *m2 =3D (const HVFSlot *)b; + + if (m2->start >=3D m1->start + m1->size) { + return -1; + } else if (m1->start >=3D m2->start + m2->size) { + return 1; + } + + return 0; +} + void hvf_init_memslots(void) { qemu_mutex_init(&memlock); + memslots =3D g_tree_new_full(_hvf_slot_compare, NULL, g_free, NULL); memory_listener_register(&hvf_memory_listener, &address_space_memory); } --=20 2.32.0 (Apple Git-132) From nobody Sun Feb 8 18:47:51 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 16462245951341019.7889280870489; Wed, 2 Mar 2022 04:36:35 -0800 (PST) Received: from localhost ([::1]:34294 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nPODa-0007dw-1Q for importer@patchew.org; Wed, 02 Mar 2022 07:36:34 -0500 Received: from eggs.gnu.org ([209.51.188.92]:47960) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nPO4M-0001vk-Tx for qemu-devel@nongnu.org; Wed, 02 Mar 2022 07:27:03 -0500 Received: from [2607:f8b0:4864:20::534] (port=46059 helo=mail-pg1-x534.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nPO4K-0000k2-F7 for qemu-devel@nongnu.org; Wed, 02 Mar 2022 07:27:02 -0500 Received: by mail-pg1-x534.google.com with SMTP id z4so1474665pgh.12 for ; Wed, 02 Mar 2022 04:27:00 -0800 (PST) Received: from localhost.localdomain (2001-b011-e000-59d7-a02b-4f1b-c415-11a0.dynamic-ip6.hinet.net. [2001:b011:e000:59d7:a02b:4f1b:c415:11a0]) by smtp.gmail.com with ESMTPSA id mu1-20020a17090b388100b001bedddf2000sm4912971pjb.14.2022.03.02.04.26.56 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Wed, 02 Mar 2022 04:26:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=1ZpqVs0GOXjw29QL63IperGwYuGKOgudlGW4UMUfkyw=; b=ooBP1zmHySgKqTsVnDi2tCohsng4sNp+2FMXCtog030XXCNgcn6oDHBYiIH0ejKNzD a/ljvpjWQSmsfThQwNgjY0scj3YFxqOVFCx8OHl5olNSC2hj3bXZcLXLeIrEmyACUrza dTExcpMAjEu6sFMkxBQSIoyU1axQDNsArijw+lJP5wd6KQKnft0O28HXdGOVozeWI6Xu BLdzFkrAWodyP4dBwR8IB8OjF6lQ7gDNR8i64NDP/HO3EPl/STJIcYnjclLV2IED/vqf IRu3OpyxkUuKIyXmgWkMl+4K6VKv7kkVuhhK9wqaI5UM0cLYFj+N3o9OTaofG4xKr4Ap eNWg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=1ZpqVs0GOXjw29QL63IperGwYuGKOgudlGW4UMUfkyw=; b=qN0kySPhHXWLTrZ5N5lOu0FtDE7YXVxut7MMMojTmrcT8w35E8UoU2Mkd5sogBQ6qf 8goPnVB30A0PDpEo3PWK4982n7Gk+CRDhWxD6Ej1a7K5s1Ys8pKO7ifhPzR+0yvXkp5C PVTMelrhGq+MJV3VtQTAd7GOmd4x1fp7LrPU0qfu5TEHiEbdQu4MmB2J9llY2Q3kzK/+ 82Wx7pc+Q6rziPXJX6KB4b+hz/hXGZE+JbmPUXJPVVR4qwxNFT3H+N5pmUAwuSMdbGLw uTM7MKuiPp42MclhLgGGuAVYMRHQn3rdrBM/u7NfsGKM8FAQOfao3X1+UqxGIacwoWYl eGIg== X-Gm-Message-State: AOAM532VGK7nzJ1dzDI2p9WMtUOyniJDmIXLGIY+1QQ56Iv2RywrE3TS YIqpoX4GkPpyJDtVUC6Ox/ooS4m0JgolZg== X-Google-Smtp-Source: ABdhPJxlt809y5AM3BXHRwFm0Gefh35bh80tYfS5+wbHbEJnJCn5xJn1abOhwbRp6kQT3ZSLz5bNPQ== X-Received: by 2002:a63:d607:0:b0:378:c5ee:50c0 with SMTP id q7-20020a63d607000000b00378c5ee50c0mr9978402pgg.333.1646224018679; Wed, 02 Mar 2022 04:26:58 -0800 (PST) From: Yan-Jie Wang To: qemu-devel@nongnu.org Subject: [PATCH v2 8/9] hvf: only consider directly writeable memory regions for dirty-tracking Date: Wed, 2 Mar 2022 20:26:10 +0800 Message-Id: <20220302122611.15237-9-ubzeme@gmail.com> X-Mailer: git-send-email 2.32.0 (Apple Git-132) In-Reply-To: <20220302122611.15237-1-ubzeme@gmail.com> References: <20220302122611.15237-1-ubzeme@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2607:f8b0:4864:20::534 (failed) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::534; envelope-from=ubzeme@gmail.com; helo=mail-pg1-x534.google.com X-Spam_score_int: -6 X-Spam_score: -0.7 X-Spam_bar: / X-Spam_report: (-0.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Peter Maydell , Roman Bolshakov , Alexander Graf , Cameron Esfahani , Yan-Jie Wang Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1646224596374100001 Content-Type: text/plain; charset="utf-8" It is no need to dirty-track MMIO regions or other readonly regions. Before we start or stop to dirty-track a memory region, check the type of the memory region. The region must be a writeable ram to be dirty-tracked. Signed-off-by: Yan-Jie Wang --- accel/hvf/hvf-mem.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/accel/hvf/hvf-mem.c b/accel/hvf/hvf-mem.c index 2f70ceb307..b215386bc8 100644 --- a/accel/hvf/hvf-mem.c +++ b/accel/hvf/hvf-mem.c @@ -180,6 +180,11 @@ static void hvf_set_dirty_tracking(MemoryRegionSection= *section, bool on) { HVFSlot *slot; =20 + if (!memory_region_is_ram(section->mr) || memory_region_is_rom(section= )) { + /* do not consider memory regions which are not directly writeable= */ + return; + } + qemu_mutex_lock(&memlock); =20 slot =3D hvf_find_overlap_slot( --=20 2.32.0 (Apple Git-132) From nobody Sun Feb 8 18:47:51 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1646228786560998.7682039420947; Wed, 2 Mar 2022 05:46:26 -0800 (PST) Received: from localhost ([::1]:41992 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nPPJB-0002de-I3 for importer@patchew.org; Wed, 02 Mar 2022 08:46:25 -0500 Received: from eggs.gnu.org ([209.51.188.92]:47968) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nPO4N-0001xB-U5 for qemu-devel@nongnu.org; Wed, 02 Mar 2022 07:27:03 -0500 Received: from [2607:f8b0:4864:20::633] (port=37745 helo=mail-pl1-x633.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nPO4M-0000kP-C2 for qemu-devel@nongnu.org; Wed, 02 Mar 2022 07:27:03 -0500 Received: by mail-pl1-x633.google.com with SMTP id n15so1427811plf.4 for ; Wed, 02 Mar 2022 04:27:01 -0800 (PST) Received: from localhost.localdomain (2001-b011-e000-59d7-a02b-4f1b-c415-11a0.dynamic-ip6.hinet.net. [2001:b011:e000:59d7:a02b:4f1b:c415:11a0]) by smtp.gmail.com with ESMTPSA id mu1-20020a17090b388100b001bedddf2000sm4912971pjb.14.2022.03.02.04.26.58 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Wed, 02 Mar 2022 04:27:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=FU0IylXrpCykU8A5fU0ogXV82XSWWHTLV5WNe7DNXpk=; b=lJcPnsMPj8Mr3q/omPtYciAmlxgIDGAsT+jBrPoeN+Br/vgzLpGXjWgpJhM1cOiWyI cEyoqtFuSdj0v11h1cYTq+AMybQ1NeNURQC4VnqFZbvLRz2vErx4SMmjofpejfPpasXM wFPBRHxCL6EhnOq3dqkpdlTc1JnBcVylKMvDO3U3LByJH1IuQskNJkJikD2izLpWYxYH f9u72+Ane5x4nwW5U4TOnt3XwdHcjr4jB+Cw2XoZ/9H2Q68sMlcP/gkirO1RAtKVs1Ke eftrrkFwJ9dpPsVSGtxXlFRTkh2mjOXfDdh8G6Z8D+7LBeuKWFS0U+I1DFkhniU0ZsEt wDBw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=FU0IylXrpCykU8A5fU0ogXV82XSWWHTLV5WNe7DNXpk=; b=YWoV48mrcM+TQpQXGaD4ovA9mtVlcr1/e5impvFjG37NPHGlLu+muw60m8XYJ+Fahs 8VWrq6MpNSa1Oi2Ufn0z7mnyc45NNwsZc22XirPEWbHXojZppXbk7Km4zeUIr6MQ4u+S xyXhHrFtEcfJxJusTffpUBPwi8yL55R1aUmyWGnlEfkDthceuJnF+zTfpRzD96/fj3I5 uKKjdIfixPYWgqAPfp3uKGu4P61HoxKPP+o+XO+FPZECJyH99ZeL1xjP3ehJGxz7T3IA YLMd7iR5/40IMqJUayx9cIplRhQhjE/XF0L9qk/lNapdpeNbXztdpOJEJwoCvpwn2PgV t4jQ== X-Gm-Message-State: AOAM532sEtVU1XgGKKBFy45m8rfsxFJ/emmk1zck1Aroxr0uD1fRvdxw C2F/JLDKqdheAwNHyrtFlUi59R22EbWLpg== X-Google-Smtp-Source: ABdhPJx0inuo4yz5c4MCI65kUsIHfiwBoLS/vguvDPMKssLEgZjavwnoBGKj4RuUz+xZvfYH7ec1MQ== X-Received: by 2002:a17:902:b602:b0:14f:e42b:d547 with SMTP id b2-20020a170902b60200b0014fe42bd547mr30874569pls.91.1646224020728; Wed, 02 Mar 2022 04:27:00 -0800 (PST) From: Yan-Jie Wang To: qemu-devel@nongnu.org Subject: [PATCH v2 9/9] hvf: remove the need to lookup memory slots when clearing dirty-bits Date: Wed, 2 Mar 2022 20:26:11 +0800 Message-Id: <20220302122611.15237-10-ubzeme@gmail.com> X-Mailer: git-send-email 2.32.0 (Apple Git-132) In-Reply-To: <20220302122611.15237-1-ubzeme@gmail.com> References: <20220302122611.15237-1-ubzeme@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2607:f8b0:4864:20::633 (failed) Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::633; envelope-from=ubzeme@gmail.com; helo=mail-pl1-x633.google.com X-Spam_score_int: -6 X-Spam_score: -0.7 X-Spam_bar: / X-Spam_report: (-0.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Peter Maydell , Roman Bolshakov , Alexander Graf , Cameron Esfahani , Yan-Jie Wang Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1646228789771100001 Content-Type: text/plain; charset="utf-8" Originally, when log_clear gets called, log_clear calls hvf_set_dirty_tracking to write-protect memory slots whose dirty-bits are cleared. Calling hvf_set_dirty_tracking means that memory slots will be look up and the lock for memory slots will be held during the call. We can use the parameter `section` passed by the caller to determine the pages that need to be write-protected. Compared to the original method, this saves time. Moreover, this makes only pages whose dirty-bits are cleared write-protected instead of making the whole memory slot write-protected. Signed-off-by: Yan-Jie Wang --- accel/hvf/hvf-mem.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/accel/hvf/hvf-mem.c b/accel/hvf/hvf-mem.c index b215386bc8..7a588b70e1 100644 --- a/accel/hvf/hvf-mem.c +++ b/accel/hvf/hvf-mem.c @@ -84,7 +84,10 @@ static hwaddr hvf_align_section(MemoryRegionSection *sec= tion, size =3D (size - _delta) & qemu_real_host_page_mask; =20 *start =3D _start; - *delta =3D _delta; + + if (delta) { + *delta =3D _delta; + } =20 return size; } @@ -229,11 +232,21 @@ static void hvf_log_stop(MemoryListener *listener, static void hvf_log_clear(MemoryListener *listener, MemoryRegionSection *section) { + hwaddr start, size; + + if (!memory_region_is_ram(section->mr) || memory_region_is_rom(section= )) { + /* do not consider memory regions which are not directly writeable= */ + return; + } + /* * The dirty bits are being cleared. * Make the section write-protected again. */ - hvf_set_dirty_tracking(section, 1); + size =3D hvf_align_section(section, &start, NULL); + if (size) { + hv_vm_protect(start, size, HV_MEMORY_READ | HV_MEMORY_EXEC); + } } =20 static void hvf_region_add(MemoryListener *listener, --=20 2.32.0 (Apple Git-132)