diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2013-05-27 10:47:10 +0200 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2013-06-20 16:32:47 +0200 |
commit | 733d5ef52721a836b1d9b5cd0f15a41db88829d0 (patch) | |
tree | ed24a13a02e60e3744abdea53ca48b59b74b63ef | |
parent | 5b23fd03324096056cf1f6bcf111224760d4c67c (diff) |
exec: reorganize mem_add to match Int128 version
When adding support for 2^64-byte sections, we will have to change
the structure of mem_add to avoid failures in int128_get64.
Reorganize the code now before introducing Int128.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-rw-r--r-- | exec.c | 39 |
1 files changed, 16 insertions, 23 deletions
@@ -824,15 +824,11 @@ static void register_subpage(AddressSpaceDispatch *d, MemoryRegionSection *secti static void register_multipage(AddressSpaceDispatch *d, MemoryRegionSection *section) { hwaddr start_addr = section->offset_within_address_space; - ram_addr_t size = section->size; - hwaddr addr; uint16_t section_index = phys_section_add(section); + uint64_t num_pages = section->size >> TARGET_PAGE_BITS; - assert(size); - - addr = start_addr; - phys_page_set(d, addr >> TARGET_PAGE_BITS, size >> TARGET_PAGE_BITS, - section_index); + assert(num_pages); + phys_page_set(d, start_addr >> TARGET_PAGE_BITS, num_pages, section_index); } static void mem_add(MemoryListener *listener, MemoryRegionSection *section) @@ -840,32 +836,29 @@ static void mem_add(MemoryListener *listener, MemoryRegionSection *section) AddressSpaceDispatch *d = container_of(listener, AddressSpaceDispatch, listener); MemoryRegionSection now = *section, remain = *section; - if ((now.offset_within_address_space & ~TARGET_PAGE_MASK) - || (now.size < TARGET_PAGE_SIZE)) { - now.size = MIN(TARGET_PAGE_ALIGN(now.offset_within_address_space) - - now.offset_within_address_space, - now.size); + if (now.offset_within_address_space & ~TARGET_PAGE_MASK) { + uint64_t left = TARGET_PAGE_ALIGN(now.offset_within_address_space) + - now.offset_within_address_space; + + now.size = MIN(left, now.size); register_subpage(d, &now); + } else { + now.size = 0; + } + while (remain.size != now.size) { remain.size -= now.size; remain.offset_within_address_space += now.size; remain.offset_within_region += now.size; - } - while (remain.size >= TARGET_PAGE_SIZE) { now = remain; - if (remain.offset_within_region & ~TARGET_PAGE_MASK) { + if (remain.size < TARGET_PAGE_SIZE) { + register_subpage(d, &now); + } else if (remain.offset_within_region & ~TARGET_PAGE_MASK) { now.size = TARGET_PAGE_SIZE; register_subpage(d, &now); } else { - now.size &= TARGET_PAGE_MASK; + now.size &= -TARGET_PAGE_SIZE; register_multipage(d, &now); } - remain.size -= now.size; - remain.offset_within_address_space += now.size; - remain.offset_within_region += now.size; - } - now = remain; - if (now.size) { - register_subpage(d, &now); } } |