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