Create a structure to hold a beginning/end range for guest virtual addresses, for use by probe_guest_base. Use vaddr for clarity.
Signed-off-by: Richard Henderson <[email protected]> --- linux-user/user-internals.h | 5 +++++ linux-user/elfload.c | 36 ++++++++++++++++++------------------ 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/linux-user/user-internals.h b/linux-user/user-internals.h index 21daf422b7..73b0109e9c 100644 --- a/linux-user/user-internals.h +++ b/linux-user/user-internals.h @@ -75,6 +75,11 @@ void clone_fork_end(bool child); void fork_start(void); void fork_end(pid_t pid); +typedef struct PGBRange { + vaddr lo; + vaddr hi; +} PGBRange; + /** * probe_guest_base: * @image_name: the executable being loaded diff --git a/linux-user/elfload.c b/linux-user/elfload.c index 0e757787d2..e1e1ee4674 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -828,15 +828,15 @@ static int pgb_try_mmap_skip_brk(uintptr_t addr, uintptr_t addr_last, */ typedef struct PGBAddrs { - uintptr_t bounds[3][2]; /* start/last pairs */ + PGBRange bounds[3]; int nbounds; } PGBAddrs; static bool pgb_try_mmap_set(const PGBAddrs *ga, uintptr_t base, uintptr_t brk) { for (int i = ga->nbounds - 1; i >= 0; --i) { - if (pgb_try_mmap_skip_brk(ga->bounds[i][0] + base, - ga->bounds[i][1] + base, + if (pgb_try_mmap_skip_brk(ga->bounds[i].lo + base, + ga->bounds[i].hi + base, brk, i == 0 && reserved_va) <= 0) { return false; } @@ -875,26 +875,26 @@ static bool pgb_addr_set(PGBAddrs *ga, abi_ulong guest_loaddr, n = 0; if (reserved_va) { - ga->bounds[n][0] = try_identity ? mmap_min_addr : 0; - ga->bounds[n][1] = reserved_va; + ga->bounds[n].lo = try_identity ? mmap_min_addr : 0; + ga->bounds[n].hi = reserved_va; n++; /* LO_COMMPAGE and NULL handled by reserving from 0. */ } else { /* Add any LO_COMMPAGE or NULL page. */ if (LO_COMMPAGE != -1) { - ga->bounds[n][0] = 0; - ga->bounds[n][1] = LO_COMMPAGE + TARGET_PAGE_SIZE - 1; + ga->bounds[n].lo = 0; + ga->bounds[n].hi = LO_COMMPAGE + TARGET_PAGE_SIZE - 1; n++; } else if (!try_identity) { - ga->bounds[n][0] = 0; - ga->bounds[n][1] = TARGET_PAGE_SIZE - 1; + ga->bounds[n].lo = 0; + ga->bounds[n].hi = TARGET_PAGE_SIZE - 1; n++; } /* Add the guest image for ET_EXEC. */ if (guest_loaddr) { - ga->bounds[n][0] = guest_loaddr; - ga->bounds[n][1] = guest_hiaddr; + ga->bounds[n].lo = guest_loaddr; + ga->bounds[n].hi = guest_hiaddr; n++; } } @@ -909,8 +909,8 @@ static bool pgb_addr_set(PGBAddrs *ga, abi_ulong guest_loaddr, /* Add any HI_COMMPAGE not covered by reserved_va. */ if (reserved_va < HI_COMMPAGE) { - ga->bounds[n][0] = HI_COMMPAGE & qemu_real_host_page_mask(); - ga->bounds[n][1] = HI_COMMPAGE + TARGET_PAGE_SIZE - 1; + ga->bounds[n].lo = HI_COMMPAGE & qemu_real_host_page_mask(); + ga->bounds[n].hi = HI_COMMPAGE + TARGET_PAGE_SIZE - 1; n++; } @@ -976,8 +976,8 @@ static uintptr_t pgb_try_itree(const PGBAddrs *ga, uintptr_t base, IntervalTreeRoot *root) { for (int i = ga->nbounds - 1; i >= 0; --i) { - uintptr_t s = base + ga->bounds[i][0]; - uintptr_t l = base + ga->bounds[i][1]; + uintptr_t s = base + ga->bounds[i].lo; + uintptr_t l = base + ga->bounds[i].hi; IntervalTreeNode *n; if (l < s) { @@ -1076,9 +1076,9 @@ static void pgb_dynamic(const char *image_name, uintptr_t guest_loaddr, "guest address mapping requirements", image_name); for (int i = 0; i < ga.nbounds; ++i) { - error_printf(" %0*" PRIx64 "-%0*" PRIx64 "\n", - w, (uint64_t)ga.bounds[i][0], - w, (uint64_t)ga.bounds[i][1]); + error_printf(" %0*" VADDR_PRIx "-%0*" VADDR_PRIx "\n", + w, ga.bounds[i].lo, + w, ga.bounds[i].hi); } exit(EXIT_FAILURE); } -- 2.43.0
