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