1 /* 2 * qemu bsd user main 3 * 4 * Copyright (c) 2003-2008 Fabrice Bellard 5 * Copyright (c) 2013-14 Stacey Son 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation; either version 2 of the License, or 10 * (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, see <http://www.gnu.org/licenses/>. 19 */ 20 21 #include "qemu/osdep.h" 22 #include <sys/resource.h> 23 #include <sys/sysctl.h> 24 25 #include "qemu/help-texts.h" 26 #include "qemu/units.h" 27 #include "qemu/accel.h" 28 #include "qemu-version.h" 29 #include <machine/trap.h> 30 31 #include "qapi/error.h" 32 #include "qemu.h" 33 #include "qemu/config-file.h" 34 #include "qemu/error-report.h" 35 #include "qemu/path.h" 36 #include "qemu/help_option.h" 37 #include "qemu/module.h" 38 #include "exec/exec-all.h" 39 #include "tcg/startup.h" 40 #include "qemu/timer.h" 41 #include "qemu/envlist.h" 42 #include "qemu/cutils.h" 43 #include "exec/log.h" 44 #include "trace/control.h" 45 #include "crypto/init.h" 46 #include "qemu/guest-random.h" 47 #include "gdbstub/user.h" 48 49 #include "host-os.h" 50 #include "target_arch_cpu.h" 51 52 53 /* 54 * TODO: Remove these and rely only on qemu_real_host_page_size(). 55 */ 56 uintptr_t qemu_host_page_size; 57 intptr_t qemu_host_page_mask; 58 59 static bool opt_one_insn_per_tb; 60 uintptr_t guest_base; 61 bool have_guest_base; 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 # define MAX_RESERVED_VA 0xfffffffful 79 # else 80 # define MAX_RESERVED_VA ((1ul << TARGET_VIRT_ADDR_SPACE_BITS) - 1) 81 # endif 82 # else 83 # define MAX_RESERVED_VA 0 84 # endif 85 #endif 86 87 /* 88 * That said, reserving *too* much vm space via mmap can run into problems 89 * with rlimits, oom due to page table creation, etc. We will still try it, 90 * if directed by the command-line option, but not by default. 91 */ 92 #if HOST_LONG_BITS == 64 && TARGET_VIRT_ADDR_SPACE_BITS <= 32 93 unsigned long reserved_va = MAX_RESERVED_VA; 94 #else 95 unsigned long reserved_va; 96 #endif 97 98 const char *interp_prefix = CONFIG_QEMU_INTERP_PREFIX; 99 const char *qemu_uname_release; 100 char qemu_proc_pathname[PATH_MAX]; /* full path to exeutable */ 101 102 unsigned long target_maxtsiz = TARGET_MAXTSIZ; /* max text size */ 103 unsigned long target_dfldsiz = TARGET_DFLDSIZ; /* initial data size limit */ 104 unsigned long target_maxdsiz = TARGET_MAXDSIZ; /* max data size */ 105 unsigned long target_dflssiz = TARGET_DFLSSIZ; /* initial data size limit */ 106 unsigned long target_maxssiz = TARGET_MAXSSIZ; /* max stack size */ 107 unsigned long target_sgrowsiz = TARGET_SGROWSIZ; /* amount to grow stack */ 108 109 /* Helper routines for implementing atomic operations. */ 110 111 void fork_start(void) 112 { 113 start_exclusive(); 114 cpu_list_lock(); 115 mmap_fork_start(); 116 gdbserver_fork_start(); 117 } 118 119 void fork_end(pid_t pid) 120 { 121 bool child = pid == 0; 122 123 if (child) { 124 CPUState *cpu, *next_cpu; 125 /* 126 * Child processes created by fork() only have a single thread. Discard 127 * information about the parent threads. 128 */ 129 CPU_FOREACH_SAFE(cpu, next_cpu) { 130 if (cpu != thread_cpu) { 131 QTAILQ_REMOVE_RCU(&cpus_queue, cpu, node); 132 } 133 } 134 mmap_fork_end(child); 135 /* 136 * qemu_init_cpu_list() takes care of reinitializing the exclusive 137 * state, so we don't need to end_exclusive() here. 138 */ 139 qemu_init_cpu_list(); 140 get_task_state(thread_cpu)->ts_tid = qemu_get_thread_id(); 141 gdbserver_fork(thread_cpu, pid); 142 } else { 143 mmap_fork_end(child); 144 cpu_list_unlock(); 145 end_exclusive(); 146 } 147 } 148 149 void cpu_loop(CPUArchState *env) 150 { 151 target_cpu_loop(env); 152 } 153 154 static void usage(void) 155 { 156 printf("qemu-" TARGET_NAME " version " QEMU_FULL_VERSION 157 "\n" QEMU_COPYRIGHT "\n" 158 "usage: qemu-" TARGET_NAME " [options] program [arguments...]\n" 159 "BSD CPU emulator (compiled for %s emulation)\n" 160 "\n" 161 "Standard options:\n" 162 "-h print this help\n" 163 "-g port wait gdb connection to port\n" 164 "-L path set the elf interpreter prefix (default=%s)\n" 165 "-s size set the stack size in bytes (default=%ld)\n" 166 "-cpu model select CPU (-cpu help for list)\n" 167 "-drop-ld-preload drop LD_PRELOAD for target process\n" 168 "-E var=value sets/modifies targets environment variable(s)\n" 169 "-U var unsets targets environment variable(s)\n" 170 "-B address set guest_base address to address\n" 171 "\n" 172 "Debug options:\n" 173 "-d item1[,...] enable logging of specified items\n" 174 " (use '-d help' for a list of log items)\n" 175 "-D logfile write logs to 'logfile' (default stderr)\n" 176 "-one-insn-per-tb run with one guest instruction per emulated TB\n" 177 "-strace log system calls\n" 178 "-trace [[enable=]<pattern>][,events=<file>][,file=<file>]\n" 179 " specify tracing options\n" 180 "\n" 181 "Environment variables:\n" 182 "QEMU_STRACE Print system calls and arguments similar to the\n" 183 " 'strace' program. Enable by setting to any value.\n" 184 "You can use -E and -U options to set/unset environment variables\n" 185 "for target process. It is possible to provide several variables\n" 186 "by repeating the option. For example:\n" 187 " -E var1=val2 -E var2=val2 -U LD_PRELOAD -U LD_DEBUG\n" 188 "Note that if you provide several changes to single variable\n" 189 "last change will stay in effect.\n" 190 "\n" 191 QEMU_HELP_BOTTOM "\n" 192 , 193 TARGET_NAME, 194 interp_prefix, 195 target_dflssiz); 196 exit(1); 197 } 198 199 __thread CPUState *thread_cpu; 200 201 void stop_all_tasks(void) 202 { 203 /* 204 * We trust when using NPTL (pthreads) start_exclusive() handles thread 205 * stopping correctly. 206 */ 207 start_exclusive(); 208 } 209 210 bool qemu_cpu_is_self(CPUState *cpu) 211 { 212 return thread_cpu == cpu; 213 } 214 215 void qemu_cpu_kick(CPUState *cpu) 216 { 217 cpu_exit(cpu); 218 } 219 220 /* Assumes contents are already zeroed. */ 221 static void init_task_state(TaskState *ts) 222 { 223 ts->sigaltstack_used = (struct target_sigaltstack) { 224 .ss_sp = 0, 225 .ss_size = 0, 226 .ss_flags = TARGET_SS_DISABLE, 227 }; 228 } 229 230 void gemu_log(const char *fmt, ...) 231 { 232 va_list ap; 233 234 va_start(ap, fmt); 235 vfprintf(stderr, fmt, ap); 236 va_end(ap); 237 } 238 239 static void 240 adjust_ssize(void) 241 { 242 struct rlimit rl; 243 244 if (getrlimit(RLIMIT_STACK, &rl) != 0) { 245 return; 246 } 247 248 target_maxssiz = MIN(target_maxssiz, rl.rlim_max); 249 target_dflssiz = MIN(MAX(target_dflssiz, rl.rlim_cur), target_maxssiz); 250 251 rl.rlim_max = target_maxssiz; 252 rl.rlim_cur = target_dflssiz; 253 setrlimit(RLIMIT_STACK, &rl); 254 } 255 256 static void save_proc_pathname(char *argv0) 257 { 258 int mib[4]; 259 size_t len; 260 261 mib[0] = CTL_KERN; 262 mib[1] = KERN_PROC; 263 mib[2] = KERN_PROC_PATHNAME; 264 mib[3] = -1; 265 266 len = sizeof(qemu_proc_pathname); 267 if (sysctl(mib, 4, qemu_proc_pathname, &len, NULL, 0)) { 268 perror("sysctl"); 269 } 270 } 271 272 int main(int argc, char **argv) 273 { 274 const char *filename; 275 const char *cpu_model; 276 const char *cpu_type; 277 const char *log_file = NULL; 278 const char *log_mask = NULL; 279 const char *seed_optarg = NULL; 280 struct target_pt_regs regs1, *regs = ®s1; 281 struct image_info info1, *info = &info1; 282 struct bsd_binprm bprm; 283 TaskState *ts; 284 CPUArchState *env; 285 CPUState *cpu; 286 int optind, rv; 287 const char *r; 288 const char *gdbstub = NULL; 289 char **target_environ, **wrk; 290 envlist_t *envlist = NULL; 291 char *argv0 = NULL; 292 293 adjust_ssize(); 294 295 if (argc <= 1) { 296 usage(); 297 } 298 299 save_proc_pathname(argv[0]); 300 301 error_init(argv[0]); 302 module_call_init(MODULE_INIT_TRACE); 303 qemu_init_cpu_list(); 304 module_call_init(MODULE_INIT_QOM); 305 306 envlist = envlist_create(); 307 308 /* 309 * add current environment into the list 310 * envlist_setenv adds to the front of the list; to preserve environ 311 * order add from back to front 312 */ 313 for (wrk = environ; *wrk != NULL; wrk++) { 314 continue; 315 } 316 while (wrk != environ) { 317 wrk--; 318 (void) envlist_setenv(envlist, *wrk); 319 } 320 321 qemu_host_page_size = getpagesize(); 322 qemu_host_page_size = MAX(qemu_host_page_size, TARGET_PAGE_SIZE); 323 324 cpu_model = NULL; 325 326 qemu_add_opts(&qemu_trace_opts); 327 328 optind = 1; 329 for (;;) { 330 if (optind >= argc) { 331 break; 332 } 333 r = argv[optind]; 334 if (r[0] != '-') { 335 break; 336 } 337 optind++; 338 r++; 339 if (!strcmp(r, "-")) { 340 break; 341 } else if (!strcmp(r, "d")) { 342 if (optind >= argc) { 343 break; 344 } 345 log_mask = argv[optind++]; 346 } else if (!strcmp(r, "D")) { 347 if (optind >= argc) { 348 break; 349 } 350 log_file = argv[optind++]; 351 } else if (!strcmp(r, "E")) { 352 r = argv[optind++]; 353 if (envlist_setenv(envlist, r) != 0) { 354 usage(); 355 } 356 } else if (!strcmp(r, "ignore-environment")) { 357 envlist_free(envlist); 358 envlist = envlist_create(); 359 } else if (!strcmp(r, "U")) { 360 r = argv[optind++]; 361 if (envlist_unsetenv(envlist, r) != 0) { 362 usage(); 363 } 364 } else if (!strcmp(r, "s")) { 365 r = argv[optind++]; 366 rv = qemu_strtoul(r, &r, 0, &target_dflssiz); 367 if (rv < 0 || target_dflssiz <= 0) { 368 usage(); 369 } 370 if (*r == 'M') { 371 target_dflssiz *= 1024 * 1024; 372 } else if (*r == 'k' || *r == 'K') { 373 target_dflssiz *= 1024; 374 } 375 if (target_dflssiz > target_maxssiz) { 376 usage(); 377 } 378 } else if (!strcmp(r, "L")) { 379 interp_prefix = argv[optind++]; 380 } else if (!strcmp(r, "p")) { 381 unsigned size, want = qemu_real_host_page_size(); 382 383 r = argv[optind++]; 384 if (qemu_strtoui(r, NULL, 10, &size) || size != want) { 385 warn_report("Deprecated page size option cannot " 386 "change host page size (%u)", want); 387 } 388 } else if (!strcmp(r, "g")) { 389 gdbstub = g_strdup(argv[optind++]); 390 } else if (!strcmp(r, "r")) { 391 qemu_uname_release = argv[optind++]; 392 } else if (!strcmp(r, "cpu")) { 393 cpu_model = argv[optind++]; 394 if (is_help_option(cpu_model)) { 395 list_cpus(); 396 exit(1); 397 } 398 } else if (!strcmp(r, "B")) { 399 rv = qemu_strtoul(argv[optind++], NULL, 0, &guest_base); 400 if (rv < 0) { 401 usage(); 402 } 403 have_guest_base = true; 404 } else if (!strcmp(r, "drop-ld-preload")) { 405 (void) envlist_unsetenv(envlist, "LD_PRELOAD"); 406 } else if (!strcmp(r, "seed")) { 407 seed_optarg = optarg; 408 } else if (!strcmp(r, "one-insn-per-tb")) { 409 opt_one_insn_per_tb = true; 410 } else if (!strcmp(r, "strace")) { 411 do_strace = 1; 412 } else if (!strcmp(r, "trace")) { 413 trace_opt_parse(optarg); 414 } else if (!strcmp(r, "0")) { 415 argv0 = argv[optind++]; 416 } else { 417 usage(); 418 } 419 } 420 421 qemu_host_page_mask = -qemu_host_page_size; 422 423 /* init debug */ 424 { 425 int mask = 0; 426 if (log_mask) { 427 mask = qemu_str_to_log_mask(log_mask); 428 if (!mask) { 429 qemu_print_log_usage(stdout); 430 exit(1); 431 } 432 } 433 qemu_set_log_filename_flags(log_file, mask, &error_fatal); 434 } 435 436 if (optind >= argc) { 437 usage(); 438 } 439 filename = argv[optind]; 440 if (argv0) { 441 argv[optind] = argv0; 442 } 443 444 if (!trace_init_backends()) { 445 exit(1); 446 } 447 trace_init_file(); 448 449 /* Zero out regs */ 450 memset(regs, 0, sizeof(struct target_pt_regs)); 451 452 /* Zero bsd params */ 453 memset(&bprm, 0, sizeof(bprm)); 454 455 /* Zero out image_info */ 456 memset(info, 0, sizeof(struct image_info)); 457 458 /* Scan interp_prefix dir for replacement files. */ 459 init_paths(interp_prefix); 460 461 if (cpu_model == NULL) { 462 cpu_model = TARGET_DEFAULT_CPU_MODEL; 463 } 464 465 cpu_type = parse_cpu_option(cpu_model); 466 467 /* init tcg before creating CPUs and to get qemu_host_page_size */ 468 { 469 AccelState *accel = current_accel(); 470 AccelClass *ac = ACCEL_GET_CLASS(accel); 471 472 accel_init_interfaces(ac); 473 object_property_set_bool(OBJECT(accel), "one-insn-per-tb", 474 opt_one_insn_per_tb, &error_abort); 475 ac->init_machine(NULL); 476 } 477 cpu = cpu_create(cpu_type); 478 env = cpu_env(cpu); 479 cpu_reset(cpu); 480 thread_cpu = cpu; 481 482 if (getenv("QEMU_STRACE")) { 483 do_strace = 1; 484 } 485 486 target_environ = envlist_to_environ(envlist, NULL); 487 envlist_free(envlist); 488 489 { 490 Error *err = NULL; 491 if (seed_optarg != NULL) { 492 qemu_guest_random_seed_main(seed_optarg, &err); 493 } else { 494 qcrypto_init(&err); 495 } 496 if (err) { 497 error_reportf_err(err, "cannot initialize crypto: "); 498 exit(1); 499 } 500 } 501 502 /* 503 * Now that page sizes are configured we can do 504 * proper page alignment for guest_base. 505 */ 506 if (have_guest_base) { 507 if (guest_base & ~qemu_host_page_mask) { 508 error_report("Selected guest base not host page aligned"); 509 exit(1); 510 } 511 } 512 513 /* 514 * If reserving host virtual address space, do so now. 515 * Combined with '-B', ensure that the chosen range is free. 516 */ 517 if (reserved_va) { 518 void *p; 519 520 if (have_guest_base) { 521 p = mmap((void *)guest_base, reserved_va + 1, PROT_NONE, 522 MAP_ANON | MAP_PRIVATE | MAP_FIXED | MAP_EXCL, -1, 0); 523 } else { 524 p = mmap(NULL, reserved_va + 1, PROT_NONE, 525 MAP_ANON | MAP_PRIVATE, -1, 0); 526 } 527 if (p == MAP_FAILED) { 528 const char *err = strerror(errno); 529 char *sz = size_to_str(reserved_va + 1); 530 531 if (have_guest_base) { 532 error_report("Cannot allocate %s bytes at -B %p for guest " 533 "address space: %s", sz, (void *)guest_base, err); 534 } else { 535 error_report("Cannot allocate %s bytes for guest " 536 "address space: %s", sz, err); 537 } 538 exit(1); 539 } 540 guest_base = (uintptr_t)p; 541 have_guest_base = true; 542 543 /* Ensure that mmap_next_start is within range. */ 544 if (reserved_va <= mmap_next_start) { 545 mmap_next_start = (reserved_va / 4 * 3) 546 & TARGET_PAGE_MASK & qemu_host_page_mask; 547 } 548 } 549 550 if (loader_exec(filename, argv + optind, target_environ, regs, info, 551 &bprm) != 0) { 552 printf("Error loading %s\n", filename); 553 _exit(1); 554 } 555 556 for (wrk = target_environ; *wrk; wrk++) { 557 g_free(*wrk); 558 } 559 560 g_free(target_environ); 561 562 if (qemu_loglevel_mask(CPU_LOG_PAGE)) { 563 FILE *f = qemu_log_trylock(); 564 if (f) { 565 fprintf(f, "guest_base %p\n", (void *)guest_base); 566 fprintf(f, "page layout changed following binary load\n"); 567 page_dump(f); 568 569 fprintf(f, "end_code 0x" TARGET_ABI_FMT_lx "\n", 570 info->end_code); 571 fprintf(f, "start_code 0x" TARGET_ABI_FMT_lx "\n", 572 info->start_code); 573 fprintf(f, "start_data 0x" TARGET_ABI_FMT_lx "\n", 574 info->start_data); 575 fprintf(f, "end_data 0x" TARGET_ABI_FMT_lx "\n", 576 info->end_data); 577 fprintf(f, "start_stack 0x" TARGET_ABI_FMT_lx "\n", 578 info->start_stack); 579 fprintf(f, "brk 0x" TARGET_ABI_FMT_lx "\n", info->brk); 580 fprintf(f, "entry 0x" TARGET_ABI_FMT_lx "\n", info->entry); 581 582 qemu_log_unlock(f); 583 } 584 } 585 586 /* build Task State */ 587 ts = g_new0(TaskState, 1); 588 init_task_state(ts); 589 ts->info = info; 590 ts->bprm = &bprm; 591 cpu->opaque = ts; 592 593 target_set_brk(info->brk); 594 syscall_init(); 595 signal_init(); 596 597 /* 598 * Now that we've loaded the binary, GUEST_BASE is fixed. Delay 599 * generating the prologue until now so that the prologue can take 600 * the real value of GUEST_BASE into account. 601 */ 602 tcg_prologue_init(); 603 604 target_cpu_init(env, regs); 605 606 if (gdbstub) { 607 gdbserver_start(gdbstub); 608 gdb_handlesig(cpu, 0); 609 } 610 cpu_loop(env); 611 /* never exits */ 612 return 0; 613 } 614