* [PATCH 1/8] libxc: add xc_hvm_param_get/set() to get/set 64-bit values
2014-06-18 16:12 [PATCHv6 0/8] tools: rework VM Generation ID David Vrabel
@ 2014-06-18 16:12 ` David Vrabel
2014-06-18 16:12 ` [PATCH 2/8] libxl: add libxl__random_bytes() which fills a buffer with random bytes David Vrabel
` (7 subsequent siblings)
8 siblings, 0 replies; 20+ messages in thread
From: David Vrabel @ 2014-06-18 16:12 UTC (permalink / raw)
To: xen-devel; +Cc: David Vrabel, Ian Jackson, Ian Campbell, Stefano Stabellini
HVMOP_get_param and HVMOP_set_param take a uint32_t for the parameter
index and a uint64_t for the value. So add xc_hvm_param_get() and
xc_hvm_param_set() that take the same types.
The existing xc_get_hvm_param() and xc_set_hvm_param() are retained
for compatibility but are deprecated.
Signed-off-by: David Vrabel <david.vrabel@citrix.com>
---
tools/libxc/xc_cpuid_x86.c | 11 +++++-----
tools/libxc/xc_dom_arm.c | 8 +++----
tools/libxc/xc_domain.c | 21 +++++++++++++++++--
tools/libxc/xc_domain_restore.c | 30 +++++++++++++--------------
tools/libxc/xc_domain_save.c | 39 ++++++++++++-----------------------
tools/libxc/xc_hvm_build_x86.c | 20 +++++++++---------
tools/libxc/xc_resume.c | 4 ++--
tools/libxc/xenctrl.h | 3 +++
tools/libxl/libxl.c | 6 +++---
tools/libxl/libxl_dom.c | 30 +++++++++++++++------------
tools/python/xen/lowlevel/xc/xc.c | 16 +++++++-------
tools/tests/xen-access/xen-access.c | 13 ++++++------
tools/xenpaging/xenpaging.c | 2 +-
13 files changed, 107 insertions(+), 96 deletions(-)
diff --git a/tools/libxc/xc_cpuid_x86.c b/tools/libxc/xc_cpuid_x86.c
index 4772ca7..8acb9fb 100644
--- a/tools/libxc/xc_cpuid_x86.c
+++ b/tools/libxc/xc_cpuid_x86.c
@@ -276,13 +276,12 @@ static void xc_cpuid_hvm_policy(
{
DECLARE_DOMCTL;
char brand[13];
- unsigned long nestedhvm;
- unsigned long pae;
+ uint64_t val;
int is_pae, is_nestedhvm;
uint64_t xfeature_mask;
- xc_get_hvm_param(xch, domid, HVM_PARAM_PAE_ENABLED, &pae);
- is_pae = !!pae;
+ xc_hvm_param_get(xch, domid, HVM_PARAM_PAE_ENABLED, &val);
+ is_pae = !!val;
/* Detecting Xen's atitude towards XSAVE */
memset(&domctl, 0, sizeof(domctl));
@@ -291,8 +290,8 @@ static void xc_cpuid_hvm_policy(
do_domctl(xch, &domctl);
xfeature_mask = domctl.u.vcpuextstate.xfeature_mask;
- xc_get_hvm_param(xch, domid, HVM_PARAM_NESTEDHVM, &nestedhvm);
- is_nestedhvm = !!nestedhvm;
+ xc_hvm_param_get(xch, domid, HVM_PARAM_NESTEDHVM, &val);
+ is_nestedhvm = !!val;
switch ( input[0] )
{
diff --git a/tools/libxc/xc_dom_arm.c b/tools/libxc/xc_dom_arm.c
index cc64363..10f6bcb 100644
--- a/tools/libxc/xc_dom_arm.c
+++ b/tools/libxc/xc_dom_arm.c
@@ -80,14 +80,14 @@ static int alloc_magic_pages(struct xc_dom_image *dom)
xc_clear_domain_page(dom->xch, dom->guest_domid, dom->console_pfn);
xc_clear_domain_page(dom->xch, dom->guest_domid, dom->xenstore_pfn);
- xc_set_hvm_param(dom->xch, dom->guest_domid, HVM_PARAM_CONSOLE_PFN,
+ xc_hvm_param_set(dom->xch, dom->guest_domid, HVM_PARAM_CONSOLE_PFN,
dom->console_pfn);
- xc_set_hvm_param(dom->xch, dom->guest_domid, HVM_PARAM_STORE_PFN,
+ xc_hvm_param_set(dom->xch, dom->guest_domid, HVM_PARAM_STORE_PFN,
dom->xenstore_pfn);
/* allocated by toolstack */
- xc_set_hvm_param(dom->xch, dom->guest_domid, HVM_PARAM_CONSOLE_EVTCHN,
+ xc_hvm_param_set(dom->xch, dom->guest_domid, HVM_PARAM_CONSOLE_EVTCHN,
dom->console_evtchn);
- xc_set_hvm_param(dom->xch, dom->guest_domid, HVM_PARAM_STORE_EVTCHN,
+ xc_hvm_param_set(dom->xch, dom->guest_domid, HVM_PARAM_STORE_EVTCHN,
dom->xenstore_evtchn);
return 0;
diff --git a/tools/libxc/xc_domain.c b/tools/libxc/xc_domain.c
index 26edbaf..09d4a83 100644
--- a/tools/libxc/xc_domain.c
+++ b/tools/libxc/xc_domain.c
@@ -1244,7 +1244,7 @@ int xc_domain_send_trigger(xc_interface *xch,
return do_domctl(xch, &domctl);
}
-int xc_set_hvm_param(xc_interface *handle, domid_t dom, int param, unsigned long value)
+int xc_hvm_param_set(xc_interface *handle, domid_t dom, uint32_t param, uint64_t value)
{
DECLARE_HYPERCALL;
DECLARE_HYPERCALL_BUFFER(xen_hvm_param_t, arg);
@@ -1265,7 +1265,7 @@ int xc_set_hvm_param(xc_interface *handle, domid_t dom, int param, unsigned long
return rc;
}
-int xc_get_hvm_param(xc_interface *handle, domid_t dom, int param, unsigned long *value)
+int xc_hvm_param_get(xc_interface *handle, domid_t dom, uint32_t param, uint64_t *value)
{
DECLARE_HYPERCALL;
DECLARE_HYPERCALL_BUFFER(xen_hvm_param_t, arg);
@@ -1286,6 +1286,23 @@ int xc_get_hvm_param(xc_interface *handle, domid_t dom, int param, unsigned long
return rc;
}
+int xc_set_hvm_param(xc_interface *handle, domid_t dom, int param, unsigned long value)
+{
+ return xc_hvm_param_set(handle, dom, param, value);
+}
+
+int xc_get_hvm_param(xc_interface *handle, domid_t dom, int param, unsigned long *value)
+{
+ uint64_t v;
+ int ret;
+
+ ret = xc_hvm_param_get(handle, dom, param, &v);
+ if (ret < 0)
+ return ret;
+ *value = v;
+ return 0;
+}
+
int xc_hvm_create_ioreq_server(xc_interface *xch,
domid_t domid,
int handle_bufioreq,
diff --git a/tools/libxc/xc_domain_restore.c b/tools/libxc/xc_domain_restore.c
index b80f867..6849712 100644
--- a/tools/libxc/xc_domain_restore.c
+++ b/tools/libxc/xc_domain_restore.c
@@ -1646,15 +1646,15 @@ int xc_domain_restore(xc_interface *xch, int io_fd, uint32_t dom,
}
/* should this be deferred? does it change? */
if ( pagebuf.identpt )
- xc_set_hvm_param(xch, dom, HVM_PARAM_IDENT_PT, pagebuf.identpt);
+ xc_hvm_param_set(xch, dom, HVM_PARAM_IDENT_PT, pagebuf.identpt);
if ( pagebuf.paging_ring_pfn )
- xc_set_hvm_param(xch, dom, HVM_PARAM_PAGING_RING_PFN, pagebuf.paging_ring_pfn);
+ xc_hvm_param_set(xch, dom, HVM_PARAM_PAGING_RING_PFN, pagebuf.paging_ring_pfn);
if ( pagebuf.access_ring_pfn )
- xc_set_hvm_param(xch, dom, HVM_PARAM_ACCESS_RING_PFN, pagebuf.access_ring_pfn);
+ xc_hvm_param_set(xch, dom, HVM_PARAM_ACCESS_RING_PFN, pagebuf.access_ring_pfn);
if ( pagebuf.sharing_ring_pfn )
- xc_set_hvm_param(xch, dom, HVM_PARAM_SHARING_RING_PFN, pagebuf.sharing_ring_pfn);
+ xc_hvm_param_set(xch, dom, HVM_PARAM_SHARING_RING_PFN, pagebuf.sharing_ring_pfn);
if ( pagebuf.vm86_tss )
- xc_set_hvm_param(xch, dom, HVM_PARAM_VM86_TSS, pagebuf.vm86_tss);
+ xc_hvm_param_set(xch, dom, HVM_PARAM_VM86_TSS, pagebuf.vm86_tss);
if ( pagebuf.console_pfn )
console_pfn = pagebuf.console_pfn;
if ( pagebuf.vm_generationid_addr ) {
@@ -1769,7 +1769,7 @@ int xc_domain_restore(xc_interface *xch, int io_fd, uint32_t dom,
}
if (pagebuf.viridian != 0)
- xc_set_hvm_param(xch, dom, HVM_PARAM_VIRIDIAN, 1);
+ xc_hvm_param_set(xch, dom, HVM_PARAM_VIRIDIAN, 1);
/*
* If we are migrating in from a host that does not support
@@ -1789,16 +1789,16 @@ int xc_domain_restore(xc_interface *xch, int io_fd, uint32_t dom,
} else {
if (pagebuf.nr_ioreq_server_pages != 0 &&
pagebuf.ioreq_server_pfn != 0) {
- xc_set_hvm_param(xch, dom, HVM_PARAM_NR_IOREQ_SERVER_PAGES,
+ xc_hvm_param_set(xch, dom, HVM_PARAM_NR_IOREQ_SERVER_PAGES,
pagebuf.nr_ioreq_server_pages);
- xc_set_hvm_param(xch, dom, HVM_PARAM_IOREQ_SERVER_PFN,
+ xc_hvm_param_set(xch, dom, HVM_PARAM_IOREQ_SERVER_PFN,
pagebuf.ioreq_server_pfn);
}
}
if (pagebuf.acpi_ioport_location == 1) {
DBGPRINTF("Use new firmware ioport from the checkpoint\n");
- xc_set_hvm_param(xch, dom, HVM_PARAM_ACPI_IOPORTS_LOCATION, 1);
+ xc_hvm_param_set(xch, dom, HVM_PARAM_ACPI_IOPORTS_LOCATION, 1);
} else if (pagebuf.acpi_ioport_location == 0) {
DBGPRINTF("Use old firmware ioport from the checkpoint\n");
} else {
@@ -2329,15 +2329,15 @@ int xc_domain_restore(xc_interface *xch, int io_fd, uint32_t dom,
goto out;
}
- if ( (frc = xc_set_hvm_param(xch, dom,
+ if ( (frc = xc_hvm_param_set(xch, dom,
HVM_PARAM_IOREQ_PFN, tailbuf.u.hvm.magicpfns[0]))
- || (frc = xc_set_hvm_param(xch, dom,
+ || (frc = xc_hvm_param_set(xch, dom,
HVM_PARAM_BUFIOREQ_PFN, tailbuf.u.hvm.magicpfns[1]))
- || (frc = xc_set_hvm_param(xch, dom,
+ || (frc = xc_hvm_param_set(xch, dom,
HVM_PARAM_STORE_PFN, tailbuf.u.hvm.magicpfns[2]))
- || (frc = xc_set_hvm_param(xch, dom,
+ || (frc = xc_hvm_param_set(xch, dom,
HVM_PARAM_PAE_ENABLED, pae))
- || (frc = xc_set_hvm_param(xch, dom,
+ || (frc = xc_hvm_param_set(xch, dom,
HVM_PARAM_STORE_EVTCHN,
store_evtchn)) )
{
@@ -2351,7 +2351,7 @@ int xc_domain_restore(xc_interface *xch, int io_fd, uint32_t dom,
PERROR("error zeroing console page");
goto out;
}
- if ( (frc = xc_set_hvm_param(xch, dom,
+ if ( (frc = xc_hvm_param_set(xch, dom,
HVM_PARAM_CONSOLE_PFN, console_pfn)) ) {
PERROR("error setting HVM param: %i", frc);
goto out;
diff --git a/tools/libxc/xc_domain_save.c b/tools/libxc/xc_domain_save.c
index 778cbde..14502c1 100644
--- a/tools/libxc/xc_domain_save.c
+++ b/tools/libxc/xc_domain_save.c
@@ -1645,8 +1645,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
chunk.id = XC_SAVE_ID_HVM_IDENT_PT;
chunk.data = 0;
- xc_get_hvm_param(xch, dom, HVM_PARAM_IDENT_PT,
- (unsigned long *)&chunk.data);
+ xc_hvm_param_get(xch, dom, HVM_PARAM_IDENT_PT, &chunk.data);
if ( (chunk.data != 0) &&
wrexact(io_fd, &chunk, sizeof(chunk)) )
@@ -1657,8 +1656,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
chunk.id = XC_SAVE_ID_HVM_PAGING_RING_PFN;
chunk.data = 0;
- xc_get_hvm_param(xch, dom, HVM_PARAM_PAGING_RING_PFN,
- (unsigned long *)&chunk.data);
+ xc_hvm_param_get(xch, dom, HVM_PARAM_PAGING_RING_PFN, &chunk.data);
if ( (chunk.data != 0) &&
wrexact(io_fd, &chunk, sizeof(chunk)) )
@@ -1669,8 +1667,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
chunk.id = XC_SAVE_ID_HVM_ACCESS_RING_PFN;
chunk.data = 0;
- xc_get_hvm_param(xch, dom, HVM_PARAM_ACCESS_RING_PFN,
- (unsigned long *)&chunk.data);
+ xc_hvm_param_get(xch, dom, HVM_PARAM_ACCESS_RING_PFN, &chunk.data);
if ( (chunk.data != 0) &&
wrexact(io_fd, &chunk, sizeof(chunk)) )
@@ -1681,8 +1678,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
chunk.id = XC_SAVE_ID_HVM_SHARING_RING_PFN;
chunk.data = 0;
- xc_get_hvm_param(xch, dom, HVM_PARAM_SHARING_RING_PFN,
- (unsigned long *)&chunk.data);
+ xc_hvm_param_get(xch, dom, HVM_PARAM_SHARING_RING_PFN, &chunk.data);
if ( (chunk.data != 0) &&
wrexact(io_fd, &chunk, sizeof(chunk)) )
@@ -1693,8 +1689,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
chunk.id = XC_SAVE_ID_HVM_VM86_TSS;
chunk.data = 0;
- xc_get_hvm_param(xch, dom, HVM_PARAM_VM86_TSS,
- (unsigned long *)&chunk.data);
+ xc_hvm_param_get(xch, dom, HVM_PARAM_VM86_TSS, &chunk.data);
if ( (chunk.data != 0) &&
wrexact(io_fd, &chunk, sizeof(chunk)) )
@@ -1705,8 +1700,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
chunk.id = XC_SAVE_ID_HVM_CONSOLE_PFN;
chunk.data = 0;
- xc_get_hvm_param(xch, dom, HVM_PARAM_CONSOLE_PFN,
- (unsigned long *)&chunk.data);
+ xc_hvm_param_get(xch, dom, HVM_PARAM_CONSOLE_PFN, &chunk.data);
if ( (chunk.data != 0) &&
wrexact(io_fd, &chunk, sizeof(chunk)) )
@@ -1717,8 +1711,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
chunk.id = XC_SAVE_ID_HVM_ACPI_IOPORTS_LOCATION;
chunk.data = 0;
- xc_get_hvm_param(xch, dom, HVM_PARAM_ACPI_IOPORTS_LOCATION,
- (unsigned long *)&chunk.data);
+ xc_hvm_param_get(xch, dom, HVM_PARAM_ACPI_IOPORTS_LOCATION, &chunk.data);
if ((chunk.data != 0) && wrexact(io_fd, &chunk, sizeof(chunk)))
{
@@ -1728,8 +1721,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
chunk.id = XC_SAVE_ID_HVM_VIRIDIAN;
chunk.data = 0;
- xc_get_hvm_param(xch, dom, HVM_PARAM_VIRIDIAN,
- (unsigned long *)&chunk.data);
+ xc_hvm_param_get(xch, dom, HVM_PARAM_VIRIDIAN, &chunk.data);
if ( (chunk.data != 0) &&
wrexact(io_fd, &chunk, sizeof(chunk)) )
@@ -1740,8 +1732,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
chunk.id = XC_SAVE_ID_HVM_IOREQ_SERVER_PFN;
chunk.data = 0;
- xc_get_hvm_param(xch, dom, HVM_PARAM_IOREQ_SERVER_PFN,
- (unsigned long *)&chunk.data);
+ xc_hvm_param_get(xch, dom, HVM_PARAM_IOREQ_SERVER_PFN, &chunk.data);
if ( (chunk.data != 0) &&
wrexact(io_fd, &chunk, sizeof(chunk)) )
@@ -1752,8 +1743,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
chunk.id = XC_SAVE_ID_HVM_NR_IOREQ_SERVER_PAGES;
chunk.data = 0;
- xc_get_hvm_param(xch, dom, HVM_PARAM_NR_IOREQ_SERVER_PAGES,
- (unsigned long *)&chunk.data);
+ xc_hvm_param_get(xch, dom, HVM_PARAM_NR_IOREQ_SERVER_PAGES, &chunk.data);
if ( (chunk.data != 0) &&
wrexact(io_fd, &chunk, sizeof(chunk)) )
@@ -1827,12 +1817,9 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
/* Save magic-page locations. */
memset(magic_pfns, 0, sizeof(magic_pfns));
- xc_get_hvm_param(xch, dom, HVM_PARAM_IOREQ_PFN,
- (unsigned long *)&magic_pfns[0]);
- xc_get_hvm_param(xch, dom, HVM_PARAM_BUFIOREQ_PFN,
- (unsigned long *)&magic_pfns[1]);
- xc_get_hvm_param(xch, dom, HVM_PARAM_STORE_PFN,
- (unsigned long *)&magic_pfns[2]);
+ xc_hvm_param_get(xch, dom, HVM_PARAM_IOREQ_PFN, &magic_pfns[0]);
+ xc_hvm_param_get(xch, dom, HVM_PARAM_BUFIOREQ_PFN, &magic_pfns[1]);
+ xc_hvm_param_get(xch, dom, HVM_PARAM_STORE_PFN, &magic_pfns[2]);
if ( wrexact(io_fd, magic_pfns, sizeof(magic_pfns)) )
{
PERROR("Error when writing to state file (7)");
diff --git a/tools/libxc/xc_hvm_build_x86.c b/tools/libxc/xc_hvm_build_x86.c
index ed1069b..c81a25b 100644
--- a/tools/libxc/xc_hvm_build_x86.c
+++ b/tools/libxc/xc_hvm_build_x86.c
@@ -487,19 +487,19 @@ static int setup_guest(xc_interface *xch,
if ( xc_clear_domain_pages(xch, dom, special_pfn(0), NR_SPECIAL_PAGES) )
goto error_out;
- xc_set_hvm_param(xch, dom, HVM_PARAM_STORE_PFN,
+ xc_hvm_param_set(xch, dom, HVM_PARAM_STORE_PFN,
special_pfn(SPECIALPAGE_XENSTORE));
- xc_set_hvm_param(xch, dom, HVM_PARAM_BUFIOREQ_PFN,
+ xc_hvm_param_set(xch, dom, HVM_PARAM_BUFIOREQ_PFN,
special_pfn(SPECIALPAGE_BUFIOREQ));
- xc_set_hvm_param(xch, dom, HVM_PARAM_IOREQ_PFN,
+ xc_hvm_param_set(xch, dom, HVM_PARAM_IOREQ_PFN,
special_pfn(SPECIALPAGE_IOREQ));
- xc_set_hvm_param(xch, dom, HVM_PARAM_CONSOLE_PFN,
+ xc_hvm_param_set(xch, dom, HVM_PARAM_CONSOLE_PFN,
special_pfn(SPECIALPAGE_CONSOLE));
- xc_set_hvm_param(xch, dom, HVM_PARAM_PAGING_RING_PFN,
+ xc_hvm_param_set(xch, dom, HVM_PARAM_PAGING_RING_PFN,
special_pfn(SPECIALPAGE_PAGING));
- xc_set_hvm_param(xch, dom, HVM_PARAM_ACCESS_RING_PFN,
+ xc_hvm_param_set(xch, dom, HVM_PARAM_ACCESS_RING_PFN,
special_pfn(SPECIALPAGE_ACCESS));
- xc_set_hvm_param(xch, dom, HVM_PARAM_SHARING_RING_PFN,
+ xc_hvm_param_set(xch, dom, HVM_PARAM_SHARING_RING_PFN,
special_pfn(SPECIALPAGE_SHARING));
/*
@@ -521,9 +521,9 @@ static int setup_guest(xc_interface *xch,
goto error_out;
/* Tell the domain where the pages are and how many there are */
- xc_set_hvm_param(xch, dom, HVM_PARAM_IOREQ_SERVER_PFN,
+ xc_hvm_param_set(xch, dom, HVM_PARAM_IOREQ_SERVER_PFN,
ioreq_server_pfn(0));
- xc_set_hvm_param(xch, dom, HVM_PARAM_NR_IOREQ_SERVER_PAGES,
+ xc_hvm_param_set(xch, dom, HVM_PARAM_NR_IOREQ_SERVER_PAGES,
NR_IOREQ_SERVER_PAGES);
/*
@@ -538,7 +538,7 @@ static int setup_guest(xc_interface *xch,
ident_pt[i] = ((i << 22) | _PAGE_PRESENT | _PAGE_RW | _PAGE_USER |
_PAGE_ACCESSED | _PAGE_DIRTY | _PAGE_PSE);
munmap(ident_pt, PAGE_SIZE);
- xc_set_hvm_param(xch, dom, HVM_PARAM_IDENT_PT,
+ xc_hvm_param_set(xch, dom, HVM_PARAM_IDENT_PT,
special_pfn(SPECIALPAGE_IDENT_PT) << PAGE_SHIFT);
/* Insert JMP <rel32> instruction at address 0x0 to reach entry point. */
diff --git a/tools/libxc/xc_resume.c b/tools/libxc/xc_resume.c
index e423814..f48515a 100644
--- a/tools/libxc/xc_resume.c
+++ b/tools/libxc/xc_resume.c
@@ -51,8 +51,8 @@ static int modify_returncode(xc_interface *xch, uint32_t domid)
if ( info.hvm )
{
/* HVM guests without PV drivers have no return code to modify. */
- unsigned long irq = 0;
- xc_get_hvm_param(xch, domid, HVM_PARAM_CALLBACK_IRQ, &irq);
+ uint64_t irq = 0;
+ xc_hvm_param_get(xch, domid, HVM_PARAM_CALLBACK_IRQ, &irq);
if ( !irq )
return 0;
diff --git a/tools/libxc/xenctrl.h b/tools/libxc/xenctrl.h
index b55d857..b8fbfbe 100644
--- a/tools/libxc/xenctrl.h
+++ b/tools/libxc/xenctrl.h
@@ -1807,7 +1807,10 @@ const xc_error *xc_get_last_error(xc_interface *handle);
*/
void xc_clear_last_error(xc_interface *xch);
+int xc_hvm_param_set(xc_interface *handle, domid_t dom, uint32_t param, uint64_t value);
+int xc_hvm_param_get(xc_interface *handle, domid_t dom, uint32_t param, uint64_t *value);
+/* Deprecated: use xc_hvm_param_set/get() instead. */
int xc_set_hvm_param(xc_interface *handle, domid_t dom, int param, unsigned long value);
int xc_get_hvm_param(xc_interface *handle, domid_t dom, int param, unsigned long *value);
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index 9054c3b..be59f99 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -885,7 +885,7 @@ int libxl__domain_pvcontrol_available(libxl__gc *gc, uint32_t domid)
{
libxl_ctx *ctx = libxl__gc_owner(gc);
- unsigned long pvdriver = 0;
+ uint64_t pvdriver = 0;
int ret;
libxl_domain_type domtype = libxl__domain_type(gc, domid);
@@ -895,7 +895,7 @@ int libxl__domain_pvcontrol_available(libxl__gc *gc, uint32_t domid)
if (domtype == LIBXL_DOMAIN_TYPE_PV)
return 1;
- ret = xc_get_hvm_param(ctx->xch, domid, HVM_PARAM_CALLBACK_IRQ, &pvdriver);
+ ret = xc_hvm_param_get(ctx->xch, domid, HVM_PARAM_CALLBACK_IRQ, &pvdriver);
if (ret<0) {
LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting HVM callback IRQ");
return ERROR_FAIL;
@@ -5080,7 +5080,7 @@ static int libxl__domain_s3_resume(libxl__gc *gc, int domid)
case LIBXL_DOMAIN_TYPE_HVM:
switch (libxl__device_model_version_running(gc, domid)) {
case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL:
- rc = xc_set_hvm_param(CTX->xch, domid, HVM_PARAM_ACPI_S_STATE, 0);
+ rc = xc_hvm_param_set(CTX->xch, domid, HVM_PARAM_ACPI_S_STATE, 0);
break;
case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN:
rc = libxl__qmp_system_wakeup(gc, domid);
diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c
index 661999c..8096d66 100644
--- a/tools/libxl/libxl_dom.c
+++ b/tools/libxl/libxl_dom.c
@@ -212,18 +212,18 @@ static unsigned long timer_mode(const libxl_domain_build_info *info)
static void hvm_set_conf_params(xc_interface *handle, uint32_t domid,
libxl_domain_build_info *const info)
{
- xc_set_hvm_param(handle, domid, HVM_PARAM_PAE_ENABLED,
+ xc_hvm_param_set(handle, domid, HVM_PARAM_PAE_ENABLED,
libxl_defbool_val(info->u.hvm.pae));
#if defined(__i386__) || defined(__x86_64__)
- xc_set_hvm_param(handle, domid, HVM_PARAM_VIRIDIAN,
+ xc_hvm_param_set(handle, domid, HVM_PARAM_VIRIDIAN,
libxl_defbool_val(info->u.hvm.viridian));
- xc_set_hvm_param(handle, domid, HVM_PARAM_HPET_ENABLED,
+ xc_hvm_param_set(handle, domid, HVM_PARAM_HPET_ENABLED,
libxl_defbool_val(info->u.hvm.hpet));
#endif
- xc_set_hvm_param(handle, domid, HVM_PARAM_TIMER_MODE, timer_mode(info));
- xc_set_hvm_param(handle, domid, HVM_PARAM_VPT_ALIGN,
+ xc_hvm_param_set(handle, domid, HVM_PARAM_TIMER_MODE, timer_mode(info));
+ xc_hvm_param_set(handle, domid, HVM_PARAM_VPT_ALIGN,
libxl_defbool_val(info->u.hvm.vpt_align));
- xc_set_hvm_param(handle, domid, HVM_PARAM_NESTEDHVM,
+ xc_hvm_param_set(handle, domid, HVM_PARAM_NESTEDHVM,
libxl_defbool_val(info->u.hvm.nested_hvm));
}
@@ -490,6 +490,7 @@ static int hvm_build_set_params(xc_interface *handle, uint32_t domid,
{
struct hvm_info_table *va_hvm;
uint8_t *va_map, sum;
+ uint64_t str_mfn, cons_mfn;
int i;
va_map = xc_map_foreign_range(handle, domid,
@@ -508,10 +509,13 @@ static int hvm_build_set_params(xc_interface *handle, uint32_t domid,
va_hvm->checksum -= sum;
munmap(va_map, XC_PAGE_SIZE);
- xc_get_hvm_param(handle, domid, HVM_PARAM_STORE_PFN, store_mfn);
- xc_get_hvm_param(handle, domid, HVM_PARAM_CONSOLE_PFN, console_mfn);
- xc_set_hvm_param(handle, domid, HVM_PARAM_STORE_EVTCHN, store_evtchn);
- xc_set_hvm_param(handle, domid, HVM_PARAM_CONSOLE_EVTCHN, console_evtchn);
+ xc_hvm_param_get(handle, domid, HVM_PARAM_STORE_PFN, &str_mfn);
+ xc_hvm_param_get(handle, domid, HVM_PARAM_CONSOLE_PFN, &cons_mfn);
+ xc_hvm_param_set(handle, domid, HVM_PARAM_STORE_EVTCHN, store_evtchn);
+ xc_hvm_param_set(handle, domid, HVM_PARAM_CONSOLE_EVTCHN, console_evtchn);
+
+ *store_mfn = str_mfn;
+ *console_mfn = cons_mfn;
xc_dom_gnttab_hvm_seed(handle, domid, *console_mfn, *store_mfn, console_domid, store_domid);
return 0;
@@ -1070,15 +1074,15 @@ static void domain_suspend_callback_common(libxl__egc *egc,
libxl__domain_suspend_state *dss)
{
STATE_AO_GC(dss->ao);
- unsigned long hvm_s_state = 0, hvm_pvdrv = 0;
+ uint64_t hvm_s_state = 0, hvm_pvdrv = 0;
int ret, rc;
/* Convenience aliases */
const uint32_t domid = dss->domid;
if (dss->hvm) {
- xc_get_hvm_param(CTX->xch, domid, HVM_PARAM_CALLBACK_IRQ, &hvm_pvdrv);
- xc_get_hvm_param(CTX->xch, domid, HVM_PARAM_ACPI_S_STATE, &hvm_s_state);
+ xc_hvm_param_get(CTX->xch, domid, HVM_PARAM_CALLBACK_IRQ, &hvm_pvdrv);
+ xc_hvm_param_get(CTX->xch, domid, HVM_PARAM_ACPI_S_STATE, &hvm_s_state);
}
if ((hvm_s_state == 0) && (dss->guest_evtchn.port >= 0)) {
diff --git a/tools/python/xen/lowlevel/xc/xc.c b/tools/python/xen/lowlevel/xc/xc.c
index cb34446..314bb45 100644
--- a/tools/python/xen/lowlevel/xc/xc.c
+++ b/tools/python/xen/lowlevel/xc/xc.c
@@ -544,27 +544,27 @@ static PyObject *pyxc_linux_build(XcObject *self,
return pyxc_error_to_exception(self->xc_handle);
}
-static PyObject *pyxc_get_hvm_param(XcObject *self,
+static PyObject *pyxc_hvm_param_get(XcObject *self,
PyObject *args,
PyObject *kwds)
{
uint32_t dom;
int param;
- unsigned long value;
+ uint64_t value;
static char *kwd_list[] = { "domid", "param", NULL };
if ( !PyArg_ParseTupleAndKeywords(args, kwds, "ii", kwd_list,
&dom, ¶m) )
return NULL;
- if ( xc_get_hvm_param(self->xc_handle, dom, param, &value) != 0 )
+ if ( xc_hvm_param_get(self->xc_handle, dom, param, &value) != 0 )
return pyxc_error_to_exception(self->xc_handle);
- return PyLong_FromUnsignedLong(value);
+ return PyLong_FromUnsignedLongLong(value);
}
-static PyObject *pyxc_set_hvm_param(XcObject *self,
+static PyObject *pyxc_hvm_param_set(XcObject *self,
PyObject *args,
PyObject *kwds)
{
@@ -577,7 +577,7 @@ static PyObject *pyxc_set_hvm_param(XcObject *self,
&dom, ¶m, &value) )
return NULL;
- if ( xc_set_hvm_param(self->xc_handle, dom, param, value) != 0 )
+ if ( xc_hvm_param_set(self->xc_handle, dom, param, value) != 0 )
return pyxc_error_to_exception(self->xc_handle);
Py_INCREF(zero);
@@ -2480,7 +2480,7 @@ static PyMethodDef pyxc_methods[] = {
"Returns: None on sucess. Raises exception on error.\n" },
{ "hvm_get_param",
- (PyCFunction)pyxc_get_hvm_param,
+ (PyCFunction)pyxc_hvm_param_get,
METH_VARARGS | METH_KEYWORDS, "\n"
"get a parameter of HVM guest OS.\n"
" dom [int]: Identifier of domain to build into.\n"
@@ -2488,7 +2488,7 @@ static PyMethodDef pyxc_methods[] = {
"Returns: [long] value of the param.\n" },
{ "hvm_set_param",
- (PyCFunction)pyxc_set_hvm_param,
+ (PyCFunction)pyxc_hvm_param_set,
METH_VARARGS | METH_KEYWORDS, "\n"
"set a parameter of HVM guest OS.\n"
" dom [int]: Identifier of domain to build into.\n"
diff --git a/tools/tests/xen-access/xen-access.c b/tools/tests/xen-access/xen-access.c
index 0a84bd5..be4d100 100644
--- a/tools/tests/xen-access/xen-access.c
+++ b/tools/tests/xen-access/xen-access.c
@@ -223,6 +223,7 @@ xenaccess_t *xenaccess_init(xc_interface **xch_r, domid_t domain_id)
xenaccess_t *xenaccess = 0;
xc_interface *xch;
int rc;
+ uint64_t val;
unsigned long ring_pfn, mmap_pfn;
xch = xc_interface_open(NULL, NULL, 0);
@@ -246,9 +247,9 @@ xenaccess_t *xenaccess_init(xc_interface **xch_r, domid_t domain_id)
mem_event_ring_lock_init(&xenaccess->mem_event);
/* Map the ring page */
- xc_get_hvm_param(xch, xenaccess->mem_event.domain_id,
- HVM_PARAM_ACCESS_RING_PFN, &ring_pfn);
- mmap_pfn = ring_pfn;
+ xc_hvm_param_get(xch, xenaccess->mem_event.domain_id,
+ HVM_PARAM_ACCESS_RING_PFN, &val);
+ mmap_pfn = ring_pfn = val;
xenaccess->mem_event.ring_page =
xc_map_foreign_batch(xch, xenaccess->mem_event.domain_id,
PROT_READ | PROT_WRITE, &mmap_pfn, 1);
@@ -536,9 +537,9 @@ int main(int argc, char *argv[])
}
if ( int3 )
- rc = xc_set_hvm_param(xch, domain_id, HVM_PARAM_MEMORY_EVENT_INT3, HVMPME_mode_sync);
+ rc = xc_hvm_param_set(xch, domain_id, HVM_PARAM_MEMORY_EVENT_INT3, HVMPME_mode_sync);
else
- rc = xc_set_hvm_param(xch, domain_id, HVM_PARAM_MEMORY_EVENT_INT3, HVMPME_mode_disabled);
+ rc = xc_hvm_param_set(xch, domain_id, HVM_PARAM_MEMORY_EVENT_INT3, HVMPME_mode_disabled);
if ( rc < 0 )
{
ERROR("Error %d setting int3 mem_event\n", rc);
@@ -556,7 +557,7 @@ int main(int argc, char *argv[])
rc = xc_set_mem_access(xch, domain_id, XENMEM_access_rwx, ~0ull, 0);
rc = xc_set_mem_access(xch, domain_id, XENMEM_access_rwx, 0,
xenaccess->domain_info->max_pages);
- rc = xc_set_hvm_param(xch, domain_id, HVM_PARAM_MEMORY_EVENT_INT3, HVMPME_mode_disabled);
+ rc = xc_hvm_param_set(xch, domain_id, HVM_PARAM_MEMORY_EVENT_INT3, HVMPME_mode_disabled);
shutting_down = 1;
}
diff --git a/tools/xenpaging/xenpaging.c b/tools/xenpaging/xenpaging.c
index 82c1ee4..442eed0 100644
--- a/tools/xenpaging/xenpaging.c
+++ b/tools/xenpaging/xenpaging.c
@@ -339,7 +339,7 @@ static struct xenpaging *xenpaging_init(int argc, char *argv[])
}
/* Map the ring page */
- xc_get_hvm_param(xch, paging->mem_event.domain_id,
+ xc_hvm_param_get(xch, paging->mem_event.domain_id,
HVM_PARAM_PAGING_RING_PFN, &ring_pfn);
mmap_pfn = ring_pfn;
paging->mem_event.ring_page =
--
1.7.10.4
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 5/8] libxc, libxl, hvmloader: strip out outdated VM generation ID implementation
2014-06-18 16:12 [PATCHv6 0/8] tools: rework VM Generation ID David Vrabel
` (3 preceding siblings ...)
2014-06-18 16:12 ` [PATCH 4/8] hvm: add HVM_PARAM_VM_GENERATION_ID_ADDR David Vrabel
@ 2014-06-18 16:12 ` David Vrabel
2014-06-27 12:41 ` Ian Campbell
2014-06-18 16:12 ` [PATCH 6/8] libxl: allow a generation ID to be specified at domain creation David Vrabel
` (3 subsequent siblings)
8 siblings, 1 reply; 20+ messages in thread
From: David Vrabel @ 2014-06-18 16:12 UTC (permalink / raw)
To: xen-devel; +Cc: David Vrabel, Ian Jackson, Ian Campbell, Stefano Stabellini
The VM generation ID support in libxc/libxl was based on a draft
specification which subsequently changed considerably. Remove much of
the code in anticipation of introducing something simpler that
conforms to the current specification from Microsoft.
Switch to using a HVM param (HVM_PARAM_VM_GENERATION_ID_ADDR) instead
of the hvmloader/generation-id-address XenStore key. This simplifies
save/restore since it only needs to transfer the value of this param.
There are no changes to the migration stream format or the public
libxl API.
Signed-off-by: David Vrabel <david.vrabel@citrix.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
---
tools/firmware/hvmloader/acpi/build.c | 9 +++----
tools/libxc/xc_domain_restore.c | 44 +++------------------------------
tools/libxc/xc_domain_save.c | 5 ++--
tools/libxc/xenguest.h | 8 ++----
tools/libxl/libxl_create.c | 12 +++------
tools/libxl/libxl_dom.c | 25 ++-----------------
tools/libxl/libxl_internal.h | 8 ++----
tools/libxl/libxl_save_callout.c | 10 +++-----
tools/libxl/libxl_save_helper.c | 9 +++----
tools/libxl/libxl_save_msgs_gen.pl | 3 +--
10 files changed, 26 insertions(+), 107 deletions(-)
diff --git a/tools/firmware/hvmloader/acpi/build.c b/tools/firmware/hvmloader/acpi/build.c
index 5c42d89..1431296 100644
--- a/tools/firmware/hvmloader/acpi/build.c
+++ b/tools/firmware/hvmloader/acpi/build.c
@@ -24,6 +24,7 @@
#include "../config.h"
#include "../util.h"
#include <xen/hvm/hvm_xs_strings.h>
+#include <xen/hvm/params.h>
#define ACPI_MAX_SECONDARY_TABLES 16
@@ -362,7 +363,6 @@ static int construct_secondary_tables(unsigned long *table_ptrs,
static int new_vm_gid(struct acpi_info *acpi_info)
{
uint64_t vm_gid[2], *buf;
- char addr[12];
const char * s;
char *end;
@@ -383,12 +383,9 @@ static int new_vm_gid(struct acpi_info *acpi_info)
return 0;
memcpy(buf, vm_gid, sizeof(vm_gid));
- /* set into ACPI table and XenStore the address */
+ /* set into ACPI table and HVM param the address */
acpi_info->vm_gid_addr = virt_to_phys(buf);
- if ( snprintf(addr, sizeof(addr), "0x%lx", virt_to_phys(buf))
- >= sizeof(addr) )
- return 0;
- xenstore_write("hvmloader/generation-id-address", addr);
+ hvm_param_set(HVM_PARAM_VM_GENERATION_ID_ADDR, acpi_info->vm_gid_addr);
return 1;
}
diff --git a/tools/libxc/xc_domain_restore.c b/tools/libxc/xc_domain_restore.c
index 6849712..dea41a0 100644
--- a/tools/libxc/xc_domain_restore.c
+++ b/tools/libxc/xc_domain_restore.c
@@ -1431,8 +1431,7 @@ int xc_domain_restore(xc_interface *xch, int io_fd, uint32_t dom,
domid_t store_domid, unsigned int console_evtchn,
unsigned long *console_mfn, domid_t console_domid,
unsigned int hvm, unsigned int pae, int superpages,
- int no_incr_generationid, int checkpointed_stream,
- unsigned long *vm_generationid_addr,
+ int checkpointed_stream,
struct restore_callbacks *callbacks)
{
DECLARE_DOMCTL;
@@ -1657,44 +1656,9 @@ int xc_domain_restore(xc_interface *xch, int io_fd, uint32_t dom,
xc_hvm_param_set(xch, dom, HVM_PARAM_VM86_TSS, pagebuf.vm86_tss);
if ( pagebuf.console_pfn )
console_pfn = pagebuf.console_pfn;
- if ( pagebuf.vm_generationid_addr ) {
- if ( !no_incr_generationid ) {
- unsigned int offset;
- unsigned char *buf;
- unsigned long long generationid;
-
- /*
- * Map the VM generation id buffer and inject the new value.
- */
-
- pfn = pagebuf.vm_generationid_addr >> PAGE_SHIFT;
- offset = pagebuf.vm_generationid_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);
- if ( buf == NULL )
- {
- ERROR("xc_map_foreign_range for generation id"
- " buffer failed");
- goto out;
- }
-
- generationid = *(unsigned long long *)(buf + offset);
- *(unsigned long long *)(buf + offset) = generationid + 1;
-
- munmap(buf, PAGE_SIZE);
- }
-
- *vm_generationid_addr = pagebuf.vm_generationid_addr;
- }
+ if ( pagebuf.vm_generationid_addr )
+ xc_hvm_param_set(xch, dom, HVM_PARAM_VM_GENERATION_ID_ADDR,
+ pagebuf.vm_generationid_addr);
break; /* our work here is done */
}
diff --git a/tools/libxc/xc_domain_save.c b/tools/libxc/xc_domain_save.c
index 14502c1..b5a772b 100644
--- a/tools/libxc/xc_domain_save.c
+++ b/tools/libxc/xc_domain_save.c
@@ -802,8 +802,7 @@ static int save_tsc_info(xc_interface *xch, uint32_t dom, int io_fd)
int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iters,
uint32_t max_factor, uint32_t flags,
- struct save_callbacks* callbacks, int hvm,
- unsigned long vm_generationid_addr)
+ struct save_callbacks* callbacks, int hvm)
{
xc_dominfo_t info;
DECLARE_DOMCTL;
@@ -1634,7 +1633,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter
} chunk = { 0, };
chunk.id = XC_SAVE_ID_HVM_GENERATION_ID_ADDR;
- chunk.data = vm_generationid_addr;
+ xc_hvm_param_get(xch, dom, HVM_PARAM_VM_GENERATION_ID_ADDR, &chunk.data);
if ( (chunk.data != 0) &&
wrexact(io_fd, &chunk, sizeof(chunk)) )
diff --git a/tools/libxc/xenguest.h b/tools/libxc/xenguest.h
index 1f216cd..40bbac8 100644
--- a/tools/libxc/xenguest.h
+++ b/tools/libxc/xenguest.h
@@ -86,8 +86,7 @@ struct save_callbacks {
*/
int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iters,
uint32_t max_factor, uint32_t flags /* XCFLAGS_xxx */,
- struct save_callbacks* callbacks, int hvm,
- unsigned long vm_generationid_addr);
+ struct save_callbacks* callbacks, int hvm);
/* callbacks provided by xc_domain_restore */
@@ -113,9 +112,7 @@ struct restore_callbacks {
* @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 no_incr_generationid non-zero if generation id is NOT to be incremented
* @parm checkpointed_stream non-zero if the far end of the stream is using checkpointing
- * @parm vm_generationid_addr returned with the address of the generation id buffer
* @parm callbacks non-NULL to receive a callback to restore toolstack
* specific data
* @return 0 on success, -1 on failure
@@ -125,8 +122,7 @@ int xc_domain_restore(xc_interface *xch, int io_fd, uint32_t dom,
domid_t store_domid, unsigned int console_evtchn,
unsigned long *console_mfn, domid_t console_domid,
unsigned int hvm, unsigned int pae, int superpages,
- int no_incr_generationid, int checkpointed_stream,
- unsigned long *vm_generationid_addr,
+ int checkpointed_stream,
struct restore_callbacks *callbacks);
/**
* xc_domain_restore writes a file to disk that contains the device
diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
index d015cf4..cae6f53 100644
--- a/tools/libxl/libxl_create.c
+++ b/tools/libxl/libxl_create.c
@@ -584,12 +584,7 @@ retry_transaction:
ARRAY_SIZE(rwperm));
}
- if (info->type == LIBXL_DOMAIN_TYPE_HVM)
- libxl__xs_mkdir(gc, t,
- libxl__sprintf(gc, "%s/hvmloader/generation-id-address", dom_path),
- rwperm, ARRAY_SIZE(rwperm));
-
- vm_list = libxl_list_vm(ctx, &nb_vm);
+ vm_list = libxl_list_vm(ctx, &nb_vm);
if (!vm_list) {
LOG(ERROR, "cannot get number of running guests");
rc = ERROR_FAIL;
@@ -903,7 +898,7 @@ static void domcreate_bootloader_done(libxl__egc *egc,
goto out;
}
libxl__xc_domain_restore(egc, dcs,
- hvm, pae, superpages, 1);
+ hvm, pae, superpages);
return;
out:
@@ -911,7 +906,7 @@ static void domcreate_bootloader_done(libxl__egc *egc,
}
void libxl__srm_callout_callback_restore_results(unsigned long store_mfn,
- unsigned long console_mfn, unsigned long genidad, void *user)
+ unsigned long console_mfn, void *user)
{
libxl__save_helper_state *shs = user;
libxl__domain_create_state *dcs = CONTAINER_OF(shs, *dcs, shs);
@@ -920,7 +915,6 @@ void libxl__srm_callout_callback_restore_results(unsigned long store_mfn,
state->store_mfn = store_mfn;
state->console_mfn = console_mfn;
- state->vm_generationid_addr = genidad;
shs->need_results = 0;
}
diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c
index 8096d66..a63c31c 100644
--- a/tools/libxl/libxl_dom.c
+++ b/tools/libxl/libxl_dom.c
@@ -279,7 +279,6 @@ int libxl__build_pre(libxl__gc *gc, uint32_t domid,
state->store_port = xc_evtchn_alloc_unbound(ctx->xch, domid, state->store_domid);
state->console_port = xc_evtchn_alloc_unbound(ctx->xch, domid, state->console_domid);
- state->vm_generationid_addr = 0;
if (info->type == LIBXL_DOMAIN_TYPE_HVM)
hvm_set_conf_params(ctx->xch, domid, info);
@@ -297,7 +296,7 @@ int libxl__build_post(libxl__gc *gc, uint32_t domid,
libxl_ctx *ctx = libxl__gc_owner(gc);
char *dom_path, *vm_path;
xs_transaction_t t;
- char **ents, **hvm_ents;
+ char **ents;
int i, rc;
rc = libxl_domain_sched_params_set(CTX, domid, &info->sched_params);
@@ -334,13 +333,6 @@ int libxl__build_post(libxl__gc *gc, uint32_t domid,
? "online" : "offline";
}
- hvm_ents = NULL;
- if (info->type == LIBXL_DOMAIN_TYPE_HVM) {
- hvm_ents = libxl__calloc(gc, 3, sizeof(char *));
- hvm_ents[0] = "hvmloader/generation-id-address";
- hvm_ents[1] = GCSPRINTF("0x%lx", state->vm_generationid_addr);
- }
-
dom_path = libxl__xs_get_dompath(gc, domid);
if (!dom_path) {
return ERROR_FAIL;
@@ -351,9 +343,6 @@ retry_transaction:
t = xs_transaction_start(ctx->xsh);
libxl__xs_writev(gc, t, dom_path, ents);
- if (info->type == LIBXL_DOMAIN_TYPE_HVM)
- libxl__xs_writev(gc, t, dom_path, hvm_ents);
-
libxl__xs_writev(gc, t, dom_path, local_ents);
libxl__xs_writev(gc, t, vm_path, vms_ents);
@@ -1506,7 +1495,6 @@ void libxl__domain_suspend(libxl__egc *egc, libxl__domain_suspend_state *dss)
STATE_AO_GC(dss->ao);
int port;
int rc = ERROR_FAIL;
- unsigned long vm_generationid_addr;
/* Convenience aliases */
const uint32_t domid = dss->domid;
@@ -1525,19 +1513,10 @@ void libxl__domain_suspend(libxl__egc *egc, libxl__domain_suspend_state *dss)
switch (type) {
case LIBXL_DOMAIN_TYPE_HVM: {
- char *path;
- char *addr;
-
- path = GCSPRINTF("%s/hvmloader/generation-id-address",
- libxl__xs_get_dompath(gc, domid));
- addr = libxl__xs_read(gc, XBT_NULL, path);
-
- vm_generationid_addr = (addr) ? strtoul(addr, NULL, 0) : 0;
dss->hvm = 1;
break;
}
case LIBXL_DOMAIN_TYPE_PV:
- vm_generationid_addr = 0;
dss->hvm = 0;
break;
default:
@@ -1584,7 +1563,7 @@ void libxl__domain_suspend(libxl__egc *egc, libxl__domain_suspend_state *dss)
callbacks->switch_qemu_logdirty = libxl__domain_suspend_common_switch_qemu_logdirty;
dss->shs.callbacks.save.toolstack_save = libxl__toolstack_save;
- libxl__xc_domain_save(egc, dss, vm_generationid_addr);
+ libxl__xc_domain_save(egc, dss);
return;
out:
diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index a9343e8..d4f32a9 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -960,8 +960,6 @@ typedef struct {
uint32_t console_domid;
unsigned long console_mfn;
- unsigned long vm_generationid_addr;
-
char *saved_state;
libxl__file_reference pv_kernel;
@@ -2791,8 +2789,7 @@ _hidden void libxl__domain_suspend(libxl__egc *egc,
/* calls libxl__xc_domain_suspend_done when done */
-_hidden void libxl__xc_domain_save(libxl__egc*, libxl__domain_suspend_state*,
- unsigned long vm_generationid_addr);
+_hidden void libxl__xc_domain_save(libxl__egc*, libxl__domain_suspend_state*);
/* If rc==0 then retval is the return value from xc_domain_save
* and errnoval is the errno value it provided.
* If rc!=0, retval and errnoval are undefined. */
@@ -2816,8 +2813,7 @@ _hidden int libxl__toolstack_save(uint32_t domid, uint8_t **buf,
/* calls libxl__xc_domain_restore_done when done */
_hidden void libxl__xc_domain_restore(libxl__egc *egc,
libxl__domain_create_state *dcs,
- int hvm, int pae, int superpages,
- int no_incr_generationid);
+ int hvm, int pae, int superpages);
/* If rc==0 then retval is the return value from xc_domain_save
* and errnoval is the errno value it provided.
* If rc!=0, retval and errnoval are undefined. */
diff --git a/tools/libxl/libxl_save_callout.c b/tools/libxl/libxl_save_callout.c
index c35da4d..1c9f806 100644
--- a/tools/libxl/libxl_save_callout.c
+++ b/tools/libxl/libxl_save_callout.c
@@ -41,8 +41,7 @@ static void helper_done(libxl__egc *egc, libxl__save_helper_state *shs);
/*----- entrypoints -----*/
void libxl__xc_domain_restore(libxl__egc *egc, libxl__domain_create_state *dcs,
- int hvm, int pae, int superpages,
- int no_incr_generationid)
+ int hvm, int pae, int superpages)
{
STATE_AO_GC(dcs->ao);
@@ -59,7 +58,7 @@ void libxl__xc_domain_restore(libxl__egc *egc, libxl__domain_create_state *dcs,
state->store_port,
state->store_domid, state->console_port,
state->console_domid,
- hvm, pae, superpages, no_incr_generationid,
+ hvm, pae, superpages,
cbflags, dcs->checkpointed_stream,
};
@@ -75,8 +74,7 @@ void libxl__xc_domain_restore(libxl__egc *egc, libxl__domain_create_state *dcs,
argnums, ARRAY_SIZE(argnums));
}
-void libxl__xc_domain_save(libxl__egc *egc, libxl__domain_suspend_state *dss,
- unsigned long vm_generationid_addr)
+void libxl__xc_domain_save(libxl__egc *egc, libxl__domain_suspend_state *dss)
{
STATE_AO_GC(dss->ao);
int r, rc, toolstack_data_fd = -1;
@@ -112,7 +110,7 @@ void libxl__xc_domain_save(libxl__egc *egc, libxl__domain_suspend_state *dss,
}
const unsigned long argnums[] = {
- dss->domid, 0, 0, dss->xcflags, dss->hvm, vm_generationid_addr,
+ dss->domid, 0, 0, dss->xcflags, dss->hvm,
toolstack_data_fd, toolstack_data_len,
cbflags,
};
diff --git a/tools/libxl/libxl_save_helper.c b/tools/libxl/libxl_save_helper.c
index b259bd0..c760dd3 100644
--- a/tools/libxl/libxl_save_helper.c
+++ b/tools/libxl/libxl_save_helper.c
@@ -211,7 +211,6 @@ int main(int argc, char **argv)
uint32_t max_factor = strtoul(NEXTARG,0,10);
uint32_t flags = strtoul(NEXTARG,0,10);
int hvm = atoi(NEXTARG);
- unsigned long genidad = strtoul(NEXTARG,0,10);
toolstack_save_fd = atoi(NEXTARG);
toolstack_save_len = strtoul(NEXTARG,0,10);
unsigned cbflags = strtoul(NEXTARG,0,10);
@@ -224,7 +223,7 @@ int main(int argc, char **argv)
startup("save");
r = xc_domain_save(xch, io_fd, dom, max_iters, max_factor, flags,
- &helper_save_callbacks, hvm, genidad);
+ &helper_save_callbacks, hvm);
complete(r);
} else if (!strcmp(mode,"--restore-domain")) {
@@ -238,7 +237,6 @@ int main(int argc, char **argv)
unsigned int hvm = strtoul(NEXTARG,0,10);
unsigned int pae = strtoul(NEXTARG,0,10);
int superpages = strtoul(NEXTARG,0,10);
- int no_incr_genidad = strtoul(NEXTARG,0,10);
unsigned cbflags = strtoul(NEXTARG,0,10);
int checkpointed = strtoul(NEXTARG,0,10);
assert(!*++argv);
@@ -247,15 +245,14 @@ int main(int argc, char **argv)
unsigned long store_mfn = 0;
unsigned long console_mfn = 0;
- unsigned long genidad = 0;
startup("restore");
r = xc_domain_restore(xch, io_fd, dom, store_evtchn, &store_mfn,
store_domid, console_evtchn, &console_mfn,
console_domid, hvm, pae, superpages,
- no_incr_genidad, checkpointed, &genidad,
+ checkpointed,
&helper_restore_callbacks);
- helper_stub_restore_results(store_mfn,console_mfn,genidad,0);
+ helper_stub_restore_results(store_mfn,console_mfn,0);
complete(r);
} else {
diff --git a/tools/libxl/libxl_save_msgs_gen.pl b/tools/libxl/libxl_save_msgs_gen.pl
index 745e2ac..88f4921 100755
--- a/tools/libxl/libxl_save_msgs_gen.pl
+++ b/tools/libxl/libxl_save_msgs_gen.pl
@@ -32,8 +32,7 @@ our @msgs = (
[ 7, 'rcxW', "toolstack_restore", [qw(uint32_t domid
BLOCK tsdata)] ],
[ 8, 'r', "restore_results", ['unsigned long', 'store_mfn',
- 'unsigned long', 'console_mfn',
- 'unsigned long', 'genidad'] ],
+ 'unsigned long', 'console_mfn'] ],
[ 9, 'srW', "complete", [qw(int retval
int errnoval)] ],
);
--
1.7.10.4
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 6/8] libxl: allow a generation ID to be specified at domain creation
2014-06-18 16:12 [PATCHv6 0/8] tools: rework VM Generation ID David Vrabel
` (4 preceding siblings ...)
2014-06-18 16:12 ` [PATCH 5/8] libxc, libxl, hvmloader: strip out outdated VM generation ID implementation David Vrabel
@ 2014-06-18 16:12 ` David Vrabel
2014-06-27 11:16 ` Ian Campbell
2014-06-27 12:51 ` Ian Campbell
2014-06-18 16:12 ` [PATCH 7/8] xl: generate a new random VM generation ID if requested David Vrabel
` (2 subsequent siblings)
8 siblings, 2 replies; 20+ messages in thread
From: David Vrabel @ 2014-06-18 16:12 UTC (permalink / raw)
To: xen-devel; +Cc: David Vrabel, Ian Jackson, Ian Campbell, Stefano Stabellini
Toolstacks may specify a VM generation ID using the u.hvm.ms_vm_genid
field in the libxl_domain_build_info structure, when creating a
domain.
The toolstack is responsible for providing the correct generation ID
according to the Microsoft specification (e.g., generating new random
ones with libxl_ms_vm_genid_generate() as appropriate when restoring).
Although the specification requires that a ACPI Notify event is raised
if the generation ID is changed, the generation ID is never changed
when the domain is in a state to receive such an event (it's either
newly created or suspended).
Signed-off-by: David Vrabel <david.vrabel@citrix.com>
---
tools/libxl/Makefile | 1 +
tools/libxl/gentest.py | 2 +-
tools/libxl/libxl.h | 13 +++++
tools/libxl/libxl_dom.c | 10 ++++
tools/libxl/libxl_genid.c | 111 ++++++++++++++++++++++++++++++++++++++++++
tools/libxl/libxl_internal.h | 6 +++
tools/libxl/libxl_json.c | 39 +++++++++++++++
tools/libxl/libxl_json.h | 1 +
tools/libxl/libxl_types.idl | 3 ++
9 files changed, 185 insertions(+), 1 deletion(-)
create mode 100644 tools/libxl/libxl_genid.c
diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile
index 4cfa275..6499aa7 100644
--- a/tools/libxl/Makefile
+++ b/tools/libxl/Makefile
@@ -77,6 +77,7 @@ LIBXL_OBJS = flexarray.o libxl.o libxl_create.o libxl_dm.o libxl_pci.o \
libxl_json.o libxl_aoutils.o libxl_numa.o \
libxl_save_callout.o _libxl_save_msgs_callout.o \
libxl_qmp.o libxl_event.o libxl_fork.o $(LIBXL_OBJS-y)
+LIBXL_OBJS += libxl_genid.o
LIBXL_OBJS += _libxl_types.o libxl_flask.o _libxl_types_internal.o
LIBXL_TESTS += timedereg
diff --git a/tools/libxl/gentest.py b/tools/libxl/gentest.py
index eb9a21b..0195bf4 100644
--- a/tools/libxl/gentest.py
+++ b/tools/libxl/gentest.py
@@ -60,7 +60,7 @@ def gen_rand_init(ty, v, indent = " ", parent = None):
s += "%s(%s);\n" % (ty.rand_init,
ty.pass_arg(v, isref=parent is None,
passby=idl.PASS_BY_REFERENCE))
- elif ty.typename in ["libxl_uuid", "libxl_mac", "libxl_hwcap"]:
+ elif ty.typename in ["libxl_uuid", "libxl_mac", "libxl_hwcap", "libxl_ms_vm_genid"]:
s += "rand_bytes((uint8_t *)%s, sizeof(*%s));\n" % (v,v)
elif ty.typename in ["libxl_domid", "libxl_devid"] or isinstance(ty, idl.Number):
s += "%s = rand() %% (sizeof(%s)*8);\n" % \
diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
index 17b8a7b..0fc6170 100644
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -104,6 +104,11 @@
#define LIBXL_HAVE_BUILDINFO_EVENT_CHANNELS 1
/*
+ * libxl_domain_build_info has the u.hvm.ms_vm_genid field.
+ */
+#define LIBXL_HAVE_BUILDINFO_HVM_MS_VM_GENID 1
+
+/*
* LIBXL_HAVE_DEVICE_DISK_DIRECT_IO_SAFE indicates that a
* 'direct_io_safe' field (of boolean type) is present in
* libxl_device_disk.
@@ -579,6 +584,11 @@ typedef struct libxl__ctx libxl_ctx;
#define LIBXL_TIMER_MODE_DEFAULT -1
#define LIBXL_MEMKB_DEFAULT ~0ULL
+#define LIBXL_MS_VM_GENID_LEN 16
+typedef struct {
+ uint8_t bytes[LIBXL_MS_VM_GENID_LEN];
+} libxl_ms_vm_genid;
+
#include "_libxl_types.h"
const libxl_version_info* libxl_get_version_info(libxl_ctx *ctx);
@@ -1189,6 +1199,9 @@ int libxl_flask_getenforce(libxl_ctx *ctx);
int libxl_flask_setenforce(libxl_ctx *ctx, int mode);
int libxl_flask_loadpolicy(libxl_ctx *ctx, void *policy, uint32_t size);
+int libxl_ms_vm_genid_generate(libxl_ctx *ctx, libxl_ms_vm_genid *id);
+bool libxl_ms_vm_genid_is_zero(const libxl_ms_vm_genid *id);
+
/* misc */
/* Each of these sets or clears the flag according to whether the
diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c
index a63c31c..b94364f 100644
--- a/tools/libxl/libxl_dom.c
+++ b/tools/libxl/libxl_dom.c
@@ -314,6 +314,16 @@ int libxl__build_post(libxl__gc *gc, uint32_t domid,
if (info->cpuid != NULL)
libxl_cpuid_set(ctx, domid, info->cpuid);
+ if (info->type == LIBXL_DOMAIN_TYPE_HVM
+ && !libxl_ms_vm_genid_is_zero(&info->u.hvm.ms_vm_genid)) {
+ rc = libxl__ms_vm_genid_set(gc, domid,
+ &info->u.hvm.ms_vm_genid);
+ if (rc) {
+ LOG(ERROR, "Failed to set VM Generation ID");
+ return rc;
+ }
+ }
+
ents = libxl__calloc(gc, 12 + (info->max_vcpus * 2) + 2, sizeof(char *));
ents[0] = "memory/static-max";
ents[1] = GCSPRINTF("%"PRId64, info->max_memkb);
diff --git a/tools/libxl/libxl_genid.c b/tools/libxl/libxl_genid.c
new file mode 100644
index 0000000..9853fa6
--- /dev/null
+++ b/tools/libxl/libxl_genid.c
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2014 Citrix Systems R&D Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; version 2.1 only. with the special
+ * exception on linking described in file LICENSE.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ */
+
+#include "libxl_osdeps.h" /* must come before any other headers */
+
+#include "libxl_internal.h"
+
+#include <xenctrl.h>
+#include <xen/hvm/params.h>
+
+/*
+ * Generate a random VM generation ID.
+ *
+ * Returns ERROR_FAIL if a suitable source of random numbers is not
+ * available.
+ *
+ * See Microsoft's "Virtual Machine Generation ID" specification for
+ * further details, including when a new generation ID is required.
+ *
+ * http://www.microsoft.com/en-us/download/details.aspx?id=30707
+ */
+int libxl_ms_vm_genid_generate(libxl_ctx *ctx, libxl_ms_vm_genid *id)
+{
+ GC_INIT(ctx);
+ int ret;
+
+ ret = libxl__random_bytes(gc, id->bytes, LIBXL_MS_VM_GENID_LEN);
+
+ GC_FREE;
+ return ret;
+}
+
+/*
+ * Is this VM generation ID all zeros?
+ */
+bool libxl_ms_vm_genid_is_zero(const libxl_ms_vm_genid *id)
+{
+ static const libxl_ms_vm_genid zero;
+
+ return memcmp(id->bytes, zero.bytes, LIBXL_MS_VM_GENID_LEN) == 0;
+}
+
+int libxl__ms_vm_genid_set(libxl__gc *gc, uint32_t domid,
+ const libxl_ms_vm_genid *id)
+{
+ libxl_ctx *ctx = libxl__gc_owner(gc);
+ const char *dom_path;
+ uint64_t genid[2];
+ uint64_t paddr = 0;
+ int rc;
+
+ memcpy(genid, id->bytes, LIBXL_MS_VM_GENID_LEN);
+
+ /*
+ * Set the "platform/generation-id" XenStore key to pass the ID to
+ * hvmloader.
+ */
+ dom_path = libxl__xs_get_dompath(gc, domid);
+ if (!dom_path) {
+ rc = ERROR_FAIL;
+ goto out;
+ }
+ rc = libxl__xs_write(gc, XBT_NULL,
+ GCSPRINTF("%s/platform/generation-id", dom_path),
+ "%"PRIu64 ":%" PRIu64, genid[0], genid[1]);
+ if (rc < 0)
+ goto out;
+
+ /*
+ * Update the ID in guest memory (if available).
+ */
+ xc_hvm_param_get(ctx->xch, domid, HVM_PARAM_VM_GENERATION_ID_ADDR, &paddr);
+ if (paddr) {
+ void *vaddr;
+
+ vaddr = xc_map_foreign_range(ctx->xch, domid, XC_PAGE_SIZE,
+ PROT_READ | PROT_WRITE,
+ paddr >> XC_PAGE_SHIFT);
+ if (vaddr == NULL) {
+ rc = ERROR_FAIL;
+ goto out;
+ }
+ memcpy(vaddr + (paddr & ~XC_PAGE_MASK), genid, 2 * sizeof(*genid));
+ munmap(vaddr, XC_PAGE_SIZE);
+
+ /*
+ * The spec requires an ACPI Notify event is injected into the
+ * guest when the generation ID is changed.
+ *
+ * This is only called for domains that are suspended or newly
+ * created and they won't be in a state to receive such an
+ * event.
+ */
+ }
+
+ rc = 0;
+
+ out:
+ return rc;
+}
diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index d4f32a9..2eea557 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -3086,6 +3086,10 @@ void libxl__numa_candidate_put_nodemap(libxl__gc *gc,
libxl_bitmap_copy(CTX, &cndt->nodemap, nodemap);
}
+_hidden int libxl__ms_vm_genid_set(libxl__gc *gc, uint32_t domid,
+ const libxl_ms_vm_genid *id);
+
+
/* Som handy macros for defbool type. */
#define LIBXL__DEFBOOL_DEFAULT (0)
#define LIBXL__DEFBOOL_FALSE (-1)
@@ -3163,6 +3167,8 @@ int libxl_key_value_list_parse_json(libxl__gc *gc,
libxl_key_value_list *p);
int libxl_hwcap_parse_json(libxl__gc *gc, const libxl__json_object *o,
libxl_hwcap *p);
+int libxl_ms_vm_genid_parse_json(libxl__gc *gc, const libxl__json_object *o,
+ libxl_ms_vm_genid *p);
int libxl__int_parse_json(libxl__gc *gc, const libxl__json_object *o,
void *p);
int libxl__uint8_parse_json(libxl__gc *gc, const libxl__json_object *o,
diff --git a/tools/libxl/libxl_json.c b/tools/libxl/libxl_json.c
index fb9baf8..63125dc 100644
--- a/tools/libxl/libxl_json.c
+++ b/tools/libxl/libxl_json.c
@@ -377,6 +377,45 @@ int libxl_hwcap_parse_json(libxl__gc *gc, const libxl__json_object *o,
return 0;
}
+yajl_gen_status libxl_ms_vm_genid_gen_json(yajl_gen hand, libxl_ms_vm_genid *p)
+{
+ yajl_gen_status s;
+ int i;
+
+ s = yajl_gen_array_open(hand);
+ if (s != yajl_gen_status_ok)
+ return s;
+
+ for (i = 0; i < LIBXL_MS_VM_GENID_LEN; i++) {
+ s = yajl_gen_integer(hand, p->bytes[i]);
+ if (s != yajl_gen_status_ok)
+ return s;
+ }
+
+ return yajl_gen_array_close(hand);
+}
+
+int libxl_ms_vm_genid_parse_json(libxl__gc *gc, const libxl__json_object *o,
+ libxl_ms_vm_genid *p)
+{
+ unsigned int i;
+
+ if (!libxl__json_object_is_array(o))
+ return ERROR_FAIL;
+
+ for (i = 0; i < LIBXL_MS_VM_GENID_LEN; i++) {
+ const libxl__json_object *t;
+
+ t = libxl__json_array_get(o, i);
+ if (!t || !libxl__json_object_is_integer(t))
+ return ERROR_FAIL;
+
+ p->bytes[i] = libxl__json_object_get_integer(t);
+ }
+
+ return 0;
+}
+
yajl_gen_status libxl__string_gen_json(yajl_gen hand,
const char *p)
{
diff --git a/tools/libxl/libxl_json.h b/tools/libxl/libxl_json.h
index e4c0f6c..af26e78 100644
--- a/tools/libxl/libxl_json.h
+++ b/tools/libxl/libxl_json.h
@@ -33,6 +33,7 @@ yajl_gen_status libxl_string_list_gen_json(yajl_gen hand, libxl_string_list *p);
yajl_gen_status libxl_key_value_list_gen_json(yajl_gen hand,
libxl_key_value_list *p);
yajl_gen_status libxl_hwcap_gen_json(yajl_gen hand, libxl_hwcap *p);
+yajl_gen_status libxl_ms_vm_genid_gen_json(yajl_gen hand, libxl_ms_vm_genid *p);
#include <_libxl_types_json.h>
diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
index f0f6e34..630698d 100644
--- a/tools/libxl/libxl_types.idl
+++ b/tools/libxl/libxl_types.idl
@@ -17,6 +17,7 @@ libxl_cpuid_policy_list = Builtin("cpuid_policy_list", dispose_fn="libxl_cpuid_d
libxl_string_list = Builtin("string_list", dispose_fn="libxl_string_list_dispose", passby=PASS_BY_REFERENCE)
libxl_key_value_list = Builtin("key_value_list", dispose_fn="libxl_key_value_list_dispose", passby=PASS_BY_REFERENCE)
libxl_hwcap = Builtin("hwcap", passby=PASS_BY_REFERENCE)
+libxl_ms_vm_genid = Builtin("ms_vm_genid", passby=PASS_BY_REFERENCE)
#
# Specific integer types
@@ -371,6 +372,8 @@ libxl_domain_build_info = Struct("domain_build_info",[
("xen_platform_pci", libxl_defbool),
("usbdevice_list", libxl_string_list),
("vendor_device", libxl_vendor_device),
+ # See libxl_ms_vm_genid_generate()
+ ("ms_vm_genid", libxl_ms_vm_genid),
])),
("pv", Struct(None, [("kernel", string),
("slack_memkb", MemKB),
--
1.7.10.4
^ permalink raw reply related [flat|nested] 20+ messages in thread