qemu/softmmu/cpus.c
<<
>>
Prefs
   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
  68static QemuMutex qemu_global_mutex;
  69
  70/*
  71 * The chosen accelerator is supposed to register this.
  72 */
  73static const AccelOpsClass *cpus_accel;
  74
  75bool cpu_is_stopped(CPUState *cpu)
  76{
  77    return cpu->stopped || !runstate_is_running();
  78}
  79
  80bool cpu_work_list_empty(CPUState *cpu)
  81{
  82    return QSIMPLEQ_EMPTY_ATOMIC(&cpu->work_list);
  83}
  84
  85bool 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
 102bool 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/***********************************************************/
 115void 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
 132void cpu_synchronize_all_states(void)
 133{
 134    CPUState *cpu;
 135
 136    CPU_FOREACH(cpu) {
 137        cpu_synchronize_state(cpu);
 138    }
 139}
 140
 141void cpu_synchronize_all_post_reset(void)
 142{
 143    CPUState *cpu;
 144
 145    CPU_FOREACH(cpu) {
 146        cpu_synchronize_post_reset(cpu);
 147    }
 148}
 149
 150void cpu_synchronize_all_post_init(void)
 151{
 152    CPUState *cpu;
 153
 154    CPU_FOREACH(cpu) {
 155        cpu_synchronize_post_init(cpu);
 156    }
 157}
 158
 159void cpu_synchronize_all_pre_loadvm(void)
 160{
 161    CPUState *cpu;
 162
 163    CPU_FOREACH(cpu) {
 164        cpu_synchronize_pre_loadvm(cpu);
 165    }
 166}
 167
 168void cpu_synchronize_state(CPUState *cpu)
 169{
 170    if (cpus_accel->synchronize_state) {
 171        cpus_accel->synchronize_state(cpu);
 172    }
 173}
 174
 175void cpu_synchronize_post_reset(CPUState *cpu)
 176{
 177    if (cpus_accel->synchronize_post_reset) {
 178        cpus_accel->synchronize_post_reset(cpu);
 179    }
 180}
 181
 182void cpu_synchronize_post_init(CPUState *cpu)
 183{
 184    if (cpus_accel->synchronize_post_init) {
 185        cpus_accel->synchronize_post_init(cpu);
 186    }
 187}
 188
 189void cpu_synchronize_pre_loadvm(CPUState *cpu)
 190{
 191    if (cpus_accel->synchronize_pre_loadvm) {
 192        cpus_accel->synchronize_pre_loadvm(cpu);
 193    }
 194}
 195
 196bool 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
 204int64_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 */
 229int64_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
 237static 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
 246void 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
 255static 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 */
 279int vm_shutdown(void)
 280{
 281    return do_vm_stop(RUN_STATE_SHUTDOWN, false);
 282}
 283
 284bool 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
 295void 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
 316static 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
 333static 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
 352static 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 */
 368static void qemu_init_sigbus(void)
 369{
 370}
 371#endif /* !CONFIG_LINUX */
 372
 373static QemuThread io_thread;
 374
 375/* cpu creation */
 376static QemuCond qemu_cpu_cond;
 377/* system init */
 378static QemuCond qemu_pause_cond;
 379
 380void 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
 390void 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
 395static 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
 406void qemu_wait_io_event_common(CPUState *cpu)
 407{
 408    qatomic_mb_set(&cpu->thread_kicked, false);
 409    if (cpu->stop) {
 410        qemu_cpu_stop(cpu, false);
 411    }
 412    process_queued_cpu_work(cpu);
 413}
 414
 415void 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#ifdef _WIN32
 431    /* Eat dummy APC queued by cpus_kick_thread. */
 432    if (hax_enabled()) {
 433        SleepEx(0, TRUE);
 434    }
 435#endif
 436    qemu_wait_io_event_common(cpu);
 437}
 438
 439void cpus_kick_thread(CPUState *cpu)
 440{
 441    if (cpu->thread_kicked) {
 442        return;
 443    }
 444    cpu->thread_kicked = true;
 445
 446#ifndef _WIN32
 447    int err = pthread_kill(cpu->thread->thread, SIG_IPI);
 448    if (err && err != ESRCH) {
 449        fprintf(stderr, "qemu:%s: %s", __func__, strerror(err));
 450        exit(1);
 451    }
 452#else
 453    qemu_sem_post(&cpu->sem);
 454#endif
 455}
 456
 457void qemu_cpu_kick(CPUState *cpu)
 458{
 459    qemu_cond_broadcast(cpu->halt_cond);
 460    if (cpus_accel->kick_vcpu_thread) {
 461        cpus_accel->kick_vcpu_thread(cpu);
 462    } else { /* default */
 463        cpus_kick_thread(cpu);
 464    }
 465}
 466
 467void qemu_cpu_kick_self(void)
 468{
 469    assert(current_cpu);
 470    cpus_kick_thread(current_cpu);
 471}
 472
 473bool qemu_cpu_is_self(CPUState *cpu)
 474{
 475    return qemu_thread_is_self(cpu->thread);
 476}
 477
 478bool qemu_in_vcpu_thread(void)
 479{
 480    return current_cpu && qemu_cpu_is_self(current_cpu);
 481}
 482
 483QEMU_DEFINE_STATIC_CO_TLS(bool, iothread_locked)
 484
 485bool qemu_mutex_iothread_locked(void)
 486{
 487    return get_iothread_locked();
 488}
 489
 490bool qemu_in_main_thread(void)
 491{
 492    return qemu_mutex_iothread_locked();
 493}
 494
 495/*
 496 * The BQL is taken from so many places that it is worth profiling the
 497 * callers directly, instead of funneling them all through a single function.
 498 */
 499void qemu_mutex_lock_iothread_impl(const char *file, int line)
 500{
 501    QemuMutexLockFunc bql_lock = qatomic_read(&qemu_bql_mutex_lock_func);
 502
 503    g_assert(!qemu_mutex_iothread_locked());
 504    bql_lock(&qemu_global_mutex, file, line);
 505    set_iothread_locked(true);
 506}
 507
 508void qemu_mutex_unlock_iothread(void)
 509{
 510    g_assert(qemu_mutex_iothread_locked());
 511    set_iothread_locked(false);
 512    qemu_mutex_unlock(&qemu_global_mutex);
 513}
 514
 515void qemu_cond_wait_iothread(QemuCond *cond)
 516{
 517    qemu_cond_wait(cond, &qemu_global_mutex);
 518}
 519
 520void qemu_cond_timedwait_iothread(QemuCond *cond, int ms)
 521{
 522    qemu_cond_timedwait(cond, &qemu_global_mutex, ms);
 523}
 524
 525/* signal CPU creation */
 526void cpu_thread_signal_created(CPUState *cpu)
 527{
 528    cpu->created = true;
 529    qemu_cond_signal(&qemu_cpu_cond);
 530}
 531
 532/* signal CPU destruction */
 533void cpu_thread_signal_destroyed(CPUState *cpu)
 534{
 535    cpu->created = false;
 536    qemu_cond_signal(&qemu_cpu_cond);
 537}
 538
 539
 540static bool all_vcpus_paused(void)
 541{
 542    CPUState *cpu;
 543
 544    CPU_FOREACH(cpu) {
 545        if (!cpu->stopped) {
 546            return false;
 547        }
 548    }
 549
 550    return true;
 551}
 552
 553void pause_all_vcpus(void)
 554{
 555    CPUState *cpu;
 556
 557    qemu_clock_enable(QEMU_CLOCK_VIRTUAL, false);
 558    CPU_FOREACH(cpu) {
 559        if (qemu_cpu_is_self(cpu)) {
 560            qemu_cpu_stop(cpu, true);
 561        } else {
 562            cpu->stop = true;
 563            qemu_cpu_kick(cpu);
 564        }
 565    }
 566
 567    /* We need to drop the replay_lock so any vCPU threads woken up
 568     * can finish their replay tasks
 569     */
 570    replay_mutex_unlock();
 571
 572    while (!all_vcpus_paused()) {
 573        qemu_cond_wait(&qemu_pause_cond, &qemu_global_mutex);
 574        CPU_FOREACH(cpu) {
 575            qemu_cpu_kick(cpu);
 576        }
 577    }
 578
 579    qemu_mutex_unlock_iothread();
 580    replay_mutex_lock();
 581    qemu_mutex_lock_iothread();
 582}
 583
 584void cpu_resume(CPUState *cpu)
 585{
 586    cpu->stop = false;
 587    cpu->stopped = false;
 588    qemu_cpu_kick(cpu);
 589}
 590
 591void resume_all_vcpus(void)
 592{
 593    CPUState *cpu;
 594
 595    if (!runstate_is_running()) {
 596        return;
 597    }
 598
 599    qemu_clock_enable(QEMU_CLOCK_VIRTUAL, true);
 600    CPU_FOREACH(cpu) {
 601        cpu_resume(cpu);
 602    }
 603}
 604
 605void cpu_remove_sync(CPUState *cpu)
 606{
 607    cpu->stop = true;
 608    cpu->unplug = true;
 609    qemu_cpu_kick(cpu);
 610    qemu_mutex_unlock_iothread();
 611    qemu_thread_join(cpu->thread);
 612    qemu_mutex_lock_iothread();
 613}
 614
 615void cpus_register_accel(const AccelOpsClass *ops)
 616{
 617    assert(ops != NULL);
 618    assert(ops->create_vcpu_thread != NULL); /* mandatory */
 619    cpus_accel = ops;
 620}
 621
 622const AccelOpsClass *cpus_get_accel(void)
 623{
 624    /* broken if we call this early */
 625    assert(cpus_accel);
 626    return cpus_accel;
 627}
 628
 629void qemu_init_vcpu(CPUState *cpu)
 630{
 631    MachineState *ms = MACHINE(qdev_get_machine());
 632
 633    cpu->nr_cores = ms->smp.cores;
 634    cpu->nr_threads =  ms->smp.threads;
 635    cpu->stopped = true;
 636    cpu->random_seed = qemu_guest_random_seed_thread_part1();
 637
 638    if (!cpu->as) {
 639        /* If the target cpu hasn't set up any address spaces itself,
 640         * give it the default one.
 641         */
 642        cpu->num_ases = 1;
 643        cpu_address_space_init(cpu, 0, "cpu-memory", cpu->memory);
 644    }
 645
 646    /* accelerators all implement the AccelOpsClass */
 647    g_assert(cpus_accel != NULL && cpus_accel->create_vcpu_thread != NULL);
 648    cpus_accel->create_vcpu_thread(cpu);
 649
 650    while (!cpu->created) {
 651        qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex);
 652    }
 653}
 654
 655void cpu_stop_current(void)
 656{
 657    if (current_cpu) {
 658        current_cpu->stop = true;
 659        cpu_exit(current_cpu);
 660    }
 661}
 662
 663int vm_stop(RunState state)
 664{
 665    if (qemu_in_vcpu_thread()) {
 666        qemu_system_vmstop_request_prepare();
 667        qemu_system_vmstop_request(state);
 668        /*
 669         * FIXME: should not return to device code in case
 670         * vm_stop() has been requested.
 671         */
 672        cpu_stop_current();
 673        return 0;
 674    }
 675
 676    return do_vm_stop(state, true);
 677}
 678
 679/**
 680 * Prepare for (re)starting the VM.
 681 * Returns -1 if the vCPUs are not to be restarted (e.g. if they are already
 682 * running or in case of an error condition), 0 otherwise.
 683 */
 684int vm_prepare_start(bool step_pending)
 685{
 686    RunState requested;
 687
 688    qemu_vmstop_requested(&requested);
 689    if (runstate_is_running() && requested == RUN_STATE__MAX) {
 690        return -1;
 691    }
 692
 693    /* Ensure that a STOP/RESUME pair of events is emitted if a
 694     * vmstop request was pending.  The BLOCK_IO_ERROR event, for
 695     * example, according to documentation is always followed by
 696     * the STOP event.
 697     */
 698    if (runstate_is_running()) {
 699        qapi_event_send_stop();
 700        qapi_event_send_resume();
 701        return -1;
 702    }
 703
 704    /*
 705     * WHPX accelerator needs to know whether we are going to step
 706     * any CPUs, before starting the first one.
 707     */
 708    if (cpus_accel->synchronize_pre_resume) {
 709        cpus_accel->synchronize_pre_resume(step_pending);
 710    }
 711
 712    /* We are sending this now, but the CPUs will be resumed shortly later */
 713    qapi_event_send_resume();
 714
 715    cpu_enable_ticks();
 716    runstate_set(RUN_STATE_RUNNING);
 717    vm_state_notify(1, RUN_STATE_RUNNING);
 718    return 0;
 719}
 720
 721void vm_start(void)
 722{
 723    if (!vm_prepare_start(false)) {
 724        resume_all_vcpus();
 725    }
 726}
 727
 728/* does a state transition even if the VM is already stopped,
 729   current state is forgotten forever */
 730int vm_stop_force_state(RunState state)
 731{
 732    if (runstate_is_running()) {
 733        return vm_stop(state);
 734    } else {
 735        int ret;
 736        runstate_set(state);
 737
 738        bdrv_drain_all();
 739        /* Make sure to return an error if the flush in a previous vm_stop()
 740         * failed. */
 741        ret = bdrv_flush_all();
 742        trace_vm_stop_flush_all(ret);
 743        return ret;
 744    }
 745}
 746
 747void qmp_memsave(int64_t addr, int64_t size, const char *filename,
 748                 bool has_cpu, int64_t cpu_index, Error **errp)
 749{
 750    FILE *f;
 751    uint32_t l;
 752    CPUState *cpu;
 753    uint8_t buf[1024];
 754    int64_t orig_addr = addr, orig_size = size;
 755
 756    if (!has_cpu) {
 757        cpu_index = 0;
 758    }
 759
 760    cpu = qemu_get_cpu(cpu_index);
 761    if (cpu == NULL) {
 762        error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "cpu-index",
 763                   "a CPU number");
 764        return;
 765    }
 766
 767    f = fopen(filename, "wb");
 768    if (!f) {
 769        error_setg_file_open(errp, errno, filename);
 770        return;
 771    }
 772
 773    while (size != 0) {
 774        l = sizeof(buf);
 775        if (l > size)
 776            l = size;
 777        if (cpu_memory_rw_debug(cpu, addr, buf, l, 0) != 0) {
 778            error_setg(errp, "Invalid addr 0x%016" PRIx64 "/size %" PRId64
 779                             " specified", orig_addr, orig_size);
 780            goto exit;
 781        }
 782        if (fwrite(buf, 1, l, f) != l) {
 783            error_setg(errp, QERR_IO_ERROR);
 784            goto exit;
 785        }
 786        addr += l;
 787        size -= l;
 788    }
 789
 790exit:
 791    fclose(f);
 792}
 793
 794void qmp_pmemsave(int64_t addr, int64_t size, const char *filename,
 795                  Error **errp)
 796{
 797    FILE *f;
 798    uint32_t l;
 799    uint8_t buf[1024];
 800
 801    f = fopen(filename, "wb");
 802    if (!f) {
 803        error_setg_file_open(errp, errno, filename);
 804        return;
 805    }
 806
 807    while (size != 0) {
 808        l = sizeof(buf);
 809        if (l > size)
 810            l = size;
 811        cpu_physical_memory_read(addr, buf, l);
 812        if (fwrite(buf, 1, l, f) != l) {
 813            error_setg(errp, QERR_IO_ERROR);
 814            goto exit;
 815        }
 816        addr += l;
 817        size -= l;
 818    }
 819
 820exit:
 821    fclose(f);
 822}
 823
 824void qmp_inject_nmi(Error **errp)
 825{
 826    nmi_monitor_handle(monitor_get_cpu_index(monitor_cur()), errp);
 827}
 828
 829