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 char *trace_file;
 390static void handle_arg_trace(const char *arg)
 391{
 392    g_free(trace_file);
 393    trace_file = trace_opt_parse(arg);
 394}
 395
 396#if defined(TARGET_XTENSA)
 397static void handle_arg_abi_call0(const char *arg)
 398{
 399    xtensa_set_abi_call0();
 400}
 401#endif
 402
 403static QemuPluginList plugins = QTAILQ_HEAD_INITIALIZER(plugins);
 404
 405#ifdef CONFIG_PLUGIN
 406static void handle_arg_plugin(const char *arg)
 407{
 408    qemu_plugin_opt_parse(arg, &plugins);
 409}
 410#endif
 411
 412struct qemu_argument {
 413    const char *argv;
 414    const char *env;
 415    bool has_arg;
 416    void (*handle_opt)(const char *arg);
 417    const char *example;
 418    const char *help;
 419};
 420
 421static const struct qemu_argument arg_table[] = {
 422    {"h",          "",                 false, handle_arg_help,
 423     "",           "print this help"},
 424    {"help",       "",                 false, handle_arg_help,
 425     "",           ""},
 426    {"g",          "QEMU_GDB",         true,  handle_arg_gdb,
 427     "port",       "wait gdb connection to 'port'"},
 428    {"L",          "QEMU_LD_PREFIX",   true,  handle_arg_ld_prefix,
 429     "path",       "set the elf interpreter prefix to 'path'"},
 430    {"s",          "QEMU_STACK_SIZE",  true,  handle_arg_stack_size,
 431     "size",       "set the stack size to 'size' bytes"},
 432    {"cpu",        "QEMU_CPU",         true,  handle_arg_cpu,
 433     "model",      "select CPU (-cpu help for list)"},
 434    {"E",          "QEMU_SET_ENV",     true,  handle_arg_set_env,
 435     "var=value",  "sets targets environment variable (see below)"},
 436    {"U",          "QEMU_UNSET_ENV",   true,  handle_arg_unset_env,
 437     "var",        "unsets targets environment variable (see below)"},
 438    {"0",          "QEMU_ARGV0",       true,  handle_arg_argv0,
 439     "argv0",      "forces target process argv[0] to be 'argv0'"},
 440    {"r",          "QEMU_UNAME",       true,  handle_arg_uname,
 441     "uname",      "set qemu uname release string to 'uname'"},
 442    {"B",          "QEMU_GUEST_BASE",  true,  handle_arg_guest_base,
 443     "address",    "set guest_base address to 'address'"},
 444    {"R",          "QEMU_RESERVED_VA", true,  handle_arg_reserved_va,
 445     "size",       "reserve 'size' bytes for guest virtual address space"},
 446    {"d",          "QEMU_LOG",         true,  handle_arg_log,
 447     "item[,...]", "enable logging of specified items "
 448     "(use '-d help' for a list of items)"},
 449    {"dfilter",    "QEMU_DFILTER",     true,  handle_arg_dfilter,
 450     "range[,...]","filter logging based on address range"},
 451    {"D",          "QEMU_LOG_FILENAME", true, handle_arg_log_filename,
 452     "logfile",     "write logs to 'logfile' (default stderr)"},
 453    {"p",          "QEMU_PAGESIZE",    true,  handle_arg_pagesize,
 454     "pagesize",   "set the host page size to 'pagesize'"},
 455    {"singlestep", "QEMU_SINGLESTEP",  false, handle_arg_singlestep,
 456     "",           "run in singlestep mode"},
 457    {"strace",     "QEMU_STRACE",      false, handle_arg_strace,
 458     "",           "log system calls"},
 459    {"seed",       "QEMU_RAND_SEED",   true,  handle_arg_seed,
 460     "",           "Seed for pseudo-random number generator"},
 461    {"trace",      "QEMU_TRACE",       true,  handle_arg_trace,
 462     "",           "[[enable=]<pattern>][,events=<file>][,file=<file>]"},
 463#ifdef CONFIG_PLUGIN
 464    {"plugin",     "QEMU_PLUGIN",      true,  handle_arg_plugin,
 465     "",           "[file=]<file>[,arg=<string>]"},
 466#endif
 467    {"version",    "QEMU_VERSION",     false, handle_arg_version,
 468     "",           "display version information and exit"},
 469#if defined(TARGET_XTENSA)
 470    {"xtensa-abi-call0", "QEMU_XTENSA_ABI_CALL0", false, handle_arg_abi_call0,
 471     "",           "assume CALL0 Xtensa ABI"},
 472#endif
 473    {NULL, NULL, false, NULL, NULL, NULL}
 474};
 475
 476static void usage(int exitcode)
 477{
 478    const struct qemu_argument *arginfo;
 479    int maxarglen;
 480    int maxenvlen;
 481
 482    printf("usage: qemu-" TARGET_NAME " [options] program [arguments...]\n"
 483           "Linux CPU emulator (compiled for " TARGET_NAME " emulation)\n"
 484           "\n"
 485           "Options and associated environment variables:\n"
 486           "\n");
 487
 488    /* Calculate column widths. We must always have at least enough space
 489     * for the column header.
 490     */
 491    maxarglen = strlen("Argument");
 492    maxenvlen = strlen("Env-variable");
 493
 494    for (arginfo = arg_table; arginfo->handle_opt != NULL; arginfo++) {
 495        int arglen = strlen(arginfo->argv);
 496        if (arginfo->has_arg) {
 497            arglen += strlen(arginfo->example) + 1;
 498        }
 499        if (strlen(arginfo->env) > maxenvlen) {
 500            maxenvlen = strlen(arginfo->env);
 501        }
 502        if (arglen > maxarglen) {
 503            maxarglen = arglen;
 504        }
 505    }
 506
 507    printf("%-*s %-*s Description\n", maxarglen+1, "Argument",
 508            maxenvlen, "Env-variable");
 509
 510    for (arginfo = arg_table; arginfo->handle_opt != NULL; arginfo++) {
 511        if (arginfo->has_arg) {
 512            printf("-%s %-*s %-*s %s\n", arginfo->argv,
 513                   (int)(maxarglen - strlen(arginfo->argv) - 1),
 514                   arginfo->example, maxenvlen, arginfo->env, arginfo->help);
 515        } else {
 516            printf("-%-*s %-*s %s\n", maxarglen, arginfo->argv,
 517                    maxenvlen, arginfo->env,
 518                    arginfo->help);
 519        }
 520    }
 521
 522    printf("\n"
 523           "Defaults:\n"
 524           "QEMU_LD_PREFIX  = %s\n"
 525           "QEMU_STACK_SIZE = %ld byte\n",
 526           interp_prefix,
 527           guest_stack_size);
 528
 529    printf("\n"
 530           "You can use -E and -U options or the QEMU_SET_ENV and\n"
 531           "QEMU_UNSET_ENV environment variables to set and unset\n"
 532           "environment variables for the target process.\n"
 533           "It is possible to provide several variables by separating them\n"
 534           "by commas in getsubopt(3) style. Additionally it is possible to\n"
 535           "provide the -E and -U options multiple times.\n"
 536           "The following lines are equivalent:\n"
 537           "    -E var1=val2 -E var2=val2 -U LD_PRELOAD -U LD_DEBUG\n"
 538           "    -E var1=val2,var2=val2 -U LD_PRELOAD,LD_DEBUG\n"
 539           "    QEMU_SET_ENV=var1=val2,var2=val2 QEMU_UNSET_ENV=LD_PRELOAD,LD_DEBUG\n"
 540           "Note that if you provide several changes to a single variable\n"
 541           "the last change will stay in effect.\n"
 542           "\n"
 543           QEMU_HELP_BOTTOM "\n");
 544
 545    exit(exitcode);
 546}
 547
 548static int parse_args(int argc, char **argv)
 549{
 550    const char *r;
 551    int optind;
 552    const struct qemu_argument *arginfo;
 553
 554    for (arginfo = arg_table; arginfo->handle_opt != NULL; arginfo++) {
 555        if (arginfo->env == NULL) {
 556            continue;
 557        }
 558
 559        r = getenv(arginfo->env);
 560        if (r != NULL) {
 561            arginfo->handle_opt(r);
 562        }
 563    }
 564
 565    optind = 1;
 566    for (;;) {
 567        if (optind >= argc) {
 568            break;
 569        }
 570        r = argv[optind];
 571        if (r[0] != '-') {
 572            break;
 573        }
 574        optind++;
 575        r++;
 576        if (!strcmp(r, "-")) {
 577            break;
 578        }
 579        /* Treat --foo the same as -foo.  */
 580        if (r[0] == '-') {
 581            r++;
 582        }
 583
 584        for (arginfo = arg_table; arginfo->handle_opt != NULL; arginfo++) {
 585            if (!strcmp(r, arginfo->argv)) {
 586                if (arginfo->has_arg) {
 587                    if (optind >= argc) {
 588                        (void) fprintf(stderr,
 589                            "qemu: missing argument for option '%s'\n", r);
 590                        exit(EXIT_FAILURE);
 591                    }
 592                    arginfo->handle_opt(argv[optind]);
 593                    optind++;
 594                } else {
 595                    arginfo->handle_opt(NULL);
 596                }
 597                break;
 598            }
 599        }
 600
 601        /* no option matched the current argv */
 602        if (arginfo->handle_opt == NULL) {
 603            (void) fprintf(stderr, "qemu: unknown option '%s'\n", r);
 604            exit(EXIT_FAILURE);
 605        }
 606    }
 607
 608    if (optind >= argc) {
 609        (void) fprintf(stderr, "qemu: no user program specified\n");
 610        exit(EXIT_FAILURE);
 611    }
 612
 613    exec_path = argv[optind];
 614
 615    return optind;
 616}
 617
 618int main(int argc, char **argv, char **envp)
 619{
 620    struct target_pt_regs regs1, *regs = &regs1;
 621    struct image_info info1, *info = &info1;
 622    struct linux_binprm bprm;
 623    TaskState *ts;
 624    CPUArchState *env;
 625    CPUState *cpu;
 626    int optind;
 627    char **target_environ, **wrk;
 628    char **target_argv;
 629    int target_argc;
 630    int i;
 631    int ret;
 632    int execfd;
 633    int log_mask;
 634    unsigned long max_reserved_va;
 635
 636    error_init(argv[0]);
 637    module_call_init(MODULE_INIT_TRACE);
 638    qemu_init_cpu_list();
 639    module_call_init(MODULE_INIT_QOM);
 640
 641    envlist = envlist_create();
 642
 643    /* add current environment into the list */
 644    for (wrk = environ; *wrk != NULL; wrk++) {
 645        (void) envlist_setenv(envlist, *wrk);
 646    }
 647
 648    /* Read the stack limit from the kernel.  If it's "unlimited",
 649       then we can do little else besides use the default.  */
 650    {
 651        struct rlimit lim;
 652        if (getrlimit(RLIMIT_STACK, &lim) == 0
 653            && lim.rlim_cur != RLIM_INFINITY
 654            && lim.rlim_cur == (target_long)lim.rlim_cur) {
 655            guest_stack_size = lim.rlim_cur;
 656        }
 657    }
 658
 659    cpu_model = NULL;
 660
 661    qemu_add_opts(&qemu_trace_opts);
 662    qemu_plugin_add_opts();
 663
 664    optind = parse_args(argc, argv);
 665
 666    log_mask = last_log_mask | (enable_strace ? LOG_STRACE : 0);
 667    if (log_mask) {
 668        qemu_log_needs_buffers();
 669        qemu_set_log(log_mask);
 670    }
 671
 672    if (!trace_init_backends()) {
 673        exit(1);
 674    }
 675    trace_init_file(trace_file);
 676    if (qemu_plugin_load_list(&plugins)) {
 677        exit(1);
 678    }
 679
 680    /* Zero out regs */
 681    memset(regs, 0, sizeof(struct target_pt_regs));
 682
 683    /* Zero out image_info */
 684    memset(info, 0, sizeof(struct image_info));
 685
 686    memset(&bprm, 0, sizeof (bprm));
 687
 688    /* Scan interp_prefix dir for replacement files. */
 689    init_paths(interp_prefix);
 690
 691    init_qemu_uname_release();
 692
 693    execfd = qemu_getauxval(AT_EXECFD);
 694    if (execfd == 0) {
 695        execfd = open(exec_path, O_RDONLY);
 696        if (execfd < 0) {
 697            printf("Error while loading %s: %s\n", exec_path, strerror(errno));
 698            _exit(EXIT_FAILURE);
 699        }
 700    }
 701
 702    if (cpu_model == NULL) {
 703        cpu_model = cpu_get_model(get_elf_eflags(execfd));
 704    }
 705    cpu_type = parse_cpu_option(cpu_model);
 706
 707    /* init tcg before creating CPUs and to get qemu_host_page_size */
 708    tcg_exec_init(0);
 709
 710    cpu = cpu_create(cpu_type);
 711    env = cpu->env_ptr;
 712    cpu_reset(cpu);
 713    thread_cpu = cpu;
 714
 715    /*
 716     * Reserving too much vm space via mmap can run into problems
 717     * with rlimits, oom due to page table creation, etc.  We will
 718     * still try it, if directed by the command-line option, but
 719     * not by default.
 720     */
 721    max_reserved_va = MAX_RESERVED_VA(cpu);
 722    if (reserved_va != 0) {
 723        if (max_reserved_va && reserved_va > max_reserved_va) {
 724            fprintf(stderr, "Reserved virtual address too big\n");
 725            exit(EXIT_FAILURE);
 726        }
 727    } else if (HOST_LONG_BITS == 64 && TARGET_VIRT_ADDR_SPACE_BITS <= 32) {
 728        /*
 729         * reserved_va must be aligned with the host page size
 730         * as it is used with mmap()
 731         */
 732        reserved_va = max_reserved_va & qemu_host_page_mask;
 733    }
 734
 735    {
 736        Error *err = NULL;
 737        if (seed_optarg != NULL) {
 738            qemu_guest_random_seed_main(seed_optarg, &err);
 739        } else {
 740            qcrypto_init(&err);
 741        }
 742        if (err) {
 743            error_reportf_err(err, "cannot initialize crypto: ");
 744            exit(1);
 745        }
 746    }
 747
 748    target_environ = envlist_to_environ(envlist, NULL);
 749    envlist_free(envlist);
 750
 751    /*
 752     * Read in mmap_min_addr kernel parameter.  This value is used
 753     * When loading the ELF image to determine whether guest_base
 754     * is needed.  It is also used in mmap_find_vma.
 755     */
 756    {
 757        FILE *fp;
 758
 759        if ((fp = fopen("/proc/sys/vm/mmap_min_addr", "r")) != NULL) {
 760            unsigned long tmp;
 761            if (fscanf(fp, "%lu", &tmp) == 1) {
 762                mmap_min_addr = tmp;
 763                qemu_log_mask(CPU_LOG_PAGE, "host mmap_min_addr=0x%lx\n", mmap_min_addr);
 764            }
 765            fclose(fp);
 766        }
 767    }
 768
 769    /*
 770     * Prepare copy of argv vector for target.
 771     */
 772    target_argc = argc - optind;
 773    target_argv = calloc(target_argc + 1, sizeof (char *));
 774    if (target_argv == NULL) {
 775        (void) fprintf(stderr, "Unable to allocate memory for target_argv\n");
 776        exit(EXIT_FAILURE);
 777    }
 778
 779    /*
 780     * If argv0 is specified (using '-0' switch) we replace
 781     * argv[0] pointer with the given one.
 782     */
 783    i = 0;
 784    if (argv0 != NULL) {
 785        target_argv[i++] = strdup(argv0);
 786    }
 787    for (; i < target_argc; i++) {
 788        target_argv[i] = strdup(argv[optind + i]);
 789    }
 790    target_argv[target_argc] = NULL;
 791
 792    ts = g_new0(TaskState, 1);
 793    init_task_state(ts);
 794    /* build Task State */
 795    ts->info = info;
 796    ts->bprm = &bprm;
 797    cpu->opaque = ts;
 798    task_settid(ts);
 799
 800    ret = loader_exec(execfd, exec_path, target_argv, target_environ, regs,
 801        info, &bprm);
 802    if (ret != 0) {
 803        printf("Error while loading %s: %s\n", exec_path, strerror(-ret));
 804        _exit(EXIT_FAILURE);
 805    }
 806
 807    for (wrk = target_environ; *wrk; wrk++) {
 808        g_free(*wrk);
 809    }
 810
 811    g_free(target_environ);
 812
 813    if (qemu_loglevel_mask(CPU_LOG_PAGE)) {
 814        qemu_log("guest_base  0x%lx\n", guest_base);
 815        log_page_dump("binary load");
 816
 817        qemu_log("start_brk   0x" TARGET_ABI_FMT_lx "\n", info->start_brk);
 818        qemu_log("end_code    0x" TARGET_ABI_FMT_lx "\n", info->end_code);
 819        qemu_log("start_code  0x" TARGET_ABI_FMT_lx "\n", info->start_code);
 820        qemu_log("start_data  0x" TARGET_ABI_FMT_lx "\n", info->start_data);
 821        qemu_log("end_data    0x" TARGET_ABI_FMT_lx "\n", info->end_data);
 822        qemu_log("start_stack 0x" TARGET_ABI_FMT_lx "\n", info->start_stack);
 823        qemu_log("brk         0x" TARGET_ABI_FMT_lx "\n", info->brk);
 824        qemu_log("entry       0x" TARGET_ABI_FMT_lx "\n", info->entry);
 825        qemu_log("argv_start  0x" TARGET_ABI_FMT_lx "\n", info->arg_start);
 826        qemu_log("env_start   0x" TARGET_ABI_FMT_lx "\n",
 827                 info->arg_end + (abi_ulong)sizeof(abi_ulong));
 828        qemu_log("auxv_start  0x" TARGET_ABI_FMT_lx "\n", info->saved_auxv);
 829    }
 830
 831    target_set_brk(info->brk);
 832    syscall_init();
 833    signal_init();
 834
 835    /* Now that we've loaded the binary, GUEST_BASE is fixed.  Delay
 836       generating the prologue until now so that the prologue can take
 837       the real value of GUEST_BASE into account.  */
 838    tcg_prologue_init(tcg_ctx);
 839    tcg_region_init();
 840
 841    target_cpu_copy_regs(env, regs);
 842
 843    if (gdbstub) {
 844        if (gdbserver_start(gdbstub) < 0) {
 845            fprintf(stderr, "qemu: could not open gdbserver on %s\n",
 846                    gdbstub);
 847            exit(EXIT_FAILURE);
 848        }
 849        gdb_handlesig(cpu, 0);
 850    }
 851    cpu_loop(env);
 852    /* never exits */
 853    return 0;
 854}
 855