mirror of https://gitee.com/openkylin/qemu.git
BSD user: implement GUEST_BASE
Based on 379f6698d7
.
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
This commit is contained in:
parent
17cf428f2e
commit
2fa5d9ba56
|
@ -1337,6 +1337,29 @@ int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs,
|
||||||
info->mmap = 0;
|
info->mmap = 0;
|
||||||
elf_entry = (abi_ulong) elf_ex.e_entry;
|
elf_entry = (abi_ulong) elf_ex.e_entry;
|
||||||
|
|
||||||
|
#if defined(CONFIG_USE_GUEST_BASE)
|
||||||
|
/*
|
||||||
|
* In case where user has not explicitly set the guest_base, we
|
||||||
|
* probe here that should we set it automatically.
|
||||||
|
*/
|
||||||
|
if (!have_guest_base) {
|
||||||
|
/*
|
||||||
|
* Go through ELF program header table and find out whether
|
||||||
|
* any of the segments drop below our current mmap_min_addr and
|
||||||
|
* in that case set guest_base to corresponding address.
|
||||||
|
*/
|
||||||
|
for (i = 0, elf_ppnt = elf_phdata; i < elf_ex.e_phnum;
|
||||||
|
i++, elf_ppnt++) {
|
||||||
|
if (elf_ppnt->p_type != PT_LOAD)
|
||||||
|
continue;
|
||||||
|
if (HOST_PAGE_ALIGN(elf_ppnt->p_vaddr) < mmap_min_addr) {
|
||||||
|
guest_base = HOST_PAGE_ALIGN(mmap_min_addr);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_USE_GUEST_BASE */
|
||||||
|
|
||||||
/* Do this so that we can load the interpreter, if need be. We will
|
/* Do this so that we can load the interpreter, if need be. We will
|
||||||
change some of these later */
|
change some of these later */
|
||||||
info->rss = 0;
|
info->rss = 0;
|
||||||
|
|
|
@ -37,6 +37,11 @@
|
||||||
#define DEBUG_LOGFILE "/tmp/qemu.log"
|
#define DEBUG_LOGFILE "/tmp/qemu.log"
|
||||||
|
|
||||||
int singlestep;
|
int singlestep;
|
||||||
|
#if defined(CONFIG_USE_GUEST_BASE)
|
||||||
|
unsigned long mmap_min_addr;
|
||||||
|
unsigned long guest_base;
|
||||||
|
int have_guest_base;
|
||||||
|
#endif
|
||||||
|
|
||||||
static const char *interp_prefix = CONFIG_QEMU_PREFIX;
|
static const char *interp_prefix = CONFIG_QEMU_PREFIX;
|
||||||
const char *qemu_uname_release = CONFIG_UNAME_RELEASE;
|
const char *qemu_uname_release = CONFIG_UNAME_RELEASE;
|
||||||
|
@ -607,6 +612,9 @@ static void usage(void)
|
||||||
"-drop-ld-preload drop LD_PRELOAD for target process\n"
|
"-drop-ld-preload drop LD_PRELOAD for target process\n"
|
||||||
"-E var=value sets/modifies targets environment variable(s)\n"
|
"-E var=value sets/modifies targets environment variable(s)\n"
|
||||||
"-U var unsets targets environment variable(s)\n"
|
"-U var unsets targets environment variable(s)\n"
|
||||||
|
#if defined(CONFIG_USE_GUEST_BASE)
|
||||||
|
"-B address set guest_base address to address\n"
|
||||||
|
#endif
|
||||||
"-bsd type select emulated BSD type FreeBSD/NetBSD/OpenBSD (default)\n"
|
"-bsd type select emulated BSD type FreeBSD/NetBSD/OpenBSD (default)\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Debug options:\n"
|
"Debug options:\n"
|
||||||
|
@ -746,6 +754,11 @@ int main(int argc, char **argv)
|
||||||
#endif
|
#endif
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
#if defined(CONFIG_USE_GUEST_BASE)
|
||||||
|
} else if (!strcmp(r, "B")) {
|
||||||
|
guest_base = strtol(argv[optind++], NULL, 0);
|
||||||
|
have_guest_base = 1;
|
||||||
|
#endif
|
||||||
} else if (!strcmp(r, "drop-ld-preload")) {
|
} else if (!strcmp(r, "drop-ld-preload")) {
|
||||||
(void) envlist_unsetenv(envlist, "LD_PRELOAD");
|
(void) envlist_unsetenv(envlist, "LD_PRELOAD");
|
||||||
} else if (!strcmp(r, "bsd")) {
|
} else if (!strcmp(r, "bsd")) {
|
||||||
|
@ -815,6 +828,34 @@ int main(int argc, char **argv)
|
||||||
target_environ = envlist_to_environ(envlist, NULL);
|
target_environ = envlist_to_environ(envlist, NULL);
|
||||||
envlist_free(envlist);
|
envlist_free(envlist);
|
||||||
|
|
||||||
|
#if defined(CONFIG_USE_GUEST_BASE)
|
||||||
|
/*
|
||||||
|
* Now that page sizes are configured in cpu_init() we can do
|
||||||
|
* proper page alignment for guest_base.
|
||||||
|
*/
|
||||||
|
guest_base = HOST_PAGE_ALIGN(guest_base);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Read in mmap_min_addr kernel parameter. This value is used
|
||||||
|
* When loading the ELF image to determine whether guest_base
|
||||||
|
* is needed.
|
||||||
|
*
|
||||||
|
* When user has explicitly set the quest base, we skip this
|
||||||
|
* test.
|
||||||
|
*/
|
||||||
|
if (!have_guest_base) {
|
||||||
|
FILE *fp;
|
||||||
|
|
||||||
|
if ((fp = fopen("/proc/sys/vm/mmap_min_addr", "r")) != NULL) {
|
||||||
|
unsigned long tmp;
|
||||||
|
if (fscanf(fp, "%lu", &tmp) == 1) {
|
||||||
|
mmap_min_addr = tmp;
|
||||||
|
qemu_log("host mmap_min_addr=0x%lx\n", mmap_min_addr);
|
||||||
|
}
|
||||||
|
fclose(fp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_USE_GUEST_BASE */
|
||||||
|
|
||||||
if (loader_exec(filename, argv+optind, target_environ, regs, info) != 0) {
|
if (loader_exec(filename, argv+optind, target_environ, regs, info) != 0) {
|
||||||
printf("Error loading %s\n", filename);
|
printf("Error loading %s\n", filename);
|
||||||
|
@ -828,6 +869,9 @@ int main(int argc, char **argv)
|
||||||
free(target_environ);
|
free(target_environ);
|
||||||
|
|
||||||
if (qemu_log_enabled()) {
|
if (qemu_log_enabled()) {
|
||||||
|
#if defined(CONFIG_USE_GUEST_BASE)
|
||||||
|
qemu_log("guest_base 0x%lx\n", guest_base);
|
||||||
|
#endif
|
||||||
log_page_dump();
|
log_page_dump();
|
||||||
|
|
||||||
qemu_log("start_brk 0x" TARGET_ABI_FMT_lx "\n", info->start_brk);
|
qemu_log("start_brk 0x" TARGET_ABI_FMT_lx "\n", info->start_brk);
|
||||||
|
|
|
@ -84,6 +84,9 @@ typedef struct TaskState {
|
||||||
|
|
||||||
void init_task_state(TaskState *ts);
|
void init_task_state(TaskState *ts);
|
||||||
extern const char *qemu_uname_release;
|
extern const char *qemu_uname_release;
|
||||||
|
#if defined(CONFIG_USE_GUEST_BASE)
|
||||||
|
extern unsigned long mmap_min_addr;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* ??? See if we can avoid exposing so much of the loader internals. */
|
/* ??? See if we can avoid exposing so much of the loader internals. */
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue