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