|
@@ -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);
|