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 g_assert(bql_locked()); 269 270 if (cpus_accel->handle_interrupt) { 271 cpus_accel->handle_interrupt(cpu, mask); 272 } else { 273 generic_handle_interrupt(cpu, mask); 274 } 275 } 276 277 /* 278 * True if the vm was previously suspended, and has not been woken or reset. 279 */ 280 static int vm_was_suspended; 281 282 void vm_set_suspended(bool suspended) 283 { 284 vm_was_suspended = suspended; 285 } 286 287 bool vm_get_suspended(void) 288 { 289 return vm_was_suspended; 290 } 291 292 static int do_vm_stop(RunState state, bool send_stop) 293 { 294 int ret = 0; 295 RunState oldstate = runstate_get(); 296 297 if (runstate_is_live(oldstate)) { 298 vm_was_suspended = (oldstate == RUN_STATE_SUSPENDED); 299 runstate_set(state); 300 cpu_disable_ticks(); 301 if (oldstate == RUN_STATE_RUNNING) { 302 pause_all_vcpus(); 303 } 304 ret = vm_state_notify(0, state); 305 if (send_stop) { 306 qapi_event_send_stop(); 307 } 308 } 309 310 bdrv_drain_all(); 311 /* 312 * Even if vm_state_notify() return failure, 313 * it would be better to flush as before. 314 */ 315 ret |= bdrv_flush_all(); 316 trace_vm_stop_flush_all(ret); 317 318 return ret; 319 } 320 321 /* Special vm_stop() variant for terminating the process. Historically clients 322 * did not expect a QMP STOP event and so we need to retain compatibility. 323 */ 324 int vm_shutdown(void) 325 { 326 return do_vm_stop(RUN_STATE_SHUTDOWN, false); 327 } 328 329 bool cpu_can_run(CPUState *cpu) 330 { 331 if (cpu->stop) { 332 return false; 333 } 334 if (cpu_is_stopped(cpu)) { 335 return false; 336 } 337 return true; 338 } 339 340 void cpu_handle_guest_debug(CPUState *cpu) 341 { 342 if (replay_running_debug()) { 343 if (!cpu->singlestep_enabled) { 344 /* 345 * Report about the breakpoint and 346 * make a single step to skip it 347 */ 348 replay_breakpoint(); 349 cpu_single_step(cpu, SSTEP_ENABLE); 350 } else { 351 cpu_single_step(cpu, 0); 352 } 353 } else { 354 gdb_set_stop_cpu(cpu); 355 qemu_system_debug_request(); 356 cpu->stopped = true; 357 } 358 } 359 360 #ifdef CONFIG_LINUX 361 static void sigbus_reraise(void) 362 { 363 sigset_t set; 364 struct sigaction action; 365 366 memset(&action, 0, sizeof(action)); 367 action.sa_handler = SIG_DFL; 368 if (!sigaction(SIGBUS, &action, NULL)) { 369 raise(SIGBUS); 370 sigemptyset(&set); 371 sigaddset(&set, SIGBUS); 372 pthread_sigmask(SIG_UNBLOCK, &set, NULL); 373 } 374 perror("Failed to re-raise SIGBUS!"); 375 abort(); 376 } 377 378 static void sigbus_handler(int n, siginfo_t *siginfo, void *ctx) 379 { 380 if (siginfo->si_code != BUS_MCEERR_AO && siginfo->si_code != BUS_MCEERR_AR) { 381 sigbus_reraise(); 382 } 383 384 if (current_cpu) { 385 /* Called asynchronously in VCPU thread. */ 386 if (kvm_on_sigbus_vcpu(current_cpu, siginfo->si_code, siginfo->si_addr)) { 387 sigbus_reraise(); 388 } 389 } else { 390 /* Called synchronously (via signalfd) in main thread. */ 391 if (kvm_on_sigbus(siginfo->si_code, siginfo->si_addr)) { 392 sigbus_reraise(); 393 } 394 } 395 } 396 397 static void qemu_init_sigbus(void) 398 { 399 struct sigaction action; 400 401 /* 402 * ALERT: when modifying this, take care that SIGBUS forwarding in 403 * qemu_prealloc_mem() will continue working as expected. 404 */ 405 memset(&action, 0, sizeof(action)); 406 action.sa_flags = SA_SIGINFO; 407 action.sa_sigaction = sigbus_handler; 408 sigaction(SIGBUS, &action, NULL); 409 410 prctl(PR_MCE_KILL, PR_MCE_KILL_SET, PR_MCE_KILL_EARLY, 0, 0); 411 } 412 #else /* !CONFIG_LINUX */ 413 static void qemu_init_sigbus(void) 414 { 415 } 416 #endif /* !CONFIG_LINUX */ 417 418 static QemuThread io_thread; 419 420 /* cpu creation */ 421 static QemuCond qemu_cpu_cond; 422 /* system init */ 423 static QemuCond qemu_pause_cond; 424 425 void qemu_init_cpu_loop(void) 426 { 427 qemu_init_sigbus(); 428 qemu_cond_init(&qemu_cpu_cond); 429 qemu_cond_init(&qemu_pause_cond); 430 qemu_mutex_init(&bql); 431 432 qemu_thread_get_self(&io_thread); 433 } 434 435 void run_on_cpu(CPUState *cpu, run_on_cpu_func func, run_on_cpu_data data) 436 { 437 do_run_on_cpu(cpu, func, data, &bql); 438 } 439 440 static void qemu_cpu_stop(CPUState *cpu, bool exit) 441 { 442 g_assert(qemu_cpu_is_self(cpu)); 443 cpu->stop = false; 444 cpu->stopped = true; 445 if (exit) { 446 cpu_exit(cpu); 447 } 448 qemu_cond_broadcast(&qemu_pause_cond); 449 } 450 451 void qemu_wait_io_event_common(CPUState *cpu) 452 { 453 qatomic_set_mb(&cpu->thread_kicked, false); 454 if (cpu->stop) { 455 qemu_cpu_stop(cpu, false); 456 } 457 process_queued_cpu_work(cpu); 458 } 459 460 void qemu_wait_io_event(CPUState *cpu) 461 { 462 bool slept = false; 463 464 while (cpu_thread_is_idle(cpu)) { 465 if (!slept) { 466 slept = true; 467 qemu_plugin_vcpu_idle_cb(cpu); 468 } 469 qemu_cond_wait(cpu->halt_cond, &bql); 470 } 471 if (slept) { 472 qemu_plugin_vcpu_resume_cb(cpu); 473 } 474 475 qemu_wait_io_event_common(cpu); 476 } 477 478 void cpus_kick_thread(CPUState *cpu) 479 { 480 if (cpu->thread_kicked) { 481 return; 482 } 483 cpu->thread_kicked = true; 484 485 #ifndef _WIN32 486 int err = pthread_kill(cpu->thread->thread, SIG_IPI); 487 if (err && err != ESRCH) { 488 fprintf(stderr, "qemu:%s: %s", __func__, strerror(err)); 489 exit(1); 490 } 491 #else 492 qemu_sem_post(&cpu->sem); 493 #endif 494 } 495 496 void qemu_cpu_kick(CPUState *cpu) 497 { 498 qemu_cond_broadcast(cpu->halt_cond); 499 if (cpus_accel->kick_vcpu_thread) { 500 cpus_accel->kick_vcpu_thread(cpu); 501 } else { /* default */ 502 cpus_kick_thread(cpu); 503 } 504 } 505 506 void qemu_cpu_kick_self(void) 507 { 508 assert(current_cpu); 509 cpus_kick_thread(current_cpu); 510 } 511 512 bool qemu_cpu_is_self(CPUState *cpu) 513 { 514 return qemu_thread_is_self(cpu->thread); 515 } 516 517 bool qemu_in_vcpu_thread(void) 518 { 519 return current_cpu && qemu_cpu_is_self(current_cpu); 520 } 521 522 QEMU_DEFINE_STATIC_CO_TLS(bool, bql_locked) 523 524 static uint32_t bql_unlock_blocked; 525 526 void bql_block_unlock(bool increase) 527 { 528 uint32_t new_value; 529 530 assert(bql_locked()); 531 532 /* check for overflow! */ 533 new_value = bql_unlock_blocked + increase - !increase; 534 assert((new_value > bql_unlock_blocked) == increase); 535 bql_unlock_blocked = new_value; 536 } 537 538 bool bql_locked(void) 539 { 540 return get_bql_locked(); 541 } 542 543 bool qemu_in_main_thread(void) 544 { 545 return bql_locked(); 546 } 547 548 void rust_bql_mock_lock(void) 549 { 550 error_report("This function should be used only from tests"); 551 abort(); 552 } 553 554 /* 555 * The BQL is taken from so many places that it is worth profiling the 556 * callers directly, instead of funneling them all through a single function. 557 */ 558 void bql_lock_impl(const char *file, int line) 559 { 560 QemuMutexLockFunc bql_lock_fn = qatomic_read(&bql_mutex_lock_func); 561 562 g_assert(!bql_locked()); 563 bql_lock_fn(&bql, file, line); 564 set_bql_locked(true); 565 } 566 567 void bql_unlock(void) 568 { 569 g_assert(bql_locked()); 570 g_assert(!bql_unlock_blocked); 571 set_bql_locked(false); 572 qemu_mutex_unlock(&bql); 573 } 574 575 void qemu_cond_wait_bql(QemuCond *cond) 576 { 577 qemu_cond_wait(cond, &bql); 578 } 579 580 void qemu_cond_timedwait_bql(QemuCond *cond, int ms) 581 { 582 qemu_cond_timedwait(cond, &bql, ms); 583 } 584 585 /* signal CPU creation */ 586 void cpu_thread_signal_created(CPUState *cpu) 587 { 588 cpu->created = true; 589 qemu_cond_signal(&qemu_cpu_cond); 590 } 591 592 /* signal CPU destruction */ 593 void cpu_thread_signal_destroyed(CPUState *cpu) 594 { 595 cpu->created = false; 596 qemu_cond_signal(&qemu_cpu_cond); 597 } 598 599 void cpu_pause(CPUState *cpu) 600 { 601 if (qemu_cpu_is_self(cpu)) { 602 qemu_cpu_stop(cpu, true); 603 } else { 604 cpu->stop = true; 605 qemu_cpu_kick(cpu); 606 } 607 } 608 609 void cpu_resume(CPUState *cpu) 610 { 611 cpu->stop = false; 612 cpu->stopped = false; 613 qemu_cpu_kick(cpu); 614 } 615 616 static bool all_vcpus_paused(void) 617 { 618 CPUState *cpu; 619 620 CPU_FOREACH(cpu) { 621 if (!cpu->stopped) { 622 return false; 623 } 624 } 625 626 return true; 627 } 628 629 void pause_all_vcpus(void) 630 { 631 CPUState *cpu; 632 633 qemu_clock_enable(QEMU_CLOCK_VIRTUAL, false); 634 CPU_FOREACH(cpu) { 635 cpu_pause(cpu); 636 } 637 638 /* We need to drop the replay_lock so any vCPU threads woken up 639 * can finish their replay tasks 640 */ 641 replay_mutex_unlock(); 642 643 while (!all_vcpus_paused()) { 644 qemu_cond_wait(&qemu_pause_cond, &bql); 645 CPU_FOREACH(cpu) { 646 qemu_cpu_kick(cpu); 647 } 648 } 649 650 bql_unlock(); 651 replay_mutex_lock(); 652 bql_lock(); 653 } 654 655 void resume_all_vcpus(void) 656 { 657 CPUState *cpu; 658 659 if (!runstate_is_running()) { 660 return; 661 } 662 663 qemu_clock_enable(QEMU_CLOCK_VIRTUAL, true); 664 CPU_FOREACH(cpu) { 665 cpu_resume(cpu); 666 } 667 } 668 669 void cpu_remove_sync(CPUState *cpu) 670 { 671 cpu->stop = true; 672 cpu->unplug = true; 673 qemu_cpu_kick(cpu); 674 bql_unlock(); 675 qemu_thread_join(cpu->thread); 676 bql_lock(); 677 } 678 679 void cpus_register_accel(const AccelOpsClass *ops) 680 { 681 assert(ops != NULL); 682 assert(ops->create_vcpu_thread != NULL); /* mandatory */ 683 cpus_accel = ops; 684 } 685 686 const AccelOpsClass *cpus_get_accel(void) 687 { 688 /* broken if we call this early */ 689 assert(cpus_accel); 690 return cpus_accel; 691 } 692 693 void qemu_init_vcpu(CPUState *cpu) 694 { 695 MachineState *ms = MACHINE(qdev_get_machine()); 696 697 cpu->nr_threads = ms->smp.threads; 698 cpu->stopped = true; 699 cpu->random_seed = qemu_guest_random_seed_thread_part1(); 700 701 if (!cpu->as) { 702 /* If the target cpu hasn't set up any address spaces itself, 703 * give it the default one. 704 */ 705 cpu->num_ases = 1; 706 cpu_address_space_init(cpu, 0, "cpu-memory", cpu->memory); 707 } 708 709 /* accelerators all implement the AccelOpsClass */ 710 g_assert(cpus_accel != NULL && cpus_accel->create_vcpu_thread != NULL); 711 cpus_accel->create_vcpu_thread(cpu); 712 713 while (!cpu->created) { 714 qemu_cond_wait(&qemu_cpu_cond, &bql); 715 } 716 } 717 718 void cpu_stop_current(void) 719 { 720 if (current_cpu) { 721 current_cpu->stop = true; 722 cpu_exit(current_cpu); 723 } 724 } 725 726 int vm_stop(RunState state) 727 { 728 if (qemu_in_vcpu_thread()) { 729 qemu_system_vmstop_request_prepare(); 730 qemu_system_vmstop_request(state); 731 /* 732 * FIXME: should not return to device code in case 733 * vm_stop() has been requested. 734 */ 735 cpu_stop_current(); 736 return 0; 737 } 738 739 return do_vm_stop(state, true); 740 } 741 742 /** 743 * Prepare for (re)starting the VM. 744 * Returns 0 if the vCPUs should be restarted, -1 on an error condition, 745 * and 1 otherwise. 746 */ 747 int vm_prepare_start(bool step_pending) 748 { 749 int ret = vm_was_suspended ? 1 : 0; 750 RunState state = vm_was_suspended ? RUN_STATE_SUSPENDED : RUN_STATE_RUNNING; 751 RunState requested; 752 753 qemu_vmstop_requested(&requested); 754 if (runstate_is_running() && requested == RUN_STATE__MAX) { 755 return -1; 756 } 757 758 /* Ensure that a STOP/RESUME pair of events is emitted if a 759 * vmstop request was pending. The BLOCK_IO_ERROR event, for 760 * example, according to documentation is always followed by 761 * the STOP event. 762 */ 763 if (runstate_is_running()) { 764 qapi_event_send_stop(); 765 qapi_event_send_resume(); 766 return -1; 767 } 768 769 /* 770 * WHPX accelerator needs to know whether we are going to step 771 * any CPUs, before starting the first one. 772 */ 773 if (cpus_accel->synchronize_pre_resume) { 774 cpus_accel->synchronize_pre_resume(step_pending); 775 } 776 777 /* We are sending this now, but the CPUs will be resumed shortly later */ 778 qapi_event_send_resume(); 779 780 cpu_enable_ticks(); 781 runstate_set(state); 782 vm_state_notify(1, state); 783 vm_was_suspended = false; 784 return ret; 785 } 786 787 void vm_start(void) 788 { 789 if (!vm_prepare_start(false)) { 790 resume_all_vcpus(); 791 } 792 } 793 794 void vm_resume(RunState state) 795 { 796 if (runstate_is_live(state)) { 797 vm_start(); 798 } else { 799 runstate_set(state); 800 } 801 } 802 803 /* does a state transition even if the VM is already stopped, 804 current state is forgotten forever */ 805 int vm_stop_force_state(RunState state) 806 { 807 if (runstate_is_live(runstate_get())) { 808 return vm_stop(state); 809 } else { 810 int ret; 811 runstate_set(state); 812 813 bdrv_drain_all(); 814 /* Make sure to return an error if the flush in a previous vm_stop() 815 * failed. */ 816 ret = bdrv_flush_all(); 817 trace_vm_stop_flush_all(ret); 818 return ret; 819 } 820 } 821 822 void qmp_memsave(uint64_t addr, uint64_t size, const char *filename, 823 bool has_cpu, int64_t cpu_index, Error **errp) 824 { 825 FILE *f; 826 uint64_t l; 827 CPUState *cpu; 828 uint8_t buf[1024]; 829 uint64_t orig_addr = addr, orig_size = size; 830 831 if (!has_cpu) { 832 cpu_index = 0; 833 } 834 835 cpu = qemu_get_cpu(cpu_index); 836 if (cpu == NULL) { 837 error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "cpu-index", 838 "a CPU number"); 839 return; 840 } 841 842 f = fopen(filename, "wb"); 843 if (!f) { 844 error_setg_file_open(errp, errno, filename); 845 return; 846 } 847 848 while (size != 0) { 849 l = sizeof(buf); 850 if (l > size) 851 l = size; 852 if (cpu_memory_rw_debug(cpu, addr, buf, l, 0) != 0) { 853 error_setg(errp, "Invalid addr 0x%016" PRIx64 "/size %" PRIu64 854 " specified", orig_addr, orig_size); 855 goto exit; 856 } 857 if (fwrite(buf, 1, l, f) != l) { 858 error_setg(errp, "writing memory to '%s' failed", 859 filename); 860 goto exit; 861 } 862 addr += l; 863 size -= l; 864 } 865 866 exit: 867 fclose(f); 868 } 869 870 void qmp_pmemsave(uint64_t addr, uint64_t size, const char *filename, 871 Error **errp) 872 { 873 FILE *f; 874 uint64_t l; 875 uint8_t buf[1024]; 876 877 f = fopen(filename, "wb"); 878 if (!f) { 879 error_setg_file_open(errp, errno, filename); 880 return; 881 } 882 883 while (size != 0) { 884 l = sizeof(buf); 885 if (l > size) 886 l = size; 887 cpu_physical_memory_read(addr, buf, l); 888 if (fwrite(buf, 1, l, f) != l) { 889 error_setg(errp, "writing memory to '%s' failed", 890 filename); 891 goto exit; 892 } 893 addr += l; 894 size -= l; 895 } 896 897 exit: 898 fclose(f); 899 } 900 901 void qmp_inject_nmi(Error **errp) 902 { 903 nmi_monitor_handle(monitor_get_cpu_index(monitor_cur()), errp); 904 } 905 906