linux-user: Split out do_munmap
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
ad87d26e6b
commit
2952b642a5
@ -267,6 +267,21 @@ int target_mprotect(abi_ulong start, abi_ulong len, int target_prot)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Perform munmap on behalf of the target, with host parameters.
|
||||||
|
* If reserved_va, we must replace the memory reservation.
|
||||||
|
*/
|
||||||
|
static int do_munmap(void *addr, size_t len)
|
||||||
|
{
|
||||||
|
if (reserved_va) {
|
||||||
|
void *ptr = mmap(addr, len, PROT_NONE,
|
||||||
|
MAP_FIXED | MAP_ANONYMOUS
|
||||||
|
| MAP_PRIVATE | MAP_NORESERVE, -1, 0);
|
||||||
|
return ptr == addr ? 0 : -1;
|
||||||
|
}
|
||||||
|
return munmap(addr, len);
|
||||||
|
}
|
||||||
|
|
||||||
/* map an incomplete host page */
|
/* map an incomplete host page */
|
||||||
static bool mmap_frag(abi_ulong real_start, abi_ulong start, abi_ulong last,
|
static bool mmap_frag(abi_ulong real_start, abi_ulong start, abi_ulong last,
|
||||||
int prot, int flags, int fd, off_t offset)
|
int prot, int flags, int fd, off_t offset)
|
||||||
@ -854,13 +869,7 @@ static int mmap_reserve_or_unmap(abi_ulong start, abi_ulong len)
|
|||||||
real_len = real_last - real_start + 1;
|
real_len = real_last - real_start + 1;
|
||||||
host_start = g2h_untagged(real_start);
|
host_start = g2h_untagged(real_start);
|
||||||
|
|
||||||
if (reserved_va) {
|
return do_munmap(host_start, real_len);
|
||||||
void *ptr = mmap(host_start, real_len, PROT_NONE,
|
|
||||||
MAP_FIXED | MAP_ANONYMOUS
|
|
||||||
| MAP_PRIVATE | MAP_NORESERVE, -1, 0);
|
|
||||||
return ptr == host_start ? 0 : -1;
|
|
||||||
}
|
|
||||||
return munmap(host_start, real_len);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int target_munmap(abi_ulong start, abi_ulong len)
|
int target_munmap(abi_ulong start, abi_ulong len)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user