mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 00:03:54 -06:00
memory: manage coalesced mmio via a MemoryListener
Instead of calling a global function on coalesced mmio changes, which routes the call to kvm if enabled, add coalesced mmio hooks to MemoryListener and make kvm use that instead. The motivation is support for multiple address spaces (which means we we need to filter the call on the right address space) but the result is cleaner as well. Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
parent
bf83601fdd
commit
95d2994a2f
6 changed files with 27 additions and 39 deletions
17
memory.c
17
memory.c
|
@ -1136,11 +1136,19 @@ static void memory_region_update_coalesced_range_as(MemoryRegion *mr, AddressSpa
|
|||
FlatRange *fr;
|
||||
CoalescedMemoryRange *cmr;
|
||||
AddrRange tmp;
|
||||
MemoryRegionSection section;
|
||||
|
||||
FOR_EACH_FLAT_RANGE(fr, as->current_map) {
|
||||
if (fr->mr == mr) {
|
||||
qemu_unregister_coalesced_mmio(int128_get64(fr->addr.start),
|
||||
int128_get64(fr->addr.size));
|
||||
section = (MemoryRegionSection) {
|
||||
.address_space = as->root,
|
||||
.offset_within_address_space = int128_get64(fr->addr.start),
|
||||
.size = int128_get64(fr->addr.size),
|
||||
};
|
||||
|
||||
MEMORY_LISTENER_CALL(coalesced_mmio_del, Reverse, §ion,
|
||||
int128_get64(fr->addr.start),
|
||||
int128_get64(fr->addr.size));
|
||||
QTAILQ_FOREACH(cmr, &mr->coalesced, link) {
|
||||
tmp = addrrange_shift(cmr->addr,
|
||||
int128_sub(fr->addr.start,
|
||||
|
@ -1149,8 +1157,9 @@ static void memory_region_update_coalesced_range_as(MemoryRegion *mr, AddressSpa
|
|||
continue;
|
||||
}
|
||||
tmp = addrrange_intersection(tmp, fr->addr);
|
||||
qemu_register_coalesced_mmio(int128_get64(tmp.start),
|
||||
int128_get64(tmp.size));
|
||||
MEMORY_LISTENER_CALL(coalesced_mmio_add, Forward, §ion,
|
||||
int128_get64(tmp.start),
|
||||
int128_get64(tmp.size));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue