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 25 #include "qemu/osdep.h" 26 #include "monitor/monitor.h" 27 #include "qemu/coroutine-tls.h" 28 #include "qapi/error.h" 29 #include "qapi/qapi-commands-machine.h" 30 #include "qapi/qapi-commands-misc.h" 31 #include "qapi/qapi-events-run-state.h" 32 #include "qapi/qmp/qerror.h" 33 #include "exec/gdbstub.h" 34 #include "sysemu/hw_accel.h" 35 #include "exec/cpu-common.h" 36 #include "qemu/thread.h" 37 #include "qemu/main-loop.h" 38 #include "qemu/plugin.h" 39 #include "sysemu/cpus.h" 40 #include "qemu/guest-random.h" 41 #include "hw/nmi.h" 42 #include "sysemu/replay.h" 43 #include "sysemu/runstate.h" 44 #include "sysemu/cpu-timers.h" 45 #include "sysemu/whpx.h" 46 #include "hw/boards.h" 47 #include "hw/hw.h" 48 #include "trace.h" 49 50 #ifdef CONFIG_LINUX 51 52 #include <sys/prctl.h> 53 54 #ifndef PR_MCE_KILL 55 #define PR_MCE_KILL 33 56 #endif 57 58 #ifndef PR_MCE_KILL_SET 59 #define PR_MCE_KILL_SET 1 60 #endif 61 62 #ifndef PR_MCE_KILL_EARLY 63 #define PR_MCE_KILL_EARLY 1 64 #endif 65 66 #endif /* CONFIG_LINUX */ 67 68 static QemuMutex qemu_global_mutex; 69 70 /* 71 * The chosen accelerator is supposed to register this. 72 */ 73 static const AccelOpsClass *cpus_accel; 74 75 bool cpu_is_stopped(CPUState *cpu) 76 { 77 return cpu->stopped || !runstate_is_running(); 78 } 79 80 bool cpu_work_list_empty(CPUState *cpu) 81 { 82 return QSIMPLEQ_EMPTY_ATOMIC(&cpu->work_list); 83 } 84 85 bool cpu_thread_is_idle(CPUState *cpu) 86 { 87 if (cpu->stop || !cpu_work_list_empty(cpu)) { 88 return false; 89 } 90 if (cpu_is_stopped(cpu)) { 91 return true; 92 } 93 if (!cpu->halted || cpu_has_work(cpu)) { 94 return false; 95 } 96 if (cpus_accel->cpu_thread_is_idle) { 97 return cpus_accel->cpu_thread_is_idle(cpu); 98 } 99 return true; 100 } 101 102 bool all_cpu_threads_idle(void) 103 { 104 CPUState *cpu; 105 106 CPU_FOREACH(cpu) { 107 if (!cpu_thread_is_idle(cpu)) { 108 return false; 109 } 110 } 111 return true; 112 } 113 114 /***********************************************************/ 115 void hw_error(const char *fmt, ...) 116 { 117 va_list ap; 118 CPUState *cpu; 119 120 va_start(ap, fmt); 121 fprintf(stderr, "qemu: hardware error: "); 122 vfprintf(stderr, fmt, ap); 123 fprintf(stderr, "\n"); 124 CPU_FOREACH(cpu) { 125 fprintf(stderr, "CPU #%d:\n", cpu->cpu_index); 126 cpu_dump_state(cpu, stderr, CPU_DUMP_FPU); 127 } 128 va_end(ap); 129 abort(); 130 } 131 132 void cpu_synchronize_all_states(void) 133 { 134 CPUState *cpu; 135 136 CPU_FOREACH(cpu) { 137 cpu_synchronize_state(cpu); 138 } 139 } 140 141 void cpu_synchronize_all_post_reset(void) 142 { 143 CPUState *cpu; 144 145 CPU_FOREACH(cpu) { 146 cpu_synchronize_post_reset(cpu); 147 } 148 } 149 150 void cpu_synchronize_all_post_init(void) 151 { 152 CPUState *cpu; 153 154 CPU_FOREACH(cpu) { 155 cpu_synchronize_post_init(cpu); 156 } 157 } 158 159 void cpu_synchronize_all_pre_loadvm(void) 160 { 161 CPUState *cpu; 162 163 CPU_FOREACH(cpu) { 164 cpu_synchronize_pre_loadvm(cpu); 165 } 166 } 167 168 void cpu_synchronize_state(CPUState *cpu) 169 { 170 if (cpus_accel->synchronize_state) { 171 cpus_accel->synchronize_state(cpu); 172 } 173 } 174 175 void cpu_synchronize_post_reset(CPUState *cpu) 176 { 177 if (cpus_accel->synchronize_post_reset) { 178 cpus_accel->synchronize_post_reset(cpu); 179 } 180 } 181 182 void cpu_synchronize_post_init(CPUState *cpu) 183 { 184 if (cpus_accel->synchronize_post_init) { 185 cpus_accel->synchronize_post_init(cpu); 186 } 187 } 188 189 void cpu_synchronize_pre_loadvm(CPUState *cpu) 190 { 191 if (cpus_accel->synchronize_pre_loadvm) { 192 cpus_accel->synchronize_pre_loadvm(cpu); 193 } 194 } 195 196 bool cpus_are_resettable(void) 197 { 198 if (cpus_accel->cpus_are_resettable) { 199 return cpus_accel->cpus_are_resettable(); 200 } 201 return true; 202 } 203 204 int64_t cpus_get_virtual_clock(void) 205 { 206 /* 207 * XXX 208 * 209 * need to check that cpus_accel is not NULL, because qcow2 calls 210 * qemu_get_clock_ns(CLOCK_VIRTUAL) without any accel initialized and 211 * with ticks disabled in some io-tests: 212 * 030 040 041 060 099 120 127 140 156 161 172 181 191 192 195 203 229 249 256 267 213 * 214 * is this expected? 215 * 216 * XXX 217 */ 218 if (cpus_accel && cpus_accel->get_virtual_clock) { 219 return cpus_accel->get_virtual_clock(); 220 } 221 return cpu_get_clock(); 222 } 223 224 /* 225 * return the time elapsed in VM between vm_start and vm_stop. Unless 226 * icount is active, cpus_get_elapsed_ticks() uses units of the host CPU cycle 227 * counter. 228 */ 229 int64_t cpus_get_elapsed_ticks(void) 230 { 231 if (cpus_accel->get_elapsed_ticks) { 232 return cpus_accel->get_elapsed_ticks(); 233 } 234 return cpu_get_ticks(); 235 } 236 237 static void generic_handle_interrupt(CPUState *cpu, int mask) 238 { 239 cpu->interrupt_request |= mask; 240 241 if (!qemu_cpu_is_self(cpu)) { 242 qemu_cpu_kick(cpu); 243 } 244 } 245 246 void cpu_interrupt(CPUState *cpu, int mask) 247 { 248 if (cpus_accel->handle_interrupt) { 249 cpus_accel->handle_interrupt(cpu, mask); 250 } else { 251 generic_handle_interrupt(cpu, mask); 252 } 253 } 254 255 static int do_vm_stop(RunState state, bool send_stop) 256 { 257 int ret = 0; 258 259 if (runstate_is_running()) { 260 runstate_set(state); 261 cpu_disable_ticks(); 262 pause_all_vcpus(); 263 vm_state_notify(0, state); 264 if (send_stop) { 265 qapi_event_send_stop(); 266 } 267 } 268 269 bdrv_drain_all(); 270 ret = bdrv_flush_all(); 271 trace_vm_stop_flush_all(ret); 272 273 return ret; 274 } 275 276 /* Special vm_stop() variant for terminating the process. Historically clients 277 * did not expect a QMP STOP event and so we need to retain compatibility. 278 */ 279 int vm_shutdown(void) 280 { 281 return do_vm_stop(RUN_STATE_SHUTDOWN, false); 282 } 283 284 bool cpu_can_run(CPUState *cpu) 285 { 286 if (cpu->stop) { 287 return false; 288 } 289 if (cpu_is_stopped(cpu)) { 290 return false; 291 } 292 return true; 293 } 294 295 void cpu_handle_guest_debug(CPUState *cpu) 296 { 297 if (replay_running_debug()) { 298 if (!cpu->singlestep_enabled) { 299 /* 300 * Report about the breakpoint and 301 * make a single step to skip it 302 */ 303 replay_breakpoint(); 304 cpu_single_step(cpu, SSTEP_ENABLE); 305 } else { 306 cpu_single_step(cpu, 0); 307 } 308 } else { 309 gdb_set_stop_cpu(cpu); 310 qemu_system_debug_request(); 311 cpu->stopped = true; 312 } 313 } 314 315 #ifdef CONFIG_LINUX 316 static void sigbus_reraise(void) 317 { 318 sigset_t set; 319 struct sigaction action; 320 321 memset(&action, 0, sizeof(action)); 322 action.sa_handler = SIG_DFL; 323 if (!sigaction(SIGBUS, &action, NULL)) { 324 raise(SIGBUS); 325 sigemptyset(&set); 326 sigaddset(&set, SIGBUS); 327 pthread_sigmask(SIG_UNBLOCK, &set, NULL); 328 } 329 perror("Failed to re-raise SIGBUS!"); 330 abort(); 331 } 332 333 static void sigbus_handler(int n, siginfo_t *siginfo, void *ctx) 334 { 335 if (siginfo->si_code != BUS_MCEERR_AO && siginfo->si_code != BUS_MCEERR_AR) { 336 sigbus_reraise(); 337 } 338 339 if (current_cpu) { 340 /* Called asynchronously in VCPU thread. */ 341 if (kvm_on_sigbus_vcpu(current_cpu, siginfo->si_code, siginfo->si_addr)) { 342 sigbus_reraise(); 343 } 344 } else { 345 /* Called synchronously (via signalfd) in main thread. */ 346 if (kvm_on_sigbus(siginfo->si_code, siginfo->si_addr)) { 347 sigbus_reraise(); 348 } 349 } 350 } 351 352 static void qemu_init_sigbus(void) 353 { 354 struct sigaction action; 355 356 /* 357 * ALERT: when modifying this, take care that SIGBUS forwarding in 358 * qemu_prealloc_mem() will continue working as expected. 359 */ 360 memset(&action, 0, sizeof(action)); 361 action.sa_flags = SA_SIGINFO; 362 action.sa_sigaction = sigbus_handler; 363 sigaction(SIGBUS, &action, NULL); 364 365 prctl(PR_MCE_KILL, PR_MCE_KILL_SET, PR_MCE_KILL_EARLY, 0, 0); 366 } 367 #else /* !CONFIG_LINUX */ 368 static void qemu_init_sigbus(void) 369 { 370 } 371 #endif /* !CONFIG_LINUX */ 372 373 static QemuThread io_thread; 374 375 /* cpu creation */ 376 static QemuCond qemu_cpu_cond; 377 /* system init */ 378 static QemuCond qemu_pause_cond; 379 380 void qemu_init_cpu_loop(void) 381 { 382 qemu_init_sigbus(); 383 qemu_cond_init(&qemu_cpu_cond); 384 qemu_cond_init(&qemu_pause_cond); 385 qemu_mutex_init(&qemu_global_mutex); 386 387 qemu_thread_get_self(&io_thread); 388 } 389 390 void run_on_cpu(CPUState *cpu, run_on_cpu_func func, run_on_cpu_data data) 391 { 392 do_run_on_cpu(cpu, func, data, &qemu_global_mutex); 393 } 394 395 static void qemu_cpu_stop(CPUState *cpu, bool exit) 396 { 397 g_assert(qemu_cpu_is_self(cpu)); 398 cpu->stop = false; 399 cpu->stopped = true; 400 if (exit) { 401 cpu_exit(cpu); 402 } 403 qemu_cond_broadcast(&qemu_pause_cond); 404 } 405 406 void qemu_wait_io_event_common(CPUState *cpu) 407 { 408 qatomic_set_mb(&cpu->thread_kicked, false); 409 if (cpu->stop) { 410 qemu_cpu_stop(cpu, false); 411 } 412 process_queued_cpu_work(cpu); 413 } 414 415 void qemu_wait_io_event(CPUState *cpu) 416 { 417 bool slept = false; 418 419 while (cpu_thread_is_idle(cpu)) { 420 if (!slept) { 421 slept = true; 422 qemu_plugin_vcpu_idle_cb(cpu); 423 } 424 qemu_cond_wait(cpu->halt_cond, &qemu_global_mutex); 425 } 426 if (slept) { 427 qemu_plugin_vcpu_resume_cb(cpu); 428 } 429 430 qemu_wait_io_event_common(cpu); 431 } 432 433 void cpus_kick_thread(CPUState *cpu) 434 { 435 if (cpu->thread_kicked) { 436 return; 437 } 438 cpu->thread_kicked = true; 439 440 #ifndef _WIN32 441 int err = pthread_kill(cpu->thread->thread, SIG_IPI); 442 if (err && err != ESRCH) { 443 fprintf(stderr, "qemu:%s: %s", __func__, strerror(err)); 444 exit(1); 445 } 446 #else 447 qemu_sem_post(&cpu->sem); 448 #endif 449 } 450 451 void qemu_cpu_kick(CPUState *cpu) 452 { 453 qemu_cond_broadcast(cpu->halt_cond); 454 if (cpus_accel->kick_vcpu_thread) { 455 cpus_accel->kick_vcpu_thread(cpu); 456 } else { /* default */ 457 cpus_kick_thread(cpu); 458 } 459 } 460 461 void qemu_cpu_kick_self(void) 462 { 463 assert(current_cpu); 464 cpus_kick_thread(current_cpu); 465 } 466 467 bool qemu_cpu_is_self(CPUState *cpu) 468 { 469 return qemu_thread_is_self(cpu->thread); 470 } 471 472 bool qemu_in_vcpu_thread(void) 473 { 474 return current_cpu && qemu_cpu_is_self(current_cpu); 475 } 476 477 QEMU_DEFINE_STATIC_CO_TLS(bool, iothread_locked) 478 479 bool qemu_mutex_iothread_locked(void) 480 { 481 return get_iothread_locked(); 482 } 483 484 bool qemu_in_main_thread(void) 485 { 486 return qemu_mutex_iothread_locked(); 487 } 488 489 /* 490 * The BQL is taken from so many places that it is worth profiling the 491 * callers directly, instead of funneling them all through a single function. 492 */ 493 void qemu_mutex_lock_iothread_impl(const char *file, int line) 494 { 495 QemuMutexLockFunc bql_lock = qatomic_read(&qemu_bql_mutex_lock_func); 496 497 g_assert(!qemu_mutex_iothread_locked()); 498 bql_lock(&qemu_global_mutex, file, line); 499 set_iothread_locked(true); 500 } 501 502 void qemu_mutex_unlock_iothread(void) 503 { 504 g_assert(qemu_mutex_iothread_locked()); 505 set_iothread_locked(false); 506 qemu_mutex_unlock(&qemu_global_mutex); 507 } 508 509 void qemu_cond_wait_iothread(QemuCond *cond) 510 { 511 qemu_cond_wait(cond, &qemu_global_mutex); 512 } 513 514 void qemu_cond_timedwait_iothread(QemuCond *cond, int ms) 515 { 516 qemu_cond_timedwait(cond, &qemu_global_mutex, ms); 517 } 518 519 /* signal CPU creation */ 520 void cpu_thread_signal_created(CPUState *cpu) 521 { 522 cpu->created = true; 523 qemu_cond_signal(&qemu_cpu_cond); 524 } 525 526 /* signal CPU destruction */ 527 void cpu_thread_signal_destroyed(CPUState *cpu) 528 { 529 cpu->created = false; 530 qemu_cond_signal(&qemu_cpu_cond); 531 } 532 533 534 static bool all_vcpus_paused(void) 535 { 536 CPUState *cpu; 537 538 CPU_FOREACH(cpu) { 539 if (!cpu->stopped) { 540 return false; 541 } 542 } 543 544 return true; 545 } 546 547 void pause_all_vcpus(void) 548 { 549 CPUState *cpu; 550 551 qemu_clock_enable(QEMU_CLOCK_VIRTUAL, false); 552 CPU_FOREACH(cpu) { 553 if (qemu_cpu_is_self(cpu)) { 554 qemu_cpu_stop(cpu, true); 555 } else { 556 cpu->stop = true; 557 qemu_cpu_kick(cpu); 558 } 559 } 560 561 /* We need to drop the replay_lock so any vCPU threads woken up 562 * can finish their replay tasks 563 */ 564 replay_mutex_unlock(); 565 566 while (!all_vcpus_paused()) { 567 qemu_cond_wait(&qemu_pause_cond, &qemu_global_mutex); 568 CPU_FOREACH(cpu) { 569 qemu_cpu_kick(cpu); 570 } 571 } 572 573 qemu_mutex_unlock_iothread(); 574 replay_mutex_lock(); 575 qemu_mutex_lock_iothread(); 576 } 577 578 void cpu_resume(CPUState *cpu) 579 { 580 cpu->stop = false; 581 cpu->stopped = false; 582 qemu_cpu_kick(cpu); 583 } 584 585 void resume_all_vcpus(void) 586 { 587 CPUState *cpu; 588 589 if (!runstate_is_running()) { 590 return; 591 } 592 593 qemu_clock_enable(QEMU_CLOCK_VIRTUAL, true); 594 CPU_FOREACH(cpu) { 595 cpu_resume(cpu); 596 } 597 } 598 599 void cpu_remove_sync(CPUState *cpu) 600 { 601 cpu->stop = true; 602 cpu->unplug = true; 603 qemu_cpu_kick(cpu); 604 qemu_mutex_unlock_iothread(); 605 qemu_thread_join(cpu->thread); 606 qemu_mutex_lock_iothread(); 607 } 608 609 void cpus_register_accel(const AccelOpsClass *ops) 610 { 611 assert(ops != NULL); 612 assert(ops->create_vcpu_thread != NULL); /* mandatory */ 613 cpus_accel = ops; 614 } 615 616 const AccelOpsClass *cpus_get_accel(void) 617 { 618 /* broken if we call this early */ 619 assert(cpus_accel); 620 return cpus_accel; 621 } 622 623 void qemu_init_vcpu(CPUState *cpu) 624 { 625 MachineState *ms = MACHINE(qdev_get_machine()); 626 627 cpu->nr_cores = ms->smp.cores; 628 cpu->nr_threads = ms->smp.threads; 629 cpu->stopped = true; 630 cpu->random_seed = qemu_guest_random_seed_thread_part1(); 631 632 if (!cpu->as) { 633 /* If the target cpu hasn't set up any address spaces itself, 634 * give it the default one. 635 */ 636 cpu->num_ases = 1; 637 cpu_address_space_init(cpu, 0, "cpu-memory", cpu->memory); 638 } 639 640 /* accelerators all implement the AccelOpsClass */ 641 g_assert(cpus_accel != NULL && cpus_accel->create_vcpu_thread != NULL); 642 cpus_accel->create_vcpu_thread(cpu); 643 644 while (!cpu->created) { 645 qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex); 646 } 647 } 648 649 void cpu_stop_current(void) 650 { 651 if (current_cpu) { 652 current_cpu->stop = true; 653 cpu_exit(current_cpu); 654 } 655 } 656 657 int vm_stop(RunState state) 658 { 659 if (qemu_in_vcpu_thread()) { 660 qemu_system_vmstop_request_prepare(); 661 qemu_system_vmstop_request(state); 662 /* 663 * FIXME: should not return to device code in case 664 * vm_stop() has been requested. 665 */ 666 cpu_stop_current(); 667 return 0; 668 } 669 670 return do_vm_stop(state, true); 671 } 672 673 /** 674 * Prepare for (re)starting the VM. 675 * Returns -1 if the vCPUs are not to be restarted (e.g. if they are already 676 * running or in case of an error condition), 0 otherwise. 677 */ 678 int vm_prepare_start(bool step_pending) 679 { 680 RunState requested; 681 682 qemu_vmstop_requested(&requested); 683 if (runstate_is_running() && requested == RUN_STATE__MAX) { 684 return -1; 685 } 686 687 /* Ensure that a STOP/RESUME pair of events is emitted if a 688 * vmstop request was pending. The BLOCK_IO_ERROR event, for 689 * example, according to documentation is always followed by 690 * the STOP event. 691 */ 692 if (runstate_is_running()) { 693 qapi_event_send_stop(); 694 qapi_event_send_resume(); 695 return -1; 696 } 697 698 /* 699 * WHPX accelerator needs to know whether we are going to step 700 * any CPUs, before starting the first one. 701 */ 702 if (cpus_accel->synchronize_pre_resume) { 703 cpus_accel->synchronize_pre_resume(step_pending); 704 } 705 706 /* We are sending this now, but the CPUs will be resumed shortly later */ 707 qapi_event_send_resume(); 708 709 cpu_enable_ticks(); 710 runstate_set(RUN_STATE_RUNNING); 711 vm_state_notify(1, RUN_STATE_RUNNING); 712 return 0; 713 } 714 715 void vm_start(void) 716 { 717 if (!vm_prepare_start(false)) { 718 resume_all_vcpus(); 719 } 720 } 721 722 /* does a state transition even if the VM is already stopped, 723 current state is forgotten forever */ 724 int vm_stop_force_state(RunState state) 725 { 726 if (runstate_is_running()) { 727 return vm_stop(state); 728 } else { 729 int ret; 730 runstate_set(state); 731 732 bdrv_drain_all(); 733 /* Make sure to return an error if the flush in a previous vm_stop() 734 * failed. */ 735 ret = bdrv_flush_all(); 736 trace_vm_stop_flush_all(ret); 737 return ret; 738 } 739 } 740 741 void qmp_memsave(int64_t addr, int64_t size, const char *filename, 742 bool has_cpu, int64_t cpu_index, Error **errp) 743 { 744 FILE *f; 745 uint32_t l; 746 CPUState *cpu; 747 uint8_t buf[1024]; 748 int64_t orig_addr = addr, orig_size = size; 749 750 if (!has_cpu) { 751 cpu_index = 0; 752 } 753 754 cpu = qemu_get_cpu(cpu_index); 755 if (cpu == NULL) { 756 error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "cpu-index", 757 "a CPU number"); 758 return; 759 } 760 761 f = fopen(filename, "wb"); 762 if (!f) { 763 error_setg_file_open(errp, errno, filename); 764 return; 765 } 766 767 while (size != 0) { 768 l = sizeof(buf); 769 if (l > size) 770 l = size; 771 if (cpu_memory_rw_debug(cpu, addr, buf, l, 0) != 0) { 772 error_setg(errp, "Invalid addr 0x%016" PRIx64 "/size %" PRId64 773 " specified", orig_addr, orig_size); 774 goto exit; 775 } 776 if (fwrite(buf, 1, l, f) != l) { 777 error_setg(errp, QERR_IO_ERROR); 778 goto exit; 779 } 780 addr += l; 781 size -= l; 782 } 783 784 exit: 785 fclose(f); 786 } 787 788 void qmp_pmemsave(int64_t addr, int64_t size, const char *filename, 789 Error **errp) 790 { 791 FILE *f; 792 uint32_t l; 793 uint8_t buf[1024]; 794 795 f = fopen(filename, "wb"); 796 if (!f) { 797 error_setg_file_open(errp, errno, filename); 798 return; 799 } 800 801 while (size != 0) { 802 l = sizeof(buf); 803 if (l > size) 804 l = size; 805 cpu_physical_memory_read(addr, buf, l); 806 if (fwrite(buf, 1, l, f) != l) { 807 error_setg(errp, QERR_IO_ERROR); 808 goto exit; 809 } 810 addr += l; 811 size -= l; 812 } 813 814 exit: 815 fclose(f); 816 } 817 818 void qmp_inject_nmi(Error **errp) 819 { 820 nmi_monitor_handle(monitor_get_cpu_index(monitor_cur()), errp); 821 } 822 823