mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-21 00:53:27 -06:00
linux-user: Split out mmap_end
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>
This commit is contained in:
parent
f0a362c476
commit
6ecc25570f
1 changed files with 41 additions and 30 deletions
|
@ -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,
|
static abi_long target_mmap__locked(abi_ulong start, abi_ulong len,
|
||||||
int target_prot, int flags, int page_flags,
|
int target_prot, int flags, int page_flags,
|
||||||
int fd, off_t offset)
|
int fd, off_t offset)
|
||||||
|
@ -632,7 +669,7 @@ static abi_long target_mmap__locked(abi_ulong start, abi_ulong len,
|
||||||
ret = target_mprotect(start, len, target_prot);
|
ret = target_mprotect(start, len, target_prot);
|
||||||
assert(ret == 0);
|
assert(ret == 0);
|
||||||
}
|
}
|
||||||
goto the_end;
|
return mmap_end(start, last, -1, 0, flags, page_flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* handle the start of the mapping */
|
/* handle the start of the mapping */
|
||||||
|
@ -643,7 +680,7 @@ static abi_long target_mmap__locked(abi_ulong start, abi_ulong len,
|
||||||
target_prot, flags, fd, offset)) {
|
target_prot, flags, fd, offset)) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
goto the_end;
|
return mmap_end(start, last, -1, 0, flags, page_flags);
|
||||||
}
|
}
|
||||||
if (!mmap_frag(real_start, start,
|
if (!mmap_frag(real_start, start,
|
||||||
real_start + host_page_size - 1,
|
real_start + host_page_size - 1,
|
||||||
|
@ -690,34 +727,8 @@ static abi_long target_mmap__locked(abi_ulong start, abi_ulong len,
|
||||||
passthrough_last = real_last;
|
passthrough_last = real_last;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
the_end:
|
return mmap_end(start, last, passthrough_start, passthrough_last,
|
||||||
if (flags & MAP_ANONYMOUS) {
|
flags, page_flags);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* NOTE: all the constants are the HOST ones */
|
/* NOTE: all the constants are the HOST ones */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue