aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/libxc/xc_ia64_stubs.c2
-rw-r--r--tools/libxc/xc_linux_save.c22
-rw-r--r--tools/libxc/xenguest.h4
-rw-r--r--tools/xcutils/xc_save.c20
4 files changed, 31 insertions, 17 deletions
diff --git a/tools/libxc/xc_ia64_stubs.c b/tools/libxc/xc_ia64_stubs.c
index 2a25802c3b..2936415be0 100644
--- a/tools/libxc/xc_ia64_stubs.c
+++ b/tools/libxc/xc_ia64_stubs.c
@@ -23,7 +23,7 @@ unsigned long xc_ia64_fpsr_default(void)
}
int xc_linux_save(int xc_handle, int io_fd, uint32_t dom, uint32_t max_iters,
- uint32_t max_factor, uint32_t flags)
+ uint32_t max_factor, uint32_t flags, int (*suspend)(void))
{
PERROR("xc_linux_save not implemented\n");
return -1;
diff --git a/tools/libxc/xc_linux_save.c b/tools/libxc/xc_linux_save.c
index b619bdf7b4..927cc6cbd5 100644
--- a/tools/libxc/xc_linux_save.c
+++ b/tools/libxc/xc_linux_save.c
@@ -357,21 +357,14 @@ static int analysis_phase(int xc_handle, uint32_t domid, int max_pfn,
}
-static int suspend_and_state(int xc_handle, int io_fd, int dom,
- xc_dominfo_t *info,
+static int suspend_and_state(int (*suspend)(int), int xc_handle, int io_fd,
+ int dom, xc_dominfo_t *info,
vcpu_guest_context_t *ctxt)
{
int i = 0;
- char ans[30];
- printf("suspend\n");
- fflush(stdout);
- if (fgets(ans, sizeof(ans), stdin) == NULL) {
- ERR("failed reading suspend reply");
- return -1;
- }
- if (strncmp(ans, "done\n", 5)) {
- ERR("suspend reply incorrect: %s", ans);
+ if (!(*suspend)(dom)) {
+ ERR("Suspend request failed");
return -1;
}
@@ -568,7 +561,7 @@ static unsigned long *xc_map_m2p(int xc_handle,
int xc_linux_save(int xc_handle, int io_fd, uint32_t dom, uint32_t max_iters,
- uint32_t max_factor, uint32_t flags)
+ uint32_t max_factor, uint32_t flags, int (*suspend)(int))
{
xc_dominfo_t info;
@@ -748,7 +741,7 @@ int xc_linux_save(int xc_handle, int io_fd, uint32_t dom, uint32_t max_iters,
last_iter = 1;
- if (suspend_and_state( xc_handle, io_fd, dom, &info, &ctxt)) {
+ if (suspend_and_state(suspend, xc_handle, io_fd, dom, &info, &ctxt)) {
ERR("Domain appears not to have suspended");
goto out;
}
@@ -1054,7 +1047,8 @@ int xc_linux_save(int xc_handle, int io_fd, uint32_t dom, uint32_t max_iters,
DPRINTF("Start last iteration\n");
last_iter = 1;
- if (suspend_and_state(xc_handle, io_fd, dom, &info, &ctxt)) {
+ if (suspend_and_state(suspend, xc_handle, io_fd, dom, &info,
+ &ctxt)) {
ERR("Domain appears not to have suspended");
goto out;
}
diff --git a/tools/libxc/xenguest.h b/tools/libxc/xenguest.h
index dcd9b6972e..c0eb5bcdd3 100644
--- a/tools/libxc/xenguest.h
+++ b/tools/libxc/xenguest.h
@@ -22,7 +22,9 @@
* @return 0 on success, -1 on failure
*/
int xc_linux_save(int xc_handle, int fd, uint32_t dom, uint32_t max_iters,
- uint32_t max_factor, uint32_t flags /* XCFLAGS_xxx */);
+ uint32_t max_factor, uint32_t flags /* XCFLAGS_xxx */,
+ int (*suspend)(int));
+
/**
* This function will restore a saved domain running Linux.
diff --git a/tools/xcutils/xc_save.c b/tools/xcutils/xc_save.c
index eac8d1ad2b..44c4701379 100644
--- a/tools/xcutils/xc_save.c
+++ b/tools/xcutils/xc_save.c
@@ -10,10 +10,28 @@
#include <err.h>
#include <stdlib.h>
#include <stdint.h>
+#include <string.h>
#include <stdio.h>
#include <xenguest.h>
+
+/**
+ * Issue a suspend request through stdout, and receive the acknowledgement
+ * from stdin. This is handled by XendCheckpoint in the Python layer.
+ */
+static int suspend(int domid)
+{
+ char ans[30];
+
+ printf("suspend\n");
+ fflush(stdout);
+
+ return (fgets(ans, sizeof(ans), stdin) != NULL &&
+ !strncmp(ans, "done\n", 5));
+}
+
+
int
main(int argc, char **argv)
{
@@ -29,5 +47,5 @@ main(int argc, char **argv)
max_f = atoi(argv[5]);
flags = atoi(argv[6]);
- return xc_linux_save(xc_fd, io_fd, domid, maxit, max_f, flags);
+ return xc_linux_save(xc_fd, io_fd, domid, maxit, max_f, flags, &suspend);
}