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