|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 4 of 5] Add code to track the address of the VM generation id buffer across a
# HG changeset patch
# User Paul Durrant <paul.durrant@xxxxxxxxxx>
# Date 1322482489 0
# Node ID c4613164ee1c5f3bf2085008359ebb5b7924c660
# Parent 3886d406c13aa66b2af123d52a1bef8b6f41d144
Add code to track the address of the VM generation id buffer across a
save/restore or migrate and inject a new value.
Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
diff -r 3886d406c13a -r c4613164ee1c tools/firmware/hvmloader/acpi/build.c
--- a/tools/firmware/hvmloader/acpi/build.c Mon Nov 28 12:14:48 2011 +0000
+++ b/tools/firmware/hvmloader/acpi/build.c Mon Nov 28 12:14:49 2011 +0000
@@ -23,6 +23,7 @@
#include "ssdt_pm.h"
#include "../config.h"
#include "../util.h"
+#include <xen/hvm/params.h>
#define align16(sz) (((sz) + 15) & ~15)
#define fixed_strcpy(d, s) strncpy((d), (s), sizeof(d))
@@ -308,6 +309,7 @@ unsigned long new_vm_gid(void)
gid = strtoll(xenstore_read("platform/generation-id", "0"), NULL, 0);
*(uint64_t *)buf = gid;
+ set_param(HVM_PARAM_VM_GENERATION_ID_ADDR, virt_to_phys(buf));
return virt_to_phys(buf);
}
diff -r 3886d406c13a -r c4613164ee1c tools/firmware/hvmloader/util.c
--- a/tools/firmware/hvmloader/util.c Mon Nov 28 12:14:48 2011 +0000
+++ b/tools/firmware/hvmloader/util.c Mon Nov 28 12:14:49 2011 +0000
@@ -26,6 +26,7 @@
#include <xen/xen.h>
#include <xen/memory.h>
#include <xen/sched.h>
+#include <xen/hvm/hvm_op.h>
void wrmsr(uint32_t idx, uint64_t v)
{
@@ -792,6 +793,17 @@ int hpet_exists(unsigned long hpet_base)
return ((hpet_id >> 16) == 0x8086);
}
+void set_param(int param, uint64_t value)
+{
+ struct xen_hvm_param p;
+
+ p.domid = DOMID_SELF;
+ p.index = param;
+ p.value = value;
+ if ( hypercall_hvm_op(HVMOP_set_param, &p) != 0 )
+ BUG();
+}
+
/*
* Local variables:
* mode: C
diff -r 3886d406c13a -r c4613164ee1c tools/firmware/hvmloader/util.h
--- a/tools/firmware/hvmloader/util.h Mon Nov 28 12:14:48 2011 +0000
+++ b/tools/firmware/hvmloader/util.h Mon Nov 28 12:14:49 2011 +0000
@@ -228,6 +228,8 @@ void perform_tests(void);
extern char _start[], _end[];
+void set_param(int param, uint64_t value);
+
#endif /* __HVMLOADER_UTIL_H__ */
/*
diff -r 3886d406c13a -r c4613164ee1c tools/libxc/ia64/xc_ia64_linux_restore.c
--- a/tools/libxc/ia64/xc_ia64_linux_restore.c Mon Nov 28 12:14:48 2011 +0000
+++ b/tools/libxc/ia64/xc_ia64_linux_restore.c Mon Nov 28 12:14:49 2011 +0000
@@ -548,7 +548,8 @@ int
xc_domain_restore(xc_interface *xch, int io_fd, uint32_t dom,
unsigned int store_evtchn, unsigned long *store_mfn,
unsigned int console_evtchn, unsigned long *console_mfn,
- unsigned int hvm, unsigned int pae, int superpages)
+ unsigned int hvm, unsigned int pae, int superpages,
+ uint64_t gid)
{
DECLARE_DOMCTL;
int rc = 1;
diff -r 3886d406c13a -r c4613164ee1c tools/libxc/xc_domain_restore.c
--- a/tools/libxc/xc_domain_restore.c Mon Nov 28 12:14:48 2011 +0000
+++ b/tools/libxc/xc_domain_restore.c Mon Nov 28 12:14:49 2011 +0000
@@ -676,6 +676,7 @@ typedef struct {
uint64_t console_pfn;
uint64_t acpi_ioport_location;
uint64_t viridian;
+ uint64_t vm_gid_addr;
} pagebuf_t;
static int pagebuf_init(pagebuf_t* buf)
@@ -820,6 +821,17 @@ static int pagebuf_get_one(xc_interface
}
return pagebuf_get_one(xch, ctx, buf, fd, dom);
+ case XC_SAVE_ID_HVM_GENERATION_ID_ADDR:
+ /* Skip padding 4 bytes then read the generation id buffer location. */
+ if ( RDEXACT(fd, &buf->vm_gid_addr, sizeof(uint32_t)) ||
+ RDEXACT(fd, &buf->vm_gid_addr, sizeof(uint64_t)) )
+ {
+ PERROR("error read the generation id buffer location");
+ return -1;
+ }
+ DPRINTF("read generation id buffer address");
+ 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);
@@ -1186,7 +1198,8 @@ static int apply_batch(xc_interface *xch
int xc_domain_restore(xc_interface *xch, int io_fd, uint32_t dom,
unsigned int store_evtchn, unsigned long *store_mfn,
unsigned int console_evtchn, unsigned long *console_mfn,
- unsigned int hvm, unsigned int pae, int superpages)
+ unsigned int hvm, unsigned int pae, int superpages,
+ uint64_t gid)
{
DECLARE_DOMCTL;
int rc = 1, frc, i, j, n, m, pae_extended_cr3 = 0, ext_vcpucontext = 0;
@@ -1386,6 +1399,34 @@ int xc_domain_restore(xc_interface *xch,
xc_set_hvm_param(xch, dom, HVM_PARAM_VM86_TSS,
pagebuf.vm86_tss);
if ( pagebuf.console_pfn )
console_pfn = pagebuf.console_pfn;
+ if ( pagebuf.vm_gid_addr ) {
+ unsigned int offset;
+ unsigned char *buf;
+
+ /*
+ * Map the VM generation id buffer and inject the new value.
+ */
+
+ pfn = pagebuf.vm_gid_addr >> PAGE_SHIFT;
+ offset = pagebuf.vm_gid_addr & (PAGE_SIZE - 1);
+
+ if ( (pfn >= dinfo->p2m_size) ||
+ (pfn_type[pfn] != XEN_DOMCTL_PFINFO_NOTAB) )
+ {
+ ERROR("generation id buffer frame is bad");
+ goto out;
+ }
+
+ mfn = ctx->p2m[pfn];
+ buf = xc_map_foreign_range(xch, dom, PAGE_SIZE,
+ PROT_READ | PROT_WRITE, mfn);
+ *(unsigned long long *)(buf + offset) = gid;
+ munmap(buf, PAGE_SIZE);
+
+ xc_set_hvm_param(xch, dom, HVM_PARAM_VM_GENERATION_ID_ADDR,
+ pagebuf.vm_gid_addr);
+ }
+
break; /* our work here is done */
}
diff -r 3886d406c13a -r c4613164ee1c tools/libxc/xc_domain_save.c
--- a/tools/libxc/xc_domain_save.c Mon Nov 28 12:14:48 2011 +0000
+++ b/tools/libxc/xc_domain_save.c Mon Nov 28 12:14:49 2011 +0000
@@ -1518,6 +1518,17 @@ int xc_domain_save(xc_interface *xch, in
PERROR("Error when writing the viridian flag");
goto out;
}
+
+ chunk.id = XC_SAVE_ID_HVM_GENERATION_ID_ADDR;
+ chunk.data = 0;
+ xc_get_hvm_param(xch, dom, HVM_PARAM_VM_GENERATION_ID_ADDR,
+ (unsigned long *)&chunk.data);
+
+ if ((chunk.data != 0) && wrexact(io_fd, &chunk, sizeof(chunk)))
+ {
+ PERROR("Error when writing the generation id buffer location for
guest");
+ goto out;
+ }
}
if ( !callbacks->checkpoint )
diff -r 3886d406c13a -r c4613164ee1c tools/libxc/xenguest.h
--- a/tools/libxc/xenguest.h Mon Nov 28 12:14:48 2011 +0000
+++ b/tools/libxc/xenguest.h Mon Nov 28 12:14:49 2011 +0000
@@ -71,12 +71,14 @@ int xc_domain_save(xc_interface *xch, in
* @parm hvm non-zero if this is a HVM restore
* @parm pae non-zero if this HVM domain has PAE support enabled
* @parm superpages non-zero to allocate guest memory with superpages
+ * @parm gid the new generation id of the VM
* @return 0 on success, -1 on failure
*/
int xc_domain_restore(xc_interface *xch, int io_fd, uint32_t dom,
unsigned int store_evtchn, unsigned long *store_mfn,
unsigned int console_evtchn, unsigned long *console_mfn,
- unsigned int hvm, unsigned int pae, int superpages);
+ unsigned int hvm, unsigned int pae, int superpages,
+ uint64_t gid);
/**
* xc_domain_restore writes a file to disk that contains the device
* model saved state.
diff -r 3886d406c13a -r c4613164ee1c tools/libxc/xg_save_restore.h
--- a/tools/libxc/xg_save_restore.h Mon Nov 28 12:14:48 2011 +0000
+++ b/tools/libxc/xg_save_restore.h Mon Nov 28 12:14:49 2011 +0000
@@ -135,6 +135,7 @@
#define XC_SAVE_ID_LAST_CHECKPOINT -9 /* Commit to restoring after
completion of current iteration. */
#define XC_SAVE_ID_HVM_ACPI_IOPORTS_LOCATION -10
#define XC_SAVE_ID_HVM_VIRIDIAN -11
+#define XC_SAVE_ID_HVM_GENERATION_ID_ADDR -12
/*
** We process save/restore/migrate in batches of pages; the below
diff -r 3886d406c13a -r c4613164ee1c tools/libxl/libxl_dom.c
--- a/tools/libxl/libxl_dom.c Mon Nov 28 12:14:48 2011 +0000
+++ b/tools/libxl/libxl_dom.c Mon Nov 28 12:14:49 2011 +0000
@@ -340,16 +340,19 @@ int libxl__domain_restore_common(libxl__
/* read signature */
int rc;
int hvm, pae, superpages;
+ uint64_t gid;
switch (info->type) {
case LIBXL_DOMAIN_TYPE_HVM:
hvm = 1;
superpages = 1;
pae = info->u.hvm.pae;
+ gid = info->u.hvm.generation_id;
break;
case LIBXL_DOMAIN_TYPE_PV:
hvm = 0;
superpages = 0;
pae = 1;
+ gid = 0;
break;
default:
return ERROR_INVAL;
@@ -357,7 +360,7 @@ int libxl__domain_restore_common(libxl__
rc = xc_domain_restore(ctx->xch, fd, domid,
state->store_port, &state->store_mfn,
state->console_port, &state->console_mfn,
- hvm, pae, superpages);
+ hvm, pae, superpages, gid);
if ( rc ) {
LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "restoring domain");
return ERROR_FAIL;
diff -r 3886d406c13a -r c4613164ee1c tools/xcutils/xc_restore.c
--- a/tools/xcutils/xc_restore.c Mon Nov 28 12:14:48 2011 +0000
+++ b/tools/xcutils/xc_restore.c Mon Nov 28 12:14:49 2011 +0000
@@ -24,6 +24,7 @@ main(int argc, char **argv)
int io_fd, ret;
int superpages;
unsigned long store_mfn, console_mfn;
+ uint64_t gid;
if ( (argc != 8) && (argc != 9) )
errx(1, "usage: %s iofd domid store_evtchn "
@@ -40,13 +41,18 @@ main(int argc, char **argv)
hvm = atoi(argv[5]);
pae = atoi(argv[6]);
apic = atoi(argv[7]);
- if ( argc == 9 )
+ if ( argc >= 9 )
superpages = atoi(argv[8]);
else
superpages = !!hvm;
+ if ( argc >= 10 )
+ gid = strtoll(argv[9], NULL, 0);
+ else
+ gid = 0;
ret = xc_domain_restore(xch, io_fd, domid, store_evtchn, &store_mfn,
- console_evtchn, &console_mfn, hvm, pae,
superpages);
+ console_evtchn, &console_mfn, hvm, pae, superpages,
+ gid);
if ( ret == 0 )
{
diff -r 3886d406c13a -r c4613164ee1c xen/include/public/hvm/params.h
--- a/xen/include/public/hvm/params.h Mon Nov 28 12:14:48 2011 +0000
+++ b/xen/include/public/hvm/params.h Mon Nov 28 12:14:49 2011 +0000
@@ -142,6 +142,9 @@
/* Boolean: Enable nestedhvm (hvm only) */
#define HVM_PARAM_NESTEDHVM 24
-#define HVM_NR_PARAMS 27
+/* Address of VM generation id buffer */
+#define HVM_PARAM_VM_GENERATION_ID_ADDR 27
+
+#define HVM_NR_PARAMS 28
#endif /* __XEN_PUBLIC_HVM_PARAMS_H__ */
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |