On 2025/11/03 19:10, Philippe Mathieu-Daudé wrote:
> From: Richard Henderson <richard.henderson@linaro.org>
>
> All of the complicated parts of updating the address space
> are handled by address_space_update_topology_pass.
> Do not create or use hvf_slot structures.
>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> ---
> accel/hvf/hvf-all.c | 111 +++++++-------------------------------------
> 1 file changed, 17 insertions(+), 94 deletions(-)
>
> diff --git a/accel/hvf/hvf-all.c b/accel/hvf/hvf-all.c
> index f203a6251f0..76b8d4d4068 100644
> --- a/accel/hvf/hvf-all.c
> +++ b/accel/hvf/hvf-all.c
> @@ -87,45 +87,16 @@ void hvf_unprotect_dirty_range(hwaddr addr, size_t size)
> HV_MEMORY_READ | HV_MEMORY_WRITE | HV_MEMORY_EXEC);
> }
>
> -static int do_hvf_set_memory(hvf_slot *slot, hv_memory_flags_t flags)
> -{
> - struct mac_slot *macslot;
> - hv_return_t ret;
> -
> - macslot = &mac_slots[slot->slot_id];
> -
> - if (macslot->present) {
> - if (macslot->size != slot->size) {
> - macslot->present = 0;
> - trace_hvf_vm_unmap(macslot->gpa_start, macslot->size);
> - ret = hv_vm_unmap(macslot->gpa_start, macslot->size);
> - assert_hvf_ok(ret);
> - }
> - }
> -
> - if (!slot->size) {
> - return 0;
> - }
> -
> - macslot->present = 1;
> - macslot->gpa_start = slot->start;
> - macslot->size = slot->size;
> - trace_hvf_vm_map(slot->start, slot->size, slot->mem, flags,
> - flags & HV_MEMORY_READ ? 'R' : '-',
> - flags & HV_MEMORY_WRITE ? 'W' : '-',
> - flags & HV_MEMORY_EXEC ? 'X' : '-');
> - ret = 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 = section->mr;
> bool writable = !area->readonly && !area->rom_device;
> hv_memory_flags_t flags;
> uint64_t page_size = qemu_real_host_page_size();
> + uint64_t gva = section->offset_within_address_space;
> + uint64_t size = int128_get64(section->size);
> + hv_return_t ret;
> + void *mem;
>
> if (!memory_region_is_ram(area)) {
> if (writable) {
> @@ -139,69 +110,28 @@ static void hvf_set_phys_mem(MemoryRegionSection *section, bool add)
> }
> }
>
> - if (!QEMU_IS_ALIGNED(int128_get64(section->size), page_size) ||
> - !QEMU_IS_ALIGNED(section->offset_within_address_space, page_size)) {
> + if (!QEMU_IS_ALIGNED(size, page_size) ||
> + !QEMU_IS_ALIGNED(gva, page_size)) {
> /* Not page aligned, so we can not map as RAM */
> add = false;
> }
>
> - mem = hvf_find_overlap_slot(
> - section->offset_within_address_space,
> - int128_get64(section->size));
> -
> - if (mem && add) {
> - if (mem->size == int128_get64(section->size) &&
> - mem->start == section->offset_within_address_space &&
> - mem->mem == (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 = 0;
> - if (do_hvf_set_memory(mem, 0)) {
> - error_report("Failed to reset overlapping slot");
> - abort();
> - }
> - }
> -
> if (!add) {
> + trace_hvf_vm_unmap(gva, size);
> + ret = hv_vm_unmap(gva, size);
I think you meant gpa.
> + assert_hvf_ok(ret);
> return;
> }
>
> - if (area->readonly ||
> - (!memory_region_is_ram(area) && memory_region_is_romd(area))) {
> - flags = HV_MEMORY_READ | HV_MEMORY_EXEC;
> - } else {
> - flags = HV_MEMORY_READ | HV_MEMORY_WRITE | HV_MEMORY_EXEC;
> - }
> + flags = HV_MEMORY_READ | HV_MEMORY_EXEC | (writable ? HV_MEMORY_WRITE : 0);
> + mem = memory_region_get_ram_ptr(area) + section->offset_within_region;
>
> - /* Now make a new slot. */
> - int x;
> -
> - for (x = 0; x < hvf_state->num_slots; ++x) {
> - mem = &hvf_state->slots[x];
> - if (!mem->size) {
> - break;
> - }
> - }
> -
> - if (x == hvf_state->num_slots) {
> - error_report("No free slots");
> - abort();
> - }
> -
> - mem->size = int128_get64(section->size);
> - mem->mem = memory_region_get_ram_ptr(area) + section->offset_within_region;
> - mem->start = section->offset_within_address_space;
> - mem->region = area;
> -
> - if (do_hvf_set_memory(mem, flags)) {
> - error_report("Error registering new memory slot");
> - abort();
> - }
> + trace_hvf_vm_map(gva, size, mem, flags,
> + flags & HV_MEMORY_READ ? 'R' : '-',
> + flags & HV_MEMORY_WRITE ? 'W' : '-',
> + flags & HV_MEMORY_EXEC ? 'X' : '-');
> + ret = hv_vm_map(mem, gva, size, flags);
> + assert_hvf_ok(ret);
> }
>
> static void hvf_log_start(MemoryListener *listener,
> @@ -260,7 +190,6 @@ static MemoryListener hvf_memory_listener = {
>
> static int hvf_accel_init(AccelState *as, MachineState *ms)
> {
> - int x;
> hv_return_t ret;
> HVFState *s = HVF_STATE(as);
> int pa_range = 36;
> @@ -281,12 +210,6 @@ static int hvf_accel_init(AccelState *as, MachineState *ms)
> }
> assert_hvf_ok(ret);
>
> - s->num_slots = ARRAY_SIZE(s->slots);
> - for (x = 0; x < s->num_slots; ++x) {
> - s->slots[x].size = 0;
> - s->slots[x].slot_id = x;
> - }
> -
> QTAILQ_INIT(&s->hvf_sw_breakpoints);
>
> hvf_state = s;