Skip to content

Commit

Permalink
linux-user: Split out mmap_end
Browse files Browse the repository at this point in the history
Use a subroutine instead of a goto within target_mmap__locked.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Ilya Leoshkevich <iii@linux.ibm.com>
Acked-by: Helge Deller <deller@gmx.de>
Message-Id: <20240102015808.132373-20-richard.henderson@linaro.org>
  • Loading branch information
rth7680 committed Feb 29, 2024
1 parent f0a362c commit 6ecc255
Showing 1 changed file with 41 additions and 30 deletions.
71 changes: 41 additions & 30 deletions linux-user/mmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -490,6 +490,43 @@ abi_ulong mmap_find_vma(abi_ulong start, abi_ulong size, abi_ulong align)
}
}

/*
* Record a successful mmap within the user-exec interval tree.
*/
static abi_long mmap_end(abi_ulong start, abi_ulong last,
abi_ulong passthrough_start,
abi_ulong passthrough_last,
int flags, int page_flags)
{
if (flags & MAP_ANONYMOUS) {
page_flags |= PAGE_ANON;
}
page_flags |= PAGE_RESET;
if (passthrough_start > passthrough_last) {
page_set_flags(start, last, page_flags);
} else {
if (start < passthrough_start) {
page_set_flags(start, passthrough_start - 1, page_flags);
}
page_set_flags(passthrough_start, passthrough_last,
page_flags | PAGE_PASSTHROUGH);
if (passthrough_last < last) {
page_set_flags(passthrough_last + 1, last, page_flags);
}
}
shm_region_rm_complete(start, last);
trace_target_mmap_complete(start);
if (qemu_loglevel_mask(CPU_LOG_PAGE)) {
FILE *f = qemu_log_trylock();
if (f) {
fprintf(f, "page layout changed following mmap\n");
page_dump(f);
qemu_log_unlock(f);
}
}
return start;
}

static abi_long target_mmap__locked(abi_ulong start, abi_ulong len,
int target_prot, int flags, int page_flags,
int fd, off_t offset)
Expand Down Expand Up @@ -632,7 +669,7 @@ static abi_long target_mmap__locked(abi_ulong start, abi_ulong len,
ret = target_mprotect(start, len, target_prot);
assert(ret == 0);
}
goto the_end;
return mmap_end(start, last, -1, 0, flags, page_flags);
}

/* handle the start of the mapping */
Expand All @@ -643,7 +680,7 @@ static abi_long target_mmap__locked(abi_ulong start, abi_ulong len,
target_prot, flags, fd, offset)) {
return -1;
}
goto the_end;
return mmap_end(start, last, -1, 0, flags, page_flags);
}
if (!mmap_frag(real_start, start,
real_start + host_page_size - 1,
Expand Down Expand Up @@ -690,34 +727,8 @@ static abi_long target_mmap__locked(abi_ulong start, abi_ulong len,
passthrough_last = real_last;
}
}
the_end:
if (flags & MAP_ANONYMOUS) {
page_flags |= PAGE_ANON;
}
page_flags |= PAGE_RESET;
if (passthrough_start > passthrough_last) {
page_set_flags(start, last, page_flags);
} else {
if (start < passthrough_start) {
page_set_flags(start, passthrough_start - 1, page_flags);
}
page_set_flags(passthrough_start, passthrough_last,
page_flags | PAGE_PASSTHROUGH);
if (passthrough_last < last) {
page_set_flags(passthrough_last + 1, last, page_flags);
}
}
shm_region_rm_complete(start, last);
trace_target_mmap_complete(start);
if (qemu_loglevel_mask(CPU_LOG_PAGE)) {
FILE *f = qemu_log_trylock();
if (f) {
fprintf(f, "page layout changed following mmap\n");
page_dump(f);
qemu_log_unlock(f);
}
}
return start;
return mmap_end(start, last, passthrough_start, passthrough_last,
flags, page_flags);
}

/* NOTE: all the constants are the HOST ones */
Expand Down

0 comments on commit 6ecc255

Please sign in to comment.