Files
Yaya48 cf256aa081 Import QEMU upstream snapshot d2e570c
Upstream: https://gitlab.com/qemu-project/qemu.git

Upstream-Commit: d2e570cc0f97b936902a5b1b86b73c0f5998b475
2026-08-31 02:15:30 +02:00

51 lines
1.3 KiB
C

/*
* Utility function to get the minimum mmap address.
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "qemu/osdep.h"
#include "user/mmap-min-addr.h"
#ifdef __FreeBSD__
#include <sys/sysctl.h>
#include <sys/user.h>
#endif
uintptr_t mmap_min_addr;
static void __attribute__((constructor)) init(void)
{
#ifdef __linux__
/*
* We prefer to not make NULL pointers accessible to QEMU.
* If something goes wrong below, fall back to 1 page.
*/
size_t min_addr = qemu_real_host_page_size();
/*
* Read in mmap_min_addr kernel parameter. This value is used
* When loading the ELF image to determine whether guest_base
* is needed. It is also used in mmap_find_vma.
*/
FILE *fp = fopen("/proc/sys/vm/mmap_min_addr", "r");
if (fp) {
unsigned long tmp;
if (fscanf(fp, "%lu", &tmp) == 1 && tmp != 0) {
min_addr = MAX(min_addr, tmp);
}
fclose(fp);
}
mmap_min_addr = min_addr;
#elif defined(__FreeBSD__)
int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_VM_LAYOUT, getpid() };
struct kinfo_vm_layout info;
size_t info_len = sizeof(info);
mmap_min_addr =
(sysctl(mib, ARRAY_SIZE(mib), &info, &info_len, NULL, 0) < 0
? qemu_real_host_page_size()
: info.kvm_min_user_addr);
#else
# error
#endif
}