[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH v2 2/2] tools: add new xl command get-hypervisor-config



Add   new subcommand "get-hypervisor-config" to xl config to print the
hypervisor .config file.

To be able to reuse already existing decompressing code in libxenguest
xc_inflate_buffer() has to be moved to libxenguest.h.

Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
---
V2:
- rename subcommand to get-hypervisor-config (Wei Liu)
- use goto style error handling (Wei Liu)
---
 docs/man/xl.1.pod.in           |  5 +++++
 tools/libxc/include/xenctrl.h  |  8 ++++++++
 tools/libxc/include/xenguest.h | 13 +++++++++++++
 tools/libxc/xc_misc.c          | 42 ++++++++++++++++++++++++++++++++++++++++++
 tools/libxc/xg_private.h       |  4 ----
 tools/libxl/libxl.c            | 34 ++++++++++++++++++++++++++++++++++
 tools/libxl/libxl.h            |  8 ++++++++
 tools/xl/xl.h                  |  1 +
 tools/xl/xl_cmdtable.c         |  5 +++++
 tools/xl/xl_misc.c             | 20 ++++++++++++++++++++
 10 files changed, 136 insertions(+), 4 deletions(-)

diff --git a/docs/man/xl.1.pod.in b/docs/man/xl.1.pod.in
index 4310fcd818..9d20958e91 100644
--- a/docs/man/xl.1.pod.in
+++ b/docs/man/xl.1.pod.in
@@ -844,6 +844,11 @@ Clears Xen's message buffer.
 
 =back
 
+=item B<get-hypervisor-config>
+
+Print the software configuration file (.config) used to build the
+hypervisor.
+
 =item B<info> [I<OPTIONS>]
 
 Print information about the Xen host in I<name : value> format.  When
diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h
index a3628e56bb..c6a203e1a4 100644
--- a/tools/libxc/include/xenctrl.h
+++ b/tools/libxc/include/xenctrl.h
@@ -2632,6 +2632,14 @@ int xc_livepatch_replace(xc_interface *xch, char *name, 
uint32_t timeout);
 int xc_domain_cacheflush(xc_interface *xch, uint32_t domid,
                          xen_pfn_t start_pfn, xen_pfn_t nr_pfns);
 
+/*
+ * Get gzip-ed .config from hypervisor.
+ * *buffer must be free()-ed by caller.
+ * data size is returned in `size`.
+ * Returns 0 on success.
+ */
+int xc_get_config(xc_interface *xch, char **buffer, unsigned long *size);
+
 /* Compat shims */
 #include "xenctrl_compat.h"
 
diff --git a/tools/libxc/include/xenguest.h b/tools/libxc/include/xenguest.h
index b4b2e19619..76e87ea97c 100644
--- a/tools/libxc/include/xenguest.h
+++ b/tools/libxc/include/xenguest.h
@@ -310,4 +310,17 @@ xen_pfn_t *xc_map_m2p(xc_interface *xch,
                       unsigned long max_mfn,
                       int prot,
                       unsigned long *mfn0);
+
+/**
+ * Decompress a gzip-ed stream.
+ * @parm xch a handle to an open hypervisor interface
+ * @parm in_buf buffer holding the gzip-ed data
+ * @parm in_size size in bytes of the gzip-ed data
+ * @parm out_size where to store the gunzip-ed data length
+ * @return new allocated buffer holding the gunzip-ed data
+ */
+char *xc_inflate_buffer(xc_interface *xch,
+                        const char *in_buf,
+                        unsigned long in_size,
+                        unsigned long *out_size);
 #endif /* XENGUEST_H */
diff --git a/tools/libxc/xc_misc.c b/tools/libxc/xc_misc.c
index 5e6714ae2b..83d259e46e 100644
--- a/tools/libxc/xc_misc.c
+++ b/tools/libxc/xc_misc.c
@@ -888,6 +888,48 @@ int xc_livepatch_replace(xc_interface *xch, char *name, 
uint32_t timeout)
     return _xc_livepatch_action(xch, name, LIVEPATCH_ACTION_REPLACE, timeout);
 }
 
+int xc_get_config(xc_interface *xch, char **buffer, unsigned long *size)
+{
+    int rc;
+    DECLARE_SYSCTL;
+    DECLARE_HYPERCALL_BUFFER(char, buf);
+
+    sysctl.cmd = XEN_SYSCTL_get_config;
+    sysctl.u.get_config.size = 0;
+    set_xen_guest_handle(sysctl.u.get_config.buffer, HYPERCALL_BUFFER_NULL);
+    rc = do_sysctl(xch, &sysctl);
+    if ( rc )
+        return rc;
+
+    *size = sysctl.u.get_config.size;
+    buf = xc_hypercall_buffer_alloc(xch, buf, *size);
+    if ( !buf )
+    {
+        errno = ENOMEM;
+        return -1;
+    }
+
+    sysctl.cmd = XEN_SYSCTL_get_config;
+    sysctl.u.get_config.size = *size;
+    set_xen_guest_handle(sysctl.u.get_config.buffer, buf);
+    rc = do_sysctl(xch, &sysctl);
+
+    if ( rc )
+        goto out;
+
+    *buffer = calloc(1, *size);
+    if ( !*buffer )
+    {
+        errno = ENOMEM;
+        goto out;
+    }
+    memmove(*buffer, buf, *size);
+
+out:
+    xc_hypercall_buffer_free(xch, buf);
+    return rc;
+}
+
 /*
  * Local variables:
  * mode: C
diff --git a/tools/libxc/xg_private.h b/tools/libxc/xg_private.h
index f0a4b2c616..ca85e10737 100644
--- a/tools/libxc/xg_private.h
+++ b/tools/libxc/xg_private.h
@@ -43,10 +43,6 @@
 
 char *xc_read_image(xc_interface *xch,
                     const char *filename, unsigned long *size);
-char *xc_inflate_buffer(xc_interface *xch,
-                        const char *in_buf,
-                        unsigned long in_size,
-                        unsigned long *out_size);
 
 unsigned long csum_page (void * page);
 
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index ec71574e99..e363371811 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -669,6 +669,40 @@ int libxl_set_parameters(libxl_ctx *ctx, char *params)
     return 0;
 }
 
+int libxl_get_hypervisor_config(libxl_ctx *ctx, char **buffer)
+{
+    int ret;
+    unsigned long gz_size, out_size;
+    char *gz_buffer;
+    GC_INIT(ctx);
+
+    ret = xc_get_config(ctx->xch, &gz_buffer, &gz_size);
+    if (ret < 0) {
+        LOGEV(ERROR, ret, "getting config");
+        ret = ERROR_FAIL;
+        goto out;
+    }
+
+    *buffer = xc_inflate_buffer(ctx->xch, gz_buffer, gz_size, &out_size);
+
+    free(gz_buffer);
+
+    if (!*buffer) {
+        LOGE(ERROR, "decompressing config data failed");
+        ret = ERROR_FAIL;
+        goto out;
+    }
+
+    *buffer = libxl__realloc(NOGC, *buffer, out_size + 1);
+    (*buffer)[out_size] = 0;
+
+    ret = 0;
+
+out:
+    GC_FREE;
+    return ret;
+}
+
 static int fd_set_flags(libxl_ctx *ctx, int fd,
                         int fcntlgetop, int fcntlsetop, const char *fl,
                         int flagmask, int set_p)
diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
index a38e5cdba2..0d48ac0ae3 100644
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -1149,6 +1149,13 @@ void libxl_mac_copy(libxl_ctx *ctx, libxl_mac *dst, 
const libxl_mac *src);
  */
 #define LIBXL_HAVE_SET_PARAMETERS 1
 
+/*
+ * LIBXL_HAVE_GET_HYPERVISOR_CONFIG
+ *
+ * If this is defined getting hypervisor config is supported.
+ */
+#define LIBXL_HAVE_GET_HYPERVISOR_CONFIG 1
+
 /*
  * LIBXL_HAVE_PV_SHIM
  *
@@ -2307,6 +2314,7 @@ int libxl_send_trigger(libxl_ctx *ctx, uint32_t domid,
 int libxl_send_sysrq(libxl_ctx *ctx, uint32_t domid, char sysrq);
 int libxl_send_debug_keys(libxl_ctx *ctx, char *keys);
 int libxl_set_parameters(libxl_ctx *ctx, char *params);
+int libxl_get_hypervisor_config(libxl_ctx *ctx, char **buffer);
 
 typedef struct libxl__xen_console_reader libxl_xen_console_reader;
 
diff --git a/tools/xl/xl.h b/tools/xl/xl.h
index cf4202bc89..cc537b07b9 100644
--- a/tools/xl/xl.h
+++ b/tools/xl/xl.h
@@ -156,6 +156,7 @@ int main_trigger(int argc, char **argv);
 int main_sysrq(int argc, char **argv);
 int main_debug_keys(int argc, char **argv);
 int main_set_parameters(int argc, char **argv);
+int main_get_hypervisor_config(int argc, char **argv);
 int main_dmesg(int argc, char **argv);
 int main_top(int argc, char **argv);
 int main_networkattach(int argc, char **argv);
diff --git a/tools/xl/xl_cmdtable.c b/tools/xl/xl_cmdtable.c
index 89716badcb..53b1f1f922 100644
--- a/tools/xl/xl_cmdtable.c
+++ b/tools/xl/xl_cmdtable.c
@@ -320,6 +320,11 @@ struct cmd_spec cmd_table[] = {
       "Set hypervisor parameters",
       "<Params>",
     },
+    { "get-hypervisor-config",
+      &main_get_hypervisor_config, 0, 0,
+      "Get hypervisor build config",
+      "",
+    },
     { "dmesg",
       &main_dmesg, 0, 0,
       "Read and/or clear dmesg buffer",
diff --git a/tools/xl/xl_misc.c b/tools/xl/xl_misc.c
index dcf940a6d4..00dd51e935 100644
--- a/tools/xl/xl_misc.c
+++ b/tools/xl/xl_misc.c
@@ -175,6 +175,26 @@ int main_set_parameters(int argc, char **argv)
     return EXIT_SUCCESS;
 }
 
+int main_get_hypervisor_config(int argc, char **argv)
+{
+    int opt;
+    char *conf;
+
+    SWITCH_FOREACH_OPT(opt, "", NULL, "get-hypervisor-config", 0) {
+        /* No options */
+    }
+
+    if (libxl_get_hypervisor_config(ctx, &conf)) {
+        fprintf(stderr, "cannot get config\n");
+        return EXIT_FAILURE;
+    }
+
+    printf("%s\n", conf);
+    free(conf);
+
+    return EXIT_SUCCESS;
+}
+
 int main_devd(int argc, char **argv)
 {
     int ret = 0, opt = 0, daemonize = 1;
-- 
2.16.4


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.