qemu/linux-user/main.c
<<
>>
Prefs
   1/*
   2 *  qemu user main
   3 *
   4 *  Copyright (c) 2003-2008 Fabrice Bellard
   5 *
   6 *  This program is free software; you can redistribute it and/or modify
   7 *  it under the terms of the GNU General Public License as published by
   8 *  the Free Software Foundation; either version 2 of the License, or
   9 *  (at your option) any later version.
  10 *
  11 *  This program is distributed in the hope that it will be useful,
  12 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14 *  GNU General Public License for more details.
  15 *
  16 *  You should have received a copy of the GNU General Public License
  17 *  along with this program; if not, see <http://www.gnu.org/licenses/>.
  18 */
  19
  20#include "qemu/osdep.h"
  21#include "qemu-common.h"
  22#include "qemu/units.h"
  23#include "sysemu/tcg.h"
  24#include "qemu-version.h"
  25#include <sys/syscall.h>
  26#include <sys/resource.h>
  27
  28#include "qapi/error.h"
  29#include "qemu.h"
  30#include "qemu/path.h"
  31#include "qemu/queue.h"
  32#include "qemu/config-file.h"
  33#include "qemu/cutils.h"
  34#include "qemu/error-report.h"
  35#include "qemu/help_option.h"
  36#include "qemu/module.h"
  37#include "qemu/plugin.h"
  38#include "cpu.h"
  39#include "exec/exec-all.h"
  40#include "tcg.h"
  41#include "qemu/timer.h"
  42#include "qemu/envlist.h"
  43#include "qemu/guest-random.h"
  44#include "elf.h"
  45#include "trace/control.h"
  46#include "target_elf.h"
  47#include "cpu_loop-common.h"
  48#include "crypto/init.h"
  49
  50char *exec_path;
  51
  52int singlestep;
  53static const char *argv0;
  54static int gdbstub_port;
  55static envlist_t *envlist;
  56static const char *cpu_model;
  57static const char *cpu_type;
  58static const char *seed_optarg;
  59unsigned long mmap_min_addr;
  60unsigned long guest_base;
  61int have_guest_base;
  62
  63/*
  64 * When running 32-on-64 we should make sure we can fit all of the possible
  65 * guest address space into a contiguous chunk of virtual host memory.
  66 *
  67 * This way we will never overlap with our own libraries or binaries or stack
  68 * or anything else that QEMU maps.
  69 *
  70 * Many cpus reserve the high bit (or more than one for some 64-bit cpus)
  71 * of the address for the kernel.  Some cpus rely on this and user space
  72 * uses the high bit(s) for pointer tagging and the like.  For them, we
  73 * must preserve the expected address space.
  74 */
  75#ifndef MAX_RESERVED_VA
  76# if HOST_LONG_BITS > TARGET_VIRT_ADDR_SPACE_BITS
  77#  if TARGET_VIRT_ADDR_SPACE_BITS == 32 && \
  78      (TARGET_LONG_BITS == 32 || defined(TARGET_ABI32))
  79/* There are a number of places where we assign reserved_va to a variable
  80   of type abi_ulong and expect it to fit.  Avoid the last page.  */
  81#   define MAX_RESERVED_VA(CPU)  (0xfffffffful & TARGET_PAGE_MASK)
  82#  else
  83#   define MAX_RESERVED_VA(CPU)  (1ul << TARGET_VIRT_ADDR_SPACE_BITS)
  84#  endif
  85# else
  86#  define MAX_RESERVED_VA(CPU)  0
  87# endif
  88#endif
  89
  90unsigned long reserved_va;
  91
  92static void usage(int exitcode);
  93
  94static const char *interp_prefix = CONFIG_QEMU_INTERP_PREFIX;
  95const char *qemu_uname_release;
  96
  97/* XXX: on x86 MAP_GROWSDOWN only works if ESP <= address + 32, so
  98   we allocate a bigger stack. Need a better solution, for example
  99   by remapping the process stack directly at the right place */
 100unsigned long guest_stack_size = 8 * 1024 * 1024UL;
 101
 102void gemu_log(const char *fmt, ...)
 103{
 104    va_list ap;
 105
 106    va_start(ap, fmt);
 107    vfprintf(stderr, fmt, ap);
 108    va_end(ap);
 109}
 110
 111#if defined(TARGET_I386)
 112int cpu_get_pic_interrupt(CPUX86State *env)
 113{
 114    return -1;
 115}
 116#endif
 117
 118/***********************************************************/
 119/* Helper routines for implementing atomic operations.  */
 120
 121/* Make sure everything is in a consistent state for calling fork().  */
 122void fork_start(void)
 123{
 124    start_exclusive();
 125    mmap_fork_start();
 126    cpu_list_lock();
 127}
 128
 129void fork_end(int child)
 130{
 131    mmap_fork_end(child);
 132    if (child) {
 133        CPUState *cpu, *next_cpu;
 134        /* Child processes created by fork() only have a single thread.
 135           Discard information about the parent threads.  */
 136        CPU_FOREACH_SAFE(cpu, next_cpu) {
 137            if (cpu != thread_cpu) {
 138                QTAILQ_REMOVE_RCU(&cpus, cpu, node);
 139            }
 140        }
 141        qemu_init_cpu_list();
 142        gdbserver_fork(thread_cpu);
 143        /* qemu_init_cpu_list() takes care of reinitializing the
 144         * exclusive state, so we don't need to end_exclusive() here.
 145         */
 146    } else {
 147        cpu_list_unlock();
 148        end_exclusive();
 149    }
 150}
 151
 152__thread CPUState *thread_cpu;
 153
 154bool qemu_cpu_is_self(CPUState *cpu)
 155{
 156    return thread_cpu == cpu;
 157}
 158
 159void qemu_cpu_kick(CPUState *cpu)
 160{
 161    cpu_exit(cpu);
 162}
 163
 164void task_settid(TaskState *ts)
 165{
 166    if (ts->ts_tid == 0) {
 167        ts->ts_tid = (pid_t)syscall(SYS_gettid);
 168    }
 169}
 170
 171void stop_all_tasks(void)
 172{
 173    /*
 174     * We trust that when using NPTL, start_exclusive()
 175     * handles thread stopping correctly.
 176     */
 177    start_exclusive();
 178}
 179
 180/* Assumes contents are already zeroed.  */
 181void init_task_state(TaskState *ts)
 182{
 183    ts->used = 1;
 184    ts->sigaltstack_used = (struct target_sigaltstack) {
 185        .ss_sp = 0,
 186        .ss_size = 0,
 187        .ss_flags = TARGET_SS_DISABLE,
 188    };
 189}
 190
 191CPUArchState *cpu_copy(CPUArchState *env)
 192{
 193    CPUState *cpu = env_cpu(env);
 194    CPUState *new_cpu = cpu_create(cpu_type);
 195    CPUArchState *new_env = new_cpu->env_ptr;
 196    CPUBreakpoint *bp;
 197    CPUWatchpoint *wp;
 198
 199    /* Reset non arch specific state */
 200    cpu_reset(new_cpu);
 201
 202    memcpy(new_env, env, sizeof(CPUArchState));
 203
 204    /* Clone all break/watchpoints.
 205       Note: Once we support ptrace with hw-debug register access, make sure
 206       BP_CPU break/watchpoints are handled correctly on clone. */
 207    QTAILQ_INIT(&new_cpu->breakpoints);
 208    QTAILQ_INIT(&new_cpu->watchpoints);
 209    QTAILQ_FOREACH(bp, &cpu->breakpoints, entry) {
 210        cpu_breakpoint_insert(new_cpu, bp->pc, bp->flags, NULL);
 211    }
 212    QTAILQ_FOREACH(wp, &cpu->watchpoints, entry) {
 213        cpu_watchpoint_insert(new_cpu, wp->vaddr, wp->len, wp->flags, NULL);
 214    }
 215
 216    return new_env;
 217}
 218
 219static void handle_arg_help(const char *arg)
 220{
 221    usage(EXIT_SUCCESS);
 222}
 223
 224static void handle_arg_log(const char *arg)
 225{
 226    int mask;
 227
 228    mask = qemu_str_to_log_mask(arg);
 229    if (!mask) {
 230        qemu_print_log_usage(stdout);
 231        exit(EXIT_FAILURE);
 232    }
 233    qemu_log_needs_buffers();
 234    qemu_set_log(mask);
 235}
 236
 237static void handle_arg_dfilter(const char *arg)
 238{
 239    qemu_set_dfilter_ranges(arg, &error_fatal);
 240}
 241
 242static void handle_arg_log_filename(const char *arg)
 243{
 244    qemu_set_log_filename(arg, &error_fatal);
 245}
 246
 247static void handle_arg_set_env(const char *arg)
 248{
 249    char *r, *p, *token;
 250    r = p = strdup(arg);
 251    while ((token = strsep(&p, ",")) != NULL) {
 252        if (envlist_setenv(envlist, token) != 0) {
 253            usage(EXIT_FAILURE);
 254        }
 255    }
 256    free(r);
 257}
 258
 259static void handle_arg_unset_env(const char *arg)
 260{
 261    char *r, *p, *token;
 262    r = p = strdup(arg);
 263    while ((token = strsep(&p, ",")) != NULL) {
 264        if (envlist_unsetenv(envlist, token) != 0) {
 265            usage(EXIT_FAILURE);
 266        }
 267    }
 268    free(r);
 269}
 270
 271static void handle_arg_argv0(const char *arg)
 272{
 273    argv0 = strdup(arg);
 274}
 275
 276static void handle_arg_stack_size(const char *arg)
 277{
 278    char *p;
 279    guest_stack_size = strtoul(arg, &p, 0);
 280    if (guest_stack_size == 0) {
 281        usage(EXIT_FAILURE);
 282    }
 283
 284    if (*p == 'M') {
 285        guest_stack_size *= MiB;
 286    } else if (*p == 'k' || *p == 'K') {
 287        guest_stack_size *= KiB;
 288    }
 289}
 290
 291static void handle_arg_ld_prefix(const char *arg)
 292{
 293    interp_prefix = strdup(arg);
 294}
 295
 296static void handle_arg_pagesize(const char *arg)
 297{
 298    qemu_host_page_size = atoi(arg);
 299    if (qemu_host_page_size == 0 ||
 300        (qemu_host_page_size & (qemu_host_page_size - 1)) != 0) {
 301        fprintf(stderr, "page size must be a power of two\n");
 302        exit(EXIT_FAILURE);
 303    }
 304}
 305
 306static void handle_arg_seed(const char *arg)
 307{
 308    seed_optarg = arg;
 309}
 310
 311static void handle_arg_gdb(const char *arg)
 312{
 313    gdbstub_port = atoi(arg);
 314}
 315
 316static void handle_arg_uname(const char *arg)
 317{
 318    qemu_uname_release = strdup(arg);
 319}
 320
 321static void handle_arg_cpu(const char *arg)
 322{
 323    cpu_model = strdup(arg);
 324    if (cpu_model == NULL || is_help_option(cpu_model)) {
 325        /* XXX: implement xxx_cpu_list for targets that still miss it */
 326#if defined(cpu_list)
 327        cpu_list();
 328#endif
 329        exit(EXIT_FAILURE);
 330    }
 331}
 332
 333static void handle_arg_guest_base(const char *arg)
 334{
 335    guest_base = strtol(arg, NULL, 0);
 336    have_guest_base = 1;
 337}
 338
 339static void handle_arg_reserved_va(const char *arg)
 340{
 341    char *p;
 342    int shift = 0;
 343    reserved_va = strtoul(arg, &p, 0);
 344    switch (*p) {
 345    case 'k':
 346    case 'K':
 347        shift = 10;
 348        break;
 349    case 'M':
 350        shift = 20;
 351        break;
 352    case 'G':
 353        shift = 30;
 354        break;
 355    }
 356    if (shift) {
 357        unsigned long unshifted = reserved_va;
 358        p++;
 359        reserved_va <<= shift;
 360        if (reserved_va >> shift != unshifted) {
 361            fprintf(stderr, "Reserved virtual address too big\n");
 362            exit(EXIT_FAILURE);
 363        }
 364    }
 365    if (*p) {
 366        fprintf(stderr, "Unrecognised -R size suffix '%s'\n", p);
 367        exit(EXIT_FAILURE);
 368    }
 369}
 370
 371static void handle_arg_singlestep(const char *arg)
 372{
 373    singlestep = 1;
 374}
 375
 376static void handle_arg_strace(const char *arg)
 377{
 378    do_strace = 1;
 379}
 380
 381static void handle_arg_version(const char *arg)
 382{
 383    printf("qemu-" TARGET_NAME " version " QEMU_FULL_VERSION
 384           "\n" QEMU_COPYRIGHT "\n");
 385    exit(EXIT_SUCCESS);
 386}
 387
 388static char *trace_file;
 389static void handle_arg_trace(const char *arg)
 390{
 391    g_free(trace_file);
 392    trace_file = trace_opt_parse(arg);
 393}
 394
 395#if defined(TARGET_XTENSA)
 396static void handle_arg_abi_call0(const char *arg)
 397{
 398    xtensa_set_abi_call0();
 399}
 400#endif
 401
 402static QemuPluginList plugins = QTAILQ_HEAD_INITIALIZER(plugins);
 403
 404#ifdef CONFIG_PLUGIN
 405static void handle_arg_plugin(const char *arg)
 406{
 407    qemu_plugin_opt_parse(arg, &plugins);
 408}
 409#endif
 410
 411struct qemu_argument {
 412    const char *argv;
 413    const char *env;
 414    bool has_arg;
 415    void (*handle_opt)(const char *arg);
 416    const char *example;
 417    const char *help;
 418};
 419
 420static const struct qemu_argument arg_table[] = {
 421    {"h",          "",                 false, handle_arg_help,
 422     "",           "print this help"},
 423    {"help",       "",                 false, handle_arg_help,
 424     "",           ""},
 425    {"g",          "QEMU_GDB",         true,  handle_arg_gdb,
 426     "port",       "wait gdb connection to 'port'"},
 427    {"L",          "QEMU_LD_PREFIX",   true,  handle_arg_ld_prefix,
 428     "path",       "set the elf interpreter prefix to 'path'"},
 429    {"s",          "QEMU_STACK_SIZE",  true,  handle_arg_stack_size,
 430     "size",       "set the stack size to 'size' bytes"},
 431    {"cpu",        "QEMU_CPU",         true,  handle_arg_cpu,
 432     "model",      "select CPU (-cpu help for list)"},
 433    {"E",          "QEMU_SET_ENV",     true,  handle_arg_set_env,
 434     "var=value",  "sets targets environment variable (see below)"},
 435    {"U",          "QEMU_UNSET_ENV",   true,  handle_arg_unset_env,
 436     "var",        "unsets targets environment variable (see below)"},
 437    {"0",          "QEMU_ARGV0",       true,  handle_arg_argv0,
 438     "argv0",      "forces target process argv[0] to be 'argv0'"},
 439    {"r",          "QEMU_UNAME",       true,  handle_arg_uname,
 440     "uname",      "set qemu uname release string to 'uname'"},
 441    {"B",          "QEMU_GUEST_BASE",  true,  handle_arg_guest_base,
 442     "address",    "set guest_base address to 'address'"},
 443    {"R",          "QEMU_RESERVED_VA", true,  handle_arg_reserved_va,
 444     "size",       "reserve 'size' bytes for guest virtual address space"},
 445    {"d",          "QEMU_LOG",         true,  handle_arg_log,
 446     "item[,...]", "enable logging of specified items "
 447     "(use '-d help' for a list of items)"},
 448    {"dfilter",    "QEMU_DFILTER",     true,  handle_arg_dfilter,
 449     "range[,...]","filter logging based on address range"},
 450    {"D",          "QEMU_LOG_FILENAME", true, handle_arg_log_filename,
 451     "logfile",     "write logs to 'logfile' (default stderr)"},
 452    {"p",          "QEMU_PAGESIZE",    true,  handle_arg_pagesize,
 453     "pagesize",   "set the host page size to 'pagesize'"},
 454    {"singlestep", "QEMU_SINGLESTEP",  false, handle_arg_singlestep,
 455     "",           "run in singlestep mode"},
 456    {"strace",     "QEMU_STRACE",      false, handle_arg_strace,
 457     "",           "log system calls"},
 458    {"seed",       "QEMU_RAND_SEED",   true,  handle_arg_seed,
 459     "",           "Seed for pseudo-random number generator"},
 460    {"trace",      "QEMU_TRACE",       true,  handle_arg_trace,
 461     "",           "[[enable=]<pattern>][,events=<file>][,file=<file>]"},
 462#ifdef CONFIG_PLUGIN
 463    {"plugin",     "QEMU_PLUGIN",      true,  handle_arg_plugin,
 464     "",           "[file=]<file>[,arg=<string>]"},
 465#endif
 466    {"version",    "QEMU_VERSION",     false, handle_arg_version,
 467     "",           "display version information and exit"},
 468#if defined(TARGET_XTENSA)
 469    {"xtensa-abi-call0", "QEMU_XTENSA_ABI_CALL0", false, handle_arg_abi_call0,
 470     "",           "assume CALL0 Xtensa ABI"},
 471#endif
 472    {NULL, NULL, false, NULL, NULL, NULL}
 473};
 474
 475static void usage(int exitcode)
 476{
 477    const struct qemu_argument *arginfo;
 478    int maxarglen;
 479    int maxenvlen;
 480
 481    printf("usage: qemu-" TARGET_NAME " [options] program [arguments...]\n"
 482           "Linux CPU emulator (compiled for " TARGET_NAME " emulation)\n"
 483           "\n"
 484           "Options and associated environment variables:\n"
 485           "\n");
 486
 487    /* Calculate column widths. We must always have at least enough space
 488     * for the column header.
 489     */
 490    maxarglen = strlen("Argument");
 491    maxenvlen = strlen("Env-variable");
 492
 493    for (arginfo = arg_table; arginfo->handle_opt != NULL; arginfo++) {
 494        int arglen = strlen(arginfo->argv);
 495        if (arginfo->has_arg) {
 496            arglen += strlen(arginfo->example) + 1;
 497        }
 498        if (strlen(arginfo->env) > maxenvlen) {
 499            maxenvlen = strlen(arginfo->env);
 500        }
 501        if (arglen > maxarglen) {
 502            maxarglen = arglen;
 503        }
 504    }
 505
 506    printf("%-*s %-*s Description\n", maxarglen+1, "Argument",
 507            maxenvlen, "Env-variable");
 508
 509    for (arginfo = arg_table; arginfo->handle_opt != NULL; arginfo++) {
 510        if (arginfo->has_arg) {
 511            printf("-%s %-*s %-*s %s\n", arginfo->argv,
 512                   (int)(maxarglen - strlen(arginfo->argv) - 1),
 513                   arginfo->example, maxenvlen, arginfo->env, arginfo->help);
 514        } else {
 515            printf("-%-*s %-*s %s\n", maxarglen, arginfo->argv,
 516                    maxenvlen, arginfo->env,
 517                    arginfo->help);
 518        }
 519    }
 520
 521    printf("\n"
 522           "Defaults:\n"
 523           "QEMU_LD_PREFIX  = %s\n"
 524           "QEMU_STACK_SIZE = %ld byte\n",
 525           interp_prefix,
 526           guest_stack_size);
 527
 528    printf("\n"
 529           "You can use -E and -U options or the QEMU_SET_ENV and\n"
 530           "QEMU_UNSET_ENV environment variables to set and unset\n"
 531           "environment variables for the target process.\n"
 532           "It is possible to provide several variables by separating them\n"
 533           "by commas in getsubopt(3) style. Additionally it is possible to\n"
 534           "provide the -E and -U options multiple times.\n"
 535           "The following lines are equivalent:\n"
 536           "    -E var1=val2 -E var2=val2 -U LD_PRELOAD -U LD_DEBUG\n"
 537           "    -E var1=val2,var2=val2 -U LD_PRELOAD,LD_DEBUG\n"
 538           "    QEMU_SET_ENV=var1=val2,var2=val2 QEMU_UNSET_ENV=LD_PRELOAD,LD_DEBUG\n"
 539           "Note that if you provide several changes to a single variable\n"
 540           "the last change will stay in effect.\n"
 541           "\n"
 542           QEMU_HELP_BOTTOM "\n");
 543
 544    exit(exitcode);
 545}
 546
 547static int parse_args(int argc, char **argv)
 548{
 549    const char *r;
 550    int optind;
 551    const struct qemu_argument *arginfo;
 552
 553    for (arginfo = arg_table; arginfo->handle_opt != NULL; arginfo++) {
 554        if (arginfo->env == NULL) {
 555            continue;
 556        }
 557
 558        r = getenv(arginfo->env);
 559        if (r != NULL) {
 560            arginfo->handle_opt(r);
 561        }
 562    }
 563
 564    optind = 1;
 565    for (;;) {
 566        if (optind >= argc) {
 567            break;
 568        }
 569        r = argv[optind];
 570        if (r[0] != '-') {
 571            break;
 572        }
 573        optind++;
 574        r++;
 575        if (!strcmp(r, "-")) {
 576            break;
 577        }
 578        /* Treat --foo the same as -foo.  */
 579        if (r[0] == '-') {
 580            r++;
 581        }
 582
 583        for (arginfo = arg_table; arginfo->handle_opt != NULL; arginfo++) {
 584            if (!strcmp(r, arginfo->argv)) {
 585                if (arginfo->has_arg) {
 586                    if (optind >= argc) {
 587                        (void) fprintf(stderr,
 588                            "qemu: missing argument for option '%s'\n", r);
 589                        exit(EXIT_FAILURE);
 590                    }
 591                    arginfo->handle_opt(argv[optind]);
 592                    optind++;
 593                } else {
 594                    arginfo->handle_opt(NULL);
 595                }
 596                break;
 597            }
 598        }
 599
 600        /* no option matched the current argv */
 601        if (arginfo->handle_opt == NULL) {
 602            (void) fprintf(stderr, "qemu: unknown option '%s'\n", r);
 603            exit(EXIT_FAILURE);
 604        }
 605    }
 606
 607    if (optind >= argc) {
 608        (void) fprintf(stderr, "qemu: no user program specified\n");
 609        exit(EXIT_FAILURE);
 610    }
 611
 612    exec_path = argv[optind];
 613
 614    return optind;
 615}
 616
 617int main(int argc, char **argv, char **envp)
 618{
 619    struct target_pt_regs regs1, *regs = &regs1;
 620    struct image_info info1, *info = &info1;
 621    struct linux_binprm bprm;
 622    TaskState *ts;
 623    CPUArchState *env;
 624    CPUState *cpu;
 625    int optind;
 626    char **target_environ, **wrk;
 627    char **target_argv;
 628    int target_argc;
 629    int i;
 630    int ret;
 631    int execfd;
 632    unsigned long max_reserved_va;
 633
 634    error_init(argv[0]);
 635    module_call_init(MODULE_INIT_TRACE);
 636    qemu_init_cpu_list();
 637    module_call_init(MODULE_INIT_QOM);
 638
 639    envlist = envlist_create();
 640
 641    /* add current environment into the list */
 642    for (wrk = environ; *wrk != NULL; wrk++) {
 643        (void) envlist_setenv(envlist, *wrk);
 644    }
 645
 646    /* Read the stack limit from the kernel.  If it's "unlimited",
 647       then we can do little else besides use the default.  */
 648    {
 649        struct rlimit lim;
 650        if (getrlimit(RLIMIT_STACK, &lim) == 0
 651            && lim.rlim_cur != RLIM_INFINITY
 652            && lim.rlim_cur == (target_long)lim.rlim_cur) {
 653            guest_stack_size = lim.rlim_cur;
 654        }
 655    }
 656
 657    cpu_model = NULL;
 658
 659    qemu_add_opts(&qemu_trace_opts);
 660    qemu_plugin_add_opts();
 661
 662    optind = parse_args(argc, argv);
 663
 664    if (!trace_init_backends()) {
 665        exit(1);
 666    }
 667    trace_init_file(trace_file);
 668    if (qemu_plugin_load_list(&plugins)) {
 669        exit(1);
 670    }
 671
 672    /* Zero out regs */
 673    memset(regs, 0, sizeof(struct target_pt_regs));
 674
 675    /* Zero out image_info */
 676    memset(info, 0, sizeof(struct image_info));
 677
 678    memset(&bprm, 0, sizeof (bprm));
 679
 680    /* Scan interp_prefix dir for replacement files. */
 681    init_paths(interp_prefix);
 682
 683    init_qemu_uname_release();
 684
 685    execfd = qemu_getauxval(AT_EXECFD);
 686    if (execfd == 0) {
 687        execfd = open(exec_path, O_RDONLY);
 688        if (execfd < 0) {
 689            printf("Error while loading %s: %s\n", exec_path, strerror(errno));
 690            _exit(EXIT_FAILURE);
 691        }
 692    }
 693
 694    if (cpu_model == NULL) {
 695        cpu_model = cpu_get_model(get_elf_eflags(execfd));
 696    }
 697    cpu_type = parse_cpu_option(cpu_model);
 698
 699    /* init tcg before creating CPUs and to get qemu_host_page_size */
 700    tcg_exec_init(0);
 701
 702    cpu = cpu_create(cpu_type);
 703    env = cpu->env_ptr;
 704    cpu_reset(cpu);
 705    thread_cpu = cpu;
 706
 707    /*
 708     * Reserving too much vm space via mmap can run into problems
 709     * with rlimits, oom due to page table creation, etc.  We will
 710     * still try it, if directed by the command-line option, but
 711     * not by default.
 712     */
 713    max_reserved_va = MAX_RESERVED_VA(cpu);
 714    if (reserved_va != 0) {
 715        if (max_reserved_va && reserved_va > max_reserved_va) {
 716            fprintf(stderr, "Reserved virtual address too big\n");
 717            exit(EXIT_FAILURE);
 718        }
 719    } else if (HOST_LONG_BITS == 64 && TARGET_VIRT_ADDR_SPACE_BITS <= 32) {
 720        /*
 721         * reserved_va must be aligned with the host page size
 722         * as it is used with mmap()
 723         */
 724        reserved_va = max_reserved_va & qemu_host_page_mask;
 725    }
 726
 727    {
 728        Error *err = NULL;
 729        if (seed_optarg != NULL) {
 730            qemu_guest_random_seed_main(seed_optarg, &err);
 731        } else {
 732            qcrypto_init(&err);
 733        }
 734        if (err) {
 735            error_reportf_err(err, "cannot initialize crypto: ");
 736            exit(1);
 737        }
 738    }
 739
 740    target_environ = envlist_to_environ(envlist, NULL);
 741    envlist_free(envlist);
 742
 743    /*
 744     * Now that page sizes are configured in tcg_exec_init() we can do
 745     * proper page alignment for guest_base.
 746     */
 747    guest_base = HOST_PAGE_ALIGN(guest_base);
 748
 749    if (reserved_va || have_guest_base) {
 750        guest_base = init_guest_space(guest_base, reserved_va, 0,
 751                                      have_guest_base);
 752        if (guest_base == (unsigned long)-1) {
 753            fprintf(stderr, "Unable to reserve 0x%lx bytes of virtual address "
 754                    "space for use as guest address space (check your virtual "
 755                    "memory ulimit setting or reserve less using -R option)\n",
 756                    reserved_va);
 757            exit(EXIT_FAILURE);
 758        }
 759
 760        if (reserved_va) {
 761            mmap_next_start = reserved_va;
 762        }
 763    }
 764
 765    /*
 766     * Read in mmap_min_addr kernel parameter.  This value is used
 767     * When loading the ELF image to determine whether guest_base
 768     * is needed.  It is also used in mmap_find_vma.
 769     */
 770    {
 771        FILE *fp;
 772
 773        if ((fp = fopen("/proc/sys/vm/mmap_min_addr", "r")) != NULL) {
 774            unsigned long tmp;
 775            if (fscanf(fp, "%lu", &tmp) == 1) {
 776                mmap_min_addr = tmp;
 777                qemu_log_mask(CPU_LOG_PAGE, "host mmap_min_addr=0x%lx\n", mmap_min_addr);
 778            }
 779            fclose(fp);
 780        }
 781    }
 782
 783    /*
 784     * Prepare copy of argv vector for target.
 785     */
 786    target_argc = argc - optind;
 787    target_argv = calloc(target_argc + 1, sizeof (char *));
 788    if (target_argv == NULL) {
 789        (void) fprintf(stderr, "Unable to allocate memory for target_argv\n");
 790        exit(EXIT_FAILURE);
 791    }
 792
 793    /*
 794     * If argv0 is specified (using '-0' switch) we replace
 795     * argv[0] pointer with the given one.
 796     */
 797    i = 0;
 798    if (argv0 != NULL) {
 799        target_argv[i++] = strdup(argv0);
 800    }
 801    for (; i < target_argc; i++) {
 802        target_argv[i] = strdup(argv[optind + i]);
 803    }
 804    target_argv[target_argc] = NULL;
 805
 806    ts = g_new0(TaskState, 1);
 807    init_task_state(ts);
 808    /* build Task State */
 809    ts->info = info;
 810    ts->bprm = &bprm;
 811    cpu->opaque = ts;
 812    task_settid(ts);
 813
 814    ret = loader_exec(execfd, exec_path, target_argv, target_environ, regs,
 815        info, &bprm);
 816    if (ret != 0) {
 817        printf("Error while loading %s: %s\n", exec_path, strerror(-ret));
 818        _exit(EXIT_FAILURE);
 819    }
 820
 821    for (wrk = target_environ; *wrk; wrk++) {
 822        g_free(*wrk);
 823    }
 824
 825    g_free(target_environ);
 826
 827    if (qemu_loglevel_mask(CPU_LOG_PAGE)) {
 828        qemu_log("guest_base  0x%lx\n", guest_base);
 829        log_page_dump();
 830
 831        qemu_log("start_brk   0x" TARGET_ABI_FMT_lx "\n", info->start_brk);
 832        qemu_log("end_code    0x" TARGET_ABI_FMT_lx "\n", info->end_code);
 833        qemu_log("start_code  0x" TARGET_ABI_FMT_lx "\n", info->start_code);
 834        qemu_log("start_data  0x" TARGET_ABI_FMT_lx "\n", info->start_data);
 835        qemu_log("end_data    0x" TARGET_ABI_FMT_lx "\n", info->end_data);
 836        qemu_log("start_stack 0x" TARGET_ABI_FMT_lx "\n", info->start_stack);
 837        qemu_log("brk         0x" TARGET_ABI_FMT_lx "\n", info->brk);
 838        qemu_log("entry       0x" TARGET_ABI_FMT_lx "\n", info->entry);
 839        qemu_log("argv_start  0x" TARGET_ABI_FMT_lx "\n", info->arg_start);
 840        qemu_log("env_start   0x" TARGET_ABI_FMT_lx "\n",
 841                 info->arg_end + (abi_ulong)sizeof(abi_ulong));
 842        qemu_log("auxv_start  0x" TARGET_ABI_FMT_lx "\n", info->saved_auxv);
 843    }
 844
 845    target_set_brk(info->brk);
 846    syscall_init();
 847    signal_init();
 848
 849    /* Now that we've loaded the binary, GUEST_BASE is fixed.  Delay
 850       generating the prologue until now so that the prologue can take
 851       the real value of GUEST_BASE into account.  */
 852    tcg_prologue_init(tcg_ctx);
 853    tcg_region_init();
 854
 855    target_cpu_copy_regs(env, regs);
 856
 857    if (gdbstub_port) {
 858        if (gdbserver_start(gdbstub_port) < 0) {
 859            fprintf(stderr, "qemu: could not open gdbserver on port %d\n",
 860                    gdbstub_port);
 861            exit(EXIT_FAILURE);
 862        }
 863        gdb_handlesig(cpu, 0);
 864    }
 865    cpu_loop(env);
 866    /* never exits */
 867    return 0;
 868}
 869