aboutsummaryrefslogtreecommitdiff
path: root/linux-user/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'linux-user/main.c')
-rw-r--r--linux-user/main.c39
1 files changed, 16 insertions, 23 deletions
diff --git a/linux-user/main.c b/linux-user/main.c
index e2ec597..7b0ccb6 100644
--- a/linux-user/main.c
+++ b/linux-user/main.c
@@ -40,16 +40,15 @@
#include "qemu/plugin.h"
#include "user/guest-base.h"
#include "user/page-protection.h"
-#include "exec/exec-all.h"
#include "exec/gdbstub.h"
#include "gdbstub/user.h"
+#include "accel/accel-ops.h"
#include "tcg/startup.h"
#include "qemu/timer.h"
#include "qemu/envlist.h"
#include "qemu/guest-random.h"
#include "elf.h"
#include "trace/control.h"
-#include "target_elf.h"
#include "user/cpu_loop.h"
#include "crypto/init.h"
#include "fd-trans.h"
@@ -123,6 +122,7 @@ static const char *last_log_filename;
#endif
unsigned long reserved_va;
+unsigned long guest_addr_max;
static void usage(int exitcode);
@@ -149,12 +149,14 @@ void fork_start(void)
cpu_list_lock();
qemu_plugin_user_prefork_lock();
gdbserver_fork_start();
+ fd_trans_prefork();
}
void fork_end(pid_t pid)
{
bool child = pid == 0;
+ fd_trans_postfork();
qemu_plugin_user_postfork(child);
mmap_fork_end(child);
if (child) {
@@ -338,16 +340,6 @@ static void handle_arg_ld_prefix(const char *arg)
interp_prefix = strdup(arg);
}
-static void handle_arg_pagesize(const char *arg)
-{
- unsigned size, want = qemu_real_host_page_size();
-
- if (qemu_strtoui(arg, NULL, 10, &size) || size != want) {
- warn_report("Deprecated page size option cannot "
- "change host page size (%u)", want);
- }
-}
-
static void handle_arg_seed(const char *arg)
{
seed_optarg = arg;
@@ -520,8 +512,6 @@ static const struct qemu_argument arg_table[] = {
"range[,...]","filter logging based on address range"},
{"D", "QEMU_LOG_FILENAME", true, handle_arg_log_filename,
"logfile", "write logs to 'logfile' (default stderr)"},
- {"p", "QEMU_PAGESIZE", true, handle_arg_pagesize,
- "pagesize", "deprecated change to host page size"},
{"one-insn-per-tb",
"QEMU_ONE_INSN_PER_TB", false, handle_arg_one_insn_per_tb,
"", "run with one guest instruction per emulated TB"},
@@ -694,7 +684,6 @@ static int parse_args(int argc, char **argv)
int main(int argc, char **argv, char **envp)
{
- struct target_pt_regs regs1, *regs = &regs1;
struct image_info info1, *info = &info1;
struct linux_binprm bprm;
TaskState *ts;
@@ -760,9 +749,6 @@ int main(int argc, char **argv, char **envp)
trace_init_file();
qemu_plugin_load_list(&plugins, &error_fatal);
- /* Zero out regs */
- memset(regs, 0, sizeof(struct target_pt_regs));
-
/* Zero out image_info */
memset(info, 0, sizeof(struct image_info));
@@ -806,7 +792,7 @@ int main(int argc, char **argv, char **envp)
}
if (cpu_model == NULL) {
- cpu_model = cpu_get_model(get_elf_eflags(execfd));
+ cpu_model = get_elf_cpu_model(get_elf_eflags(execfd));
}
cpu_type = parse_cpu_option(cpu_model);
@@ -820,7 +806,7 @@ int main(int argc, char **argv, char **envp)
opt_one_insn_per_tb, &error_abort);
object_property_set_int(OBJECT(accel), "tb-size",
opt_tb_size, &error_abort);
- ac->init_machine(NULL);
+ ac->init_machine(accel, NULL);
}
/*
@@ -859,6 +845,13 @@ int main(int argc, char **argv, char **envp)
/* MAX_RESERVED_VA + 1 is a large power of 2, so is aligned. */
reserved_va = max_reserved_va;
}
+ if (reserved_va != 0) {
+ guest_addr_max = reserved_va;
+ } else if (MIN(TARGET_VIRT_ADDR_SPACE_BITS, TARGET_ABI_BITS) <= 32) {
+ guest_addr_max = UINT32_MAX;
+ } else {
+ guest_addr_max = ~0ul;
+ }
/*
* Temporarily disable
@@ -979,8 +972,8 @@ int main(int argc, char **argv, char **envp)
fd_trans_init();
- ret = loader_exec(execfd, exec_path, target_argv, target_environ, regs,
- info, &bprm);
+ ret = loader_exec(execfd, exec_path, target_argv, target_environ,
+ info, &bprm);
if (ret != 0) {
printf("Error while loading %s: %s\n", exec_path, strerror(-ret));
_exit(EXIT_FAILURE);
@@ -1032,7 +1025,7 @@ int main(int argc, char **argv, char **envp)
the real value of GUEST_BASE into account. */
tcg_prologue_init();
- target_cpu_copy_regs(env, regs);
+ init_main_thread(cpu, info);
if (gdbstub) {
gdbserver_start(gdbstub, &error_fatal);