diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2013-05-24 12:59:37 +0200 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2013-05-29 16:26:50 +0200 |
commit | 149f54b53b7666a3facd45e86eece60ce7d3b114 (patch) | |
tree | 716ff4eeaca8647f328eb06730476d46adbe6bc0 /translate-all.c | |
parent | b018ddf633f77195e9ae859c6d940a334e68879f (diff) | |
download | qemu-149f54b53b7666a3facd45e86eece60ce7d3b114.tar.gz qemu-149f54b53b7666a3facd45e86eece60ce7d3b114.tar.bz2 qemu-149f54b53b7666a3facd45e86eece60ce7d3b114.zip |
memory: add address_space_translate
Using phys_page_find to translate an AddressSpace to a MemoryRegionSection
is unwieldy. It requires to pass the page index rather than the address,
and later memory_region_section_addr has to be called. Replace
memory_region_section_addr with a function that does all of it: call
phys_page_find, compute the offset within the region, and check how
big the current mapping is. This way, a large flat region can be written
with a single lookup rather than a page at a time.
address_space_translate will also provide a single point where IOMMU
forwarding is implemented.
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Richard Henderson <rth@twiddle.net>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'translate-all.c')
-rw-r--r-- | translate-all.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/translate-all.c b/translate-all.c index 211be314cb..40b8f3d2b5 100644 --- a/translate-all.c +++ b/translate-all.c @@ -1354,15 +1354,15 @@ void tb_invalidate_phys_addr(hwaddr addr) { ram_addr_t ram_addr; MemoryRegionSection *section; + hwaddr l = 1; - section = phys_page_find(address_space_memory.dispatch, - addr >> TARGET_PAGE_BITS); + section = address_space_translate(&address_space_memory, addr, &addr, &l, false); if (!(memory_region_is_ram(section->mr) || memory_region_is_romd(section->mr))) { return; } ram_addr = (memory_region_get_ram_addr(section->mr) & TARGET_PAGE_MASK) - + memory_region_section_addr(section, addr); + + addr; tb_invalidate_phys_page_range(ram_addr, ram_addr + 1, 0); } #endif /* TARGET_HAS_ICE && !defined(CONFIG_USER_ONLY) */ |