From: Richard Henderson <richard.henderson@linaro.org>
Rely on the AddressSpace and MemoryRegion structures
rather than hvf_slot.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
include/system/hvf_int.h | 3 ---
accel/hvf/hvf-all.c | 40 ++++++++++------------------------------
2 files changed, 10 insertions(+), 33 deletions(-)
diff --git a/include/system/hvf_int.h b/include/system/hvf_int.h
index 5a57691885f..ee7ab689f45 100644
--- a/include/system/hvf_int.h
+++ b/include/system/hvf_int.h
@@ -24,9 +24,6 @@ typedef hv_vcpu_t hvf_vcpuid;
typedef hv_vcpuid_t hvf_vcpuid;
#endif
-/* hvf_slot flags */
-#define HVF_SLOT_LOG (1 << 0)
-
typedef struct hvf_slot {
uint64_t start;
uint64_t size;
diff --git a/accel/hvf/hvf-all.c b/accel/hvf/hvf-all.c
index 2efecdc9f40..361d658a186 100644
--- a/accel/hvf/hvf-all.c
+++ b/accel/hvf/hvf-all.c
@@ -203,45 +203,24 @@ static void hvf_set_phys_mem(MemoryRegionSection *section, bool add)
}
}
-static void hvf_set_dirty_tracking(MemoryRegionSection *section, bool on)
-{
- hvf_slot *slot;
-
- slot = hvf_find_overlap_slot(
- section->offset_within_address_space,
- int128_get64(section->size));
-
- /* protect region against writes; begin tracking it */
- if (on) {
- slot->flags |= 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 &= ~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 != 0) {
- return;
+ assert(new != 0);
+ if (old == 0) {
+ hvf_protect_clean_range(section->offset_within_address_space,
+ int128_get64(section->size));
}
-
- hvf_set_dirty_tracking(section, 1);
}
static void hvf_log_stop(MemoryListener *listener,
MemoryRegionSection *section, int old, int new)
{
- if (new != 0) {
- return;
+ assert(old != 0);
+ if (new == 0) {
+ hvf_unprotect_dirty_range(section->offset_within_address_space,
+ int128_get64(section->size));
}
-
- hvf_set_dirty_tracking(section, 0);
}
static void hvf_log_sync(MemoryListener *listener,
@@ -251,7 +230,8 @@ static void hvf_log_sync(MemoryListener *listener,
* sync of dirty pages is handled elsewhere; just make sure we keep
* tracking the region.
*/
- hvf_set_dirty_tracking(section, 1);
+ hvf_protect_clean_range(section->offset_within_address_space,
+ int128_get64(section->size));
}
static void hvf_region_add(MemoryListener *listener,
--
2.51.0