I have previously posted a variant of part 6, to address the problem of the host returning mmap results that are not page aligned for the guest. That, however, led me to the fact that we could also return addresses that are outside the guest's virtual address space.
Which raises the question of what *is* the guest's virtual address space? For a 32-bit guest, clearly we cannot return anything outside GUEST_BASE through GUEST_BASE+4G. For a 64-bit guest, the question is less clear. One thing is certain: the guest's virtual address space had better not be anything outside what page_find can support. Which brings us to the problem of exec.c and the address spaces therein. First, there was the fact that TARGET_PHYS_ADDR_SPACE_BITS was constrained to be no larger than 32 (with a partial hack for Alpha to extend this to 42 bits). Second, that this physical address space value was applied to virtual addresses via page_find. This patch series untangles this somewhat. First, define separate physical and virtual address spaces for each cpu. This allows the page tables used to be no deeper than necessary in order to support what the native hardware does. E.g. 3 level page tables for Alpha's 43-bit virtual address space, rather than the 5 levels required for a full 64-bit space. I've looked up proper values for x86_64 and ppc64; I couldn't find the correct values for mips64 and sparc64, so I guessed. Certainly the guess is no worse than what is supported by the current exec.c values. Second, implement the multi-level search within exec.c. The form of this multi-level search is taken from Tristan Gingold's es40 patches. However, he only addressed the physical address space and ignored the virtual; this patch handles both. I tried to arrange things as readably as possible here; getting too clever here is a sure-fire recipe for confusion. Third, re-apply the mmap address fixes. This time, as promised, with a clear division between host and guest address space -- the last variant that I posted could return addresses below GUEST_BASE. r~ Richard Henderson (6): Move TARGET_PHYS_ADDR_SPACE_BITS to target-*/cpu.h. Use TARGET_VIRT_ADDR_SPACE_BITS in h2g_valid. Fix last page errors in page_set_flags and page_check_range. Implement multi-level page tables. linux-user: Use h2g_valid in qemu_vmalloc. linux-user: Fix mmap_find_vma returning invalid addresses. cpu-all.h | 23 ++- exec.c | 513 +++++++++++++++++++++++++++-------------------- linux-user/main.c | 7 +- linux-user/mmap.c | 111 ++++++++--- target-alpha/cpu.h | 4 +- target-arm/cpu.h | 3 + target-cris/cpu.h | 3 + target-i386/cpu.h | 11 + target-m68k/cpu.h | 3 + target-microblaze/cpu.h | 3 + target-mips/mips-defs.h | 4 + target-ppc/cpu.h | 17 ++ target-s390x/cpu.h | 5 + target-sh4/cpu.h | 3 + target-sparc/cpu.h | 8 + 15 files changed, 456 insertions(+), 262 deletions(-)