1 /* 2 * QEMU System Emulator 3 * 4 * Copyright (c) 2003-2008 Fabrice Bellard 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a copy 7 * of this software and associated documentation files (the "Software"), to deal 8 * in the Software without restriction, including without limitation the rights 9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 * copies of the Software, and to permit persons to whom the Software is 11 * furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included in 14 * all copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 * THE SOFTWARE. 23 */ 24 #include "config-host.h" 25 26 #include "monitor.h" 27 #include "sysemu.h" 28 #include "gdbstub.h" 29 #include "dma.h" 30 #include "kvm.h" 31 32 #include "cpus.h" 33 34 static CPUState *cur_cpu; 35 static CPUState *next_cpu; 36 37 /***********************************************************/ 38 void hw_error(const char *fmt, ...) 39 { 40 va_list ap; 41 CPUState *env; 42 43 va_start(ap, fmt); 44 fprintf(stderr, "qemu: hardware error: "); 45 vfprintf(stderr, fmt, ap); 46 fprintf(stderr, "\n"); 47 for(env = first_cpu; env != NULL; env = env->next_cpu) { 48 fprintf(stderr, "CPU #%d:\n", env->cpu_index); 49 #ifdef TARGET_I386 50 cpu_dump_state(env, stderr, fprintf, X86_DUMP_FPU); 51 #else 52 cpu_dump_state(env, stderr, fprintf, 0); 53 #endif 54 } 55 va_end(ap); 56 abort(); 57 } 58 59 static void do_vm_stop(int reason) 60 { 61 if (vm_running) { 62 cpu_disable_ticks(); 63 vm_running = 0; 64 pause_all_vcpus(); 65 vm_state_notify(0, reason); 66 } 67 } 68 69 static int cpu_can_run(CPUState *env) 70 { 71 if (env->stop) 72 return 0; 73 if (env->stopped) 74 return 0; 75 return 1; 76 } 77 78 static int cpu_has_work(CPUState *env) 79 { 80 if (env->stop) 81 return 1; 82 if (env->stopped) 83 return 0; 84 if (!env->halted) 85 return 1; 86 if (qemu_cpu_has_work(env)) 87 return 1; 88 return 0; 89 } 90 91 int tcg_has_work(void) 92 { 93 CPUState *env; 94 95 for (env = first_cpu; env != NULL; env = env->next_cpu) 96 if (cpu_has_work(env)) 97 return 1; 98 return 0; 99 } 100 101 #ifndef _WIN32 102 static int io_thread_fd = -1; 103 104 #if 0 105 static void qemu_event_increment(void) 106 { 107 static const char byte = 0; 108 109 if (io_thread_fd == -1) 110 return; 111 112 write(io_thread_fd, &byte, sizeof(byte)); 113 } 114 #endif 115 116 static void qemu_event_read(void *opaque) 117 { 118 int fd = (unsigned long)opaque; 119 ssize_t len; 120 121 /* Drain the notify pipe */ 122 do { 123 char buffer[512]; 124 len = read(fd, buffer, sizeof(buffer)); 125 } while ((len == -1 && errno == EINTR) || len > 0); 126 } 127 128 static int qemu_event_init(void) 129 { 130 int err; 131 int fds[2]; 132 133 err = pipe(fds); 134 if (err == -1) 135 return -errno; 136 137 err = fcntl_setfl(fds[0], O_NONBLOCK); 138 if (err < 0) 139 goto fail; 140 141 err = fcntl_setfl(fds[1], O_NONBLOCK); 142 if (err < 0) 143 goto fail; 144 145 qemu_set_fd_handler2(fds[0], NULL, qemu_event_read, NULL, 146 (void *)(unsigned long)fds[0]); 147 148 io_thread_fd = fds[1]; 149 return 0; 150 151 fail: 152 close(fds[0]); 153 close(fds[1]); 154 return err; 155 } 156 #else 157 HANDLE qemu_event_handle; 158 159 static void dummy_event_handler(void *opaque) 160 { 161 } 162 163 static int qemu_event_init(void) 164 { 165 qemu_event_handle = CreateEvent(NULL, FALSE, FALSE, NULL); 166 if (!qemu_event_handle) { 167 perror("Failed CreateEvent"); 168 return -1; 169 } 170 qemu_add_wait_object(qemu_event_handle, dummy_event_handler, NULL); 171 return 0; 172 } 173 174 #if 0 175 static void qemu_event_increment(void) 176 { 177 SetEvent(qemu_event_handle); 178 } 179 #endif 180 #endif 181 182 #ifndef CONFIG_IOTHREAD 183 int qemu_init_main_loop(void) 184 { 185 return qemu_event_init(); 186 } 187 188 void qemu_init_vcpu(void *_env) 189 { 190 CPUState *env = _env; 191 192 if (kvm_enabled()) 193 kvm_init_vcpu(env); 194 return; 195 } 196 197 int qemu_cpu_self(void *env) 198 { 199 return 1; 200 } 201 202 void resume_all_vcpus(void) 203 { 204 } 205 206 void pause_all_vcpus(void) 207 { 208 } 209 210 void qemu_cpu_kick(void *env) 211 { 212 return; 213 } 214 215 void qemu_notify_event(void) 216 { 217 CPUState *env = cpu_single_env; 218 219 if (env) { 220 cpu_exit(env); 221 #ifdef USE_KQEMU 222 if (env->kqemu_enabled) 223 kqemu_cpu_interrupt(env); 224 #endif 225 } 226 } 227 228 void qemu_mutex_lock_iothread(void) 229 { 230 } 231 232 void qemu_mutex_unlock_iothread(void) 233 { 234 } 235 236 void vm_stop(int reason) 237 { 238 do_vm_stop(reason); 239 } 240 241 #else /* CONFIG_IOTHREAD */ 242 243 #include "qemu-thread.h" 244 245 QemuMutex qemu_global_mutex; 246 static QemuMutex qemu_fair_mutex; 247 248 static QemuThread io_thread; 249 250 static QemuThread *tcg_cpu_thread; 251 static QemuCond *tcg_halt_cond; 252 253 static int qemu_system_ready; 254 /* cpu creation */ 255 static QemuCond qemu_cpu_cond; 256 /* system init */ 257 static QemuCond qemu_system_cond; 258 static QemuCond qemu_pause_cond; 259 260 static void block_io_signals(void); 261 static void unblock_io_signals(void); 262 static int tcg_has_work(void); 263 264 int qemu_init_main_loop(void) 265 { 266 int ret; 267 268 ret = qemu_event_init(); 269 if (ret) 270 return ret; 271 272 qemu_cond_init(&qemu_pause_cond); 273 qemu_mutex_init(&qemu_fair_mutex); 274 qemu_mutex_init(&qemu_global_mutex); 275 qemu_mutex_lock(&qemu_global_mutex); 276 277 unblock_io_signals(); 278 qemu_thread_self(&io_thread); 279 280 return 0; 281 } 282 283 static void qemu_wait_io_event(CPUState *env) 284 { 285 while (!tcg_has_work()) 286 qemu_cond_timedwait(env->halt_cond, &qemu_global_mutex, 1000); 287 288 qemu_mutex_unlock(&qemu_global_mutex); 289 290 /* 291 * Users of qemu_global_mutex can be starved, having no chance 292 * to acquire it since this path will get to it first. 293 * So use another lock to provide fairness. 294 */ 295 qemu_mutex_lock(&qemu_fair_mutex); 296 qemu_mutex_unlock(&qemu_fair_mutex); 297 298 qemu_mutex_lock(&qemu_global_mutex); 299 if (env->stop) { 300 env->stop = 0; 301 env->stopped = 1; 302 qemu_cond_signal(&qemu_pause_cond); 303 } 304 } 305 306 static int qemu_cpu_exec(CPUState *env); 307 308 static void *kvm_cpu_thread_fn(void *arg) 309 { 310 CPUState *env = arg; 311 312 block_io_signals(); 313 qemu_thread_self(env->thread); 314 315 /* signal CPU creation */ 316 qemu_mutex_lock(&qemu_global_mutex); 317 env->created = 1; 318 qemu_cond_signal(&qemu_cpu_cond); 319 320 /* and wait for machine initialization */ 321 while (!qemu_system_ready) 322 qemu_cond_timedwait(&qemu_system_cond, &qemu_global_mutex, 100); 323 324 while (1) { 325 if (cpu_can_run(env)) 326 qemu_cpu_exec(env); 327 qemu_wait_io_event(env); 328 } 329 330 return NULL; 331 } 332 333 static void tcg_cpu_exec(void); 334 335 static void *tcg_cpu_thread_fn(void *arg) 336 { 337 CPUState *env = arg; 338 339 block_io_signals(); 340 qemu_thread_self(env->thread); 341 342 /* signal CPU creation */ 343 qemu_mutex_lock(&qemu_global_mutex); 344 for (env = first_cpu; env != NULL; env = env->next_cpu) 345 env->created = 1; 346 qemu_cond_signal(&qemu_cpu_cond); 347 348 /* and wait for machine initialization */ 349 while (!qemu_system_ready) 350 qemu_cond_timedwait(&qemu_system_cond, &qemu_global_mutex, 100); 351 352 while (1) { 353 tcg_cpu_exec(); 354 qemu_wait_io_event(cur_cpu); 355 } 356 357 return NULL; 358 } 359 360 void qemu_cpu_kick(void *_env) 361 { 362 CPUState *env = _env; 363 qemu_cond_broadcast(env->halt_cond); 364 if (kvm_enabled()) 365 qemu_thread_signal(env->thread, SIGUSR1); 366 } 367 368 int qemu_cpu_self(void *env) 369 { 370 return (cpu_single_env != NULL); 371 } 372 373 static void cpu_signal(int sig) 374 { 375 if (cpu_single_env) 376 cpu_exit(cpu_single_env); 377 } 378 379 static void block_io_signals(void) 380 { 381 sigset_t set; 382 struct sigaction sigact; 383 384 sigemptyset(&set); 385 sigaddset(&set, SIGUSR2); 386 sigaddset(&set, SIGIO); 387 sigaddset(&set, SIGALRM); 388 pthread_sigmask(SIG_BLOCK, &set, NULL); 389 390 sigemptyset(&set); 391 sigaddset(&set, SIGUSR1); 392 pthread_sigmask(SIG_UNBLOCK, &set, NULL); 393 394 memset(&sigact, 0, sizeof(sigact)); 395 sigact.sa_handler = cpu_signal; 396 sigaction(SIGUSR1, &sigact, NULL); 397 } 398 399 static void unblock_io_signals(void) 400 { 401 sigset_t set; 402 403 sigemptyset(&set); 404 sigaddset(&set, SIGUSR2); 405 sigaddset(&set, SIGIO); 406 sigaddset(&set, SIGALRM); 407 pthread_sigmask(SIG_UNBLOCK, &set, NULL); 408 409 sigemptyset(&set); 410 sigaddset(&set, SIGUSR1); 411 pthread_sigmask(SIG_BLOCK, &set, NULL); 412 } 413 414 static void qemu_signal_lock(unsigned int msecs) 415 { 416 qemu_mutex_lock(&qemu_fair_mutex); 417 418 while (qemu_mutex_trylock(&qemu_global_mutex)) { 419 qemu_thread_signal(tcg_cpu_thread, SIGUSR1); 420 if (!qemu_mutex_timedlock(&qemu_global_mutex, msecs)) 421 break; 422 } 423 qemu_mutex_unlock(&qemu_fair_mutex); 424 } 425 426 void qemu_mutex_lock_iothread(void) 427 { 428 if (kvm_enabled()) { 429 qemu_mutex_lock(&qemu_fair_mutex); 430 qemu_mutex_lock(&qemu_global_mutex); 431 qemu_mutex_unlock(&qemu_fair_mutex); 432 } else 433 qemu_signal_lock(100); 434 } 435 436 void qemu_mutex_unlock_iothread(void) 437 { 438 qemu_mutex_unlock(&qemu_global_mutex); 439 } 440 441 static int all_vcpus_paused(void) 442 { 443 CPUState *penv = first_cpu; 444 445 while (penv) { 446 if (!penv->stopped) 447 return 0; 448 penv = (CPUState *)penv->next_cpu; 449 } 450 451 return 1; 452 } 453 454 void pause_all_vcpus(void) 455 { 456 CPUState *penv = first_cpu; 457 458 while (penv) { 459 penv->stop = 1; 460 qemu_thread_signal(penv->thread, SIGUSR1); 461 qemu_cpu_kick(penv); 462 penv = (CPUState *)penv->next_cpu; 463 } 464 465 while (!all_vcpus_paused()) { 466 qemu_cond_timedwait(&qemu_pause_cond, &qemu_global_mutex, 100); 467 penv = first_cpu; 468 while (penv) { 469 qemu_thread_signal(penv->thread, SIGUSR1); 470 penv = (CPUState *)penv->next_cpu; 471 } 472 } 473 } 474 475 void resume_all_vcpus(void) 476 { 477 CPUState *penv = first_cpu; 478 479 while (penv) { 480 penv->stop = 0; 481 penv->stopped = 0; 482 qemu_thread_signal(penv->thread, SIGUSR1); 483 qemu_cpu_kick(penv); 484 penv = (CPUState *)penv->next_cpu; 485 } 486 } 487 488 static void tcg_init_vcpu(void *_env) 489 { 490 CPUState *env = _env; 491 /* share a single thread for all cpus with TCG */ 492 if (!tcg_cpu_thread) { 493 env->thread = qemu_mallocz(sizeof(QemuThread)); 494 env->halt_cond = qemu_mallocz(sizeof(QemuCond)); 495 qemu_cond_init(env->halt_cond); 496 qemu_thread_create(env->thread, tcg_cpu_thread_fn, env); 497 while (env->created == 0) 498 qemu_cond_timedwait(&qemu_cpu_cond, &qemu_global_mutex, 100); 499 tcg_cpu_thread = env->thread; 500 tcg_halt_cond = env->halt_cond; 501 } else { 502 env->thread = tcg_cpu_thread; 503 env->halt_cond = tcg_halt_cond; 504 } 505 } 506 507 static void kvm_start_vcpu(CPUState *env) 508 { 509 #if 0 510 kvm_init_vcpu(env); 511 env->thread = qemu_mallocz(sizeof(QemuThread)); 512 env->halt_cond = qemu_mallocz(sizeof(QemuCond)); 513 qemu_cond_init(env->halt_cond); 514 qemu_thread_create(env->thread, kvm_cpu_thread_fn, env); 515 while (env->created == 0) 516 qemu_cond_timedwait(&qemu_cpu_cond, &qemu_global_mutex, 100); 517 #endif 518 } 519 520 void qemu_init_vcpu(void *_env) 521 { 522 CPUState *env = _env; 523 524 if (kvm_enabled()) 525 kvm_start_vcpu(env); 526 else 527 tcg_init_vcpu(env); 528 } 529 530 void qemu_notify_event(void) 531 { 532 qemu_event_increment(); 533 } 534 535 void vm_stop(int reason) 536 { 537 QemuThread me; 538 qemu_thread_self(&me); 539 540 if (!qemu_thread_equal(&me, &io_thread)) { 541 qemu_system_vmstop_request(reason); 542 /* 543 * FIXME: should not return to device code in case 544 * vm_stop() has been requested. 545 */ 546 if (cpu_single_env) { 547 cpu_exit(cpu_single_env); 548 cpu_single_env->stop = 1; 549 } 550 return; 551 } 552 do_vm_stop(reason); 553 } 554 555 #endif 556 557 static int qemu_cpu_exec(CPUState *env) 558 { 559 int ret; 560 #ifdef CONFIG_PROFILER 561 int64_t ti; 562 #endif 563 564 #ifdef CONFIG_PROFILER 565 ti = profile_getclock(); 566 #endif 567 if (use_icount) { 568 int64_t count; 569 int decr; 570 qemu_icount -= (env->icount_decr.u16.low + env->icount_extra); 571 env->icount_decr.u16.low = 0; 572 env->icount_extra = 0; 573 count = qemu_next_icount_deadline(); 574 count = (count + (1 << icount_time_shift) - 1) 575 >> icount_time_shift; 576 qemu_icount += count; 577 decr = (count > 0xffff) ? 0xffff : count; 578 count -= decr; 579 env->icount_decr.u16.low = decr; 580 env->icount_extra = count; 581 } 582 #ifdef CONFIG_TRACE 583 if (tbflush_requested) { 584 tbflush_requested = 0; 585 tb_flush(env); 586 return EXCP_INTERRUPT; 587 } 588 #endif 589 590 591 ret = cpu_exec(env); 592 #ifdef CONFIG_PROFILER 593 qemu_time += profile_getclock() - ti; 594 #endif 595 if (use_icount) { 596 /* Fold pending instructions back into the 597 instruction counter, and clear the interrupt flag. */ 598 qemu_icount -= (env->icount_decr.u16.low 599 + env->icount_extra); 600 env->icount_decr.u32 = 0; 601 env->icount_extra = 0; 602 } 603 return ret; 604 } 605 606 void tcg_cpu_exec(void) 607 { 608 int ret = 0; 609 610 if (next_cpu == NULL) 611 next_cpu = first_cpu; 612 for (; next_cpu != NULL; next_cpu = next_cpu->next_cpu) { 613 CPUState *env = cur_cpu = next_cpu; 614 615 if (!vm_running) 616 break; 617 if (qemu_timer_alarm_pending()) { 618 break; 619 } 620 if (cpu_can_run(env)) 621 ret = qemu_cpu_exec(env); 622 if (ret == EXCP_DEBUG) { 623 gdb_set_stop_cpu(env); 624 debug_requested = 1; 625 break; 626 } 627 } 628 } 629 630