From: Anthony PERARD <anthony.perard@xxxxxxxxxx>
This will save the acpi_new_ioport hvm_param in the checkpoint file and
set the parameter in Xen at restore.
Signed-off-by: Anthony PERARD <anthony.perard@xxxxxxxxxx>
---
tools/libxc/xc_domain_restore.c | 12 ++++++++++++
tools/libxc/xc_domain_save.c | 11 +++++++++++
tools/libxc/xg_save_restore.h | 1 +
3 files changed, 24 insertions(+), 0 deletions(-)
diff --git a/tools/libxc/xc_domain_restore.c b/tools/libxc/xc_domain_restore.c
index 316f32d..c03512f 100644
--- a/tools/libxc/xc_domain_restore.c
+++ b/tools/libxc/xc_domain_restore.c
@@ -647,6 +647,7 @@ typedef struct {
uint64_t identpt;
uint64_t vm86_tss;
uint64_t console_pfn;
+ int new_acpi_ioport;
} pagebuf_t;
static int pagebuf_init(pagebuf_t* buf)
@@ -771,6 +772,10 @@ static int pagebuf_get_one(xc_interface *xch, struct
restore_ctx *ctx,
// DPRINTF("last checkpoint indication received");
return pagebuf_get_one(xch, ctx, buf, fd, dom);
+ case XC_SAVE_ID_HVM_ACPI_NEW_IOPORT:
+ buf->new_acpi_ioport = 1;
+ return pagebuf_get_one(xch, ctx, buf, fd, dom);
+
default:
if ( (count > MAX_BATCH_SIZE) || (count < 0) ) {
ERROR("Max batch size exceeded (%d). Giving up.", count);
@@ -1317,6 +1322,13 @@ int xc_domain_restore(xc_interface *xch, int io_fd,
uint32_t dom,
fcntl(io_fd, F_SETFL, orig_io_fd_flags | O_NONBLOCK);
}
+ if (pagebuf.new_acpi_ioport) {
+ DBGPRINTF("Use new firmware ioport from the checkpoint\n");
+ xc_set_hvm_param(xch, dom, HVM_PARAM_ACPI_NEW_IOPORT, 1);
+ } else {
+ DBGPRINTF("Use old firmware ioport from the checkpoint\n");
+ }
+
if ( ctx->last_checkpoint )
{
// DPRINTF("Last checkpoint, finishing\n");
diff --git a/tools/libxc/xc_domain_save.c b/tools/libxc/xc_domain_save.c
index 47f8a79..83af771 100644
--- a/tools/libxc/xc_domain_save.c
+++ b/tools/libxc/xc_domain_save.c
@@ -1618,6 +1618,17 @@ int xc_domain_save(xc_interface *xch, int io_fd,
uint32_t dom, uint32_t max_iter
PERROR("Error when writing the console pfn for guest");
goto out;
}
+
+ chunk.id = XC_SAVE_ID_HVM_ACPI_NEW_IOPORT;
+ xc_get_hvm_param(xch, dom, HVM_PARAM_ACPI_NEW_IOPORT,
+ (unsigned long *)&chunk.data);
+
+ if ( (chunk.data != 0) &&
+ wrexact(io_fd, &chunk.id, sizeof(int)) )
+ {
+ PERROR("Error when writing the firmware ioport version");
+ goto out;
+ }
}
if ( !callbacks->checkpoint )
diff --git a/tools/libxc/xg_save_restore.h b/tools/libxc/xg_save_restore.h
index 2c82ce7..c86b6c4 100644
--- a/tools/libxc/xg_save_restore.h
+++ b/tools/libxc/xg_save_restore.h
@@ -132,6 +132,7 @@
#define XC_SAVE_ID_TSC_INFO -7
#define XC_SAVE_ID_HVM_CONSOLE_PFN -8 /* (HVM-only) */
#define XC_SAVE_ID_LAST_CHECKPOINT -9 /* Commit to restoring after
completion of current iteration. */
+#define XC_SAVE_ID_HVM_ACPI_NEW_IOPORT -10
/*
** We process save/restore/migrate in batches of pages; the below
--
1.7.1
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|