===================================================================
@@ -3486,35 +3486,53 @@ int main(int argc, char **argv, char **e
guest_base = HOST_PAGE_ALIGN(guest_base);
if (reserved_va) {
- void *p;
+ unsigned long host_start, real_start, first_start, host_size;
int flags;
flags = MAP_ANONYMOUS | MAP_PRIVATE | MAP_NORESERVE;
if (have_guest_base) {
flags |= MAP_FIXED;
}
- p = mmap((void *)guest_base, reserved_va, PROT_NONE, flags, -1, 0);
- if (p == MAP_FAILED) {
- fprintf(stderr, "Unable to reserve guest address space\n");
- exit(1);
- }
- guest_base = (unsigned long)p;
- /* Make sure the address is properly aligned. */
- if (guest_base & ~qemu_host_page_mask) {
- munmap(p, reserved_va);
- p = mmap((void *)guest_base, reserved_va + qemu_host_page_size,
- PROT_NONE, flags, -1, 0);
- if (p == MAP_FAILED) {
+
+ first_start = host_start = HOST_PAGE_ALIGN(guest_base);
+ while (1) {
+ host_size = reserved_va;
+ real_start = (unsigned long) mmap((void *)host_start, host_size,
+ PROT_NONE, flags, -1, 0);
+ if (real_start == (unsigned long)-1) {
+ fprintf(stderr, "Unable to reserve guest address space\n");
+ exit(1);
+ }
+ guest_base = host_start;
+ /* Make sure the address is properly aligned. */
+ if (guest_base & ~qemu_host_page_mask) {
+ munmap((void*)real_start, host_size);
+ host_size += qemu_host_page_size;
+ real_start = (unsigned long) mmap((void *)guest_base,
+ host_size,
+ PROT_NONE, flags, -1, 0);
+ if (real_start == (unsigned long)-1) {
+ fprintf(stderr, "Unable to reserve guest address space\n");
+ exit(1);
+ }
+ guest_base = HOST_PAGE_ALIGN(real_start);
+ }
+
+ if (guest_validate_base(guest_base))
+ break;
+
+ munmap((void *)real_start, host_size);
+ host_start += qemu_host_page_size;
+ if (host_start == first_start) {
fprintf(stderr, "Unable to reserve guest address space\n");
exit(1);
}
- guest_base = HOST_PAGE_ALIGN((unsigned long)p);
}
qemu_log("Reserved 0x%lx bytes of guest address space\n", reserved_va);
mmap_next_start = reserved_va;
}
- if (reserved_va || have_guest_base) {
+ if (have_guest_base) {
if (!guest_validate_base(guest_base)) {
fprintf(stderr, "Guest base/Reserved VA rejected by guest code\n");
exit(1);