Commit 8fdf0387 authored by Peter Maydell's avatar Peter Maydell
Browse files

Merge remote-tracking branch 'remotes/sstabellini/tags/xen-20160613-tag' into staging



Xen 2016/06/13

# gpg: Signature made Mon 13 Jun 2016 11:53:18 BST
# gpg:                using RSA key 0x894F8F4870E1AE90
# gpg: Good signature from "Stefano Stabellini <stefano.stabellini@eu.citrix.com>"
# Primary key fingerprint: D04E 33AB A51F 67BA 07D3  0AEA 894F 8F48 70E1 AE90

* remotes/sstabellini/tags/xen-20160613-tag:
  Introduce "xen-load-devices-state"
  exec: Fix qemu_ram_block_from_host for Xen

Signed-off-by: default avatarPeter Maydell <peter.maydell@linaro.org>
parents da2fdd0b 88c16567
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1935,7 +1935,7 @@ RAMBlock *qemu_ram_block_from_host(void *ptr, bool round_offset,
        ram_addr = xen_ram_addr_from_mapcache(ptr);
        block = qemu_get_ram_block(ram_addr);
        if (block) {
            *offset = (host - block->host);
            *offset = ram_addr - block->offset;
        }
        rcu_read_unlock();
        return block;
+37 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@
#include "hw/boards.h"
#include "hw/hw.h"
#include "hw/qdev.h"
#include "hw/xen/xen.h"
#include "net/net.h"
#include "monitor/monitor.h"
#include "sysemu/sysemu.h"
@@ -1754,6 +1755,12 @@ qemu_loadvm_section_start_full(QEMUFile *f, MigrationIncomingState *mis)
        return -EINVAL;
    }

    /* Validate if it is a device's state */
    if (xen_enabled() && se->is_ram) {
        error_report("loadvm: %s RAM loading not allowed on Xen", idstr);
        return -EINVAL;
    }

    /* Add entry */
    le = g_malloc0(sizeof(*le));

@@ -2064,6 +2071,36 @@ void qmp_xen_save_devices_state(const char *filename, Error **errp)
    }
}

void qmp_xen_load_devices_state(const char *filename, Error **errp)
{
    QEMUFile *f;
    QIOChannelFile *ioc;
    int ret;

    /* Guest must be paused before loading the device state; the RAM state
     * will already have been loaded by xc
     */
    if (runstate_is_running()) {
        error_setg(errp, "Cannot update device state while vm is running");
        return;
    }
    vm_stop(RUN_STATE_RESTORE_VM);

    ioc = qio_channel_file_new_path(filename, O_RDONLY | O_BINARY, 0, errp);
    if (!ioc) {
        return;
    }
    f = qemu_fopen_channel_input(QIO_CHANNEL(ioc));

    migration_incoming_state_new(f);
    ret = qemu_loadvm_state(f);
    qemu_fclose(f);
    if (ret < 0) {
        error_setg(errp, QERR_IO_ERROR);
    }
    migration_incoming_state_destroy();
}

int load_vmstate(const char *name)
{
    BlockDriverState *bs, *bs_vm_state;
+14 −0
Original line number Diff line number Diff line
@@ -4200,6 +4200,20 @@
{ 'enum': 'ReplayMode',
  'data': [ 'none', 'record', 'play' ] }

##
# @xen-load-devices-state:
#
# Load the state of all devices from file. The RAM and the block devices
# of the VM are not loaded by this command.
#
# @filename: the file to load the state of the devices from as binary
# data. See xen-save-devices-state.txt for a description of the binary
# format.
#
# Since: 2.7
##
{ 'command': 'xen-load-devices-state', 'data': {'filename': 'str'} }

##
# @GICCapability:
#
+27 −0
Original line number Diff line number Diff line
@@ -584,6 +584,33 @@ Example:
     "arguments": { "filename": "/tmp/save" } }
<- { "return": {} }

EQMP

    {
        .name       = "xen-load-devices-state",
        .args_type  = "filename:F",
        .mhandler.cmd_new = qmp_marshal_xen_load_devices_state,
    },

SQMP
xen-load-devices-state
----------------------

Load the state of all devices from file. The RAM and the block devices
of the VM are not loaded by this command.

Arguments:

- "filename": the file to load the state of the devices from as binary
data. See xen-save-devices-state.txt for a description of the binary
format.

Example:

-> { "execute": "xen-load-devices-state",
     "arguments": { "filename": "/tmp/resume" } }
<- { "return": {} }

EQMP

    {