libxl: info: Display build_id of the hypervisor.
authorKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Fri, 15 Jan 2016 02:38:24 +0000 (21:38 -0500)
committerKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Fri, 29 Apr 2016 07:59:20 +0000 (03:59 -0400)
If the hypervisor is built with we will display it.

Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Acked-by: Wei Liu <wei.liu2@citrix.com>
Release-acked-by: Wei Liu <wei.liu2@citrix.com>
tools/libxl/libxl.c
tools/libxl/libxl.h
tools/libxl/libxl_types.idl
tools/libxl/xl_cmdimpl.c

index eec899df5880ac3e71ee9ddfc97f6cf2c891a793..c39d7458abf46e1aa2baef1b82fbb21f4b36b72f 100644 (file)
@@ -5353,6 +5353,38 @@ libxl_numainfo *libxl_get_numainfo(libxl_ctx *ctx, int *nr)
     return ret;
 }
 
+static const int libxl__xc_version_wrap(libxl__gc *gc, libxl_version_info *info,
+                                        xen_build_id_t *build)
+{
+    int r;
+
+    r = xc_version(CTX->xch, XENVER_build_id, build);
+    switch (r) {
+    case -EPERM:
+    case -ENODATA:
+    case 0:
+        info->build_id = libxl__strdup(NOGC, "");
+        break;
+
+    case -ENOBUFS:
+        break;
+
+    default:
+        if (r > 0) {
+            unsigned int i;
+
+            info->build_id = libxl__zalloc(NOGC, (r * 2) + 1);
+
+            for (i = 0; i < r ; i++)
+                snprintf(&info->build_id[i * 2], 3, "%02hhx", build->buf[i]);
+
+            r = 0;
+        }
+        break;
+    }
+    return r;
+}
+
 const libxl_version_info* libxl_get_version_info(libxl_ctx *ctx)
 {
     GC_INIT(ctx);
@@ -5363,8 +5395,10 @@ const libxl_version_info* libxl_get_version_info(libxl_ctx *ctx)
         xen_capabilities_info_t xen_caps;
         xen_platform_parameters_t p_parms;
         xen_commandline_t xen_commandline;
+        xen_build_id_t build_id;
     } u;
     long xen_version;
+    int r;
     libxl_version_info *info = &ctx->version_info;
 
     if (info->xen_version_extra != NULL)
@@ -5397,6 +5431,16 @@ const libxl_version_info* libxl_get_version_info(libxl_ctx *ctx)
     xc_version(ctx->xch, XENVER_commandline, &u.xen_commandline);
     info->commandline = libxl__strdup(NOGC, u.xen_commandline);
 
+    u.build_id.len = sizeof(u) - sizeof(u.build_id);
+    r = libxl__xc_version_wrap(gc, info, &u.build_id);
+    if (r == -ENOBUFS) {
+            xen_build_id_t *build_id;
+
+            build_id = libxl__zalloc(gc, info->pagesize);
+            build_id->len = info->pagesize - sizeof(*build_id);
+            r = libxl__xc_version_wrap(gc, info, build_id);
+            if (r) LOGEV(ERROR, r, "getting build_id");
+    }
  out:
     GC_FREE;
     return info;
index 8ff5f31d4ddc6720ed6569dd1ce5e038464a0980..2c0f868aca63d22dd789a20ec2ac0d87d3214b66 100644 (file)
  */
 #define LIBXL_HAVE_APIC_ASSIST 1
 
+/*
+ * LIBXL_HAVE_BUILD_ID means that libxl_version_info has the extra
+ * field for the hypervisor build_id.
+ */
+#define LIBXL_HAVE_BUILD_ID 1
+
 /*
  * libxl ABI compatibility
  *
index c3161f3faa79f5c6b260cd9e87d1f833c091fd34..9840f3bcd75a082b198fcb9e4f68c05d5d66b7da 100644 (file)
@@ -365,6 +365,7 @@ libxl_version_info = Struct("version_info", [
     ("virt_start",        uint64),
     ("pagesize",          integer),
     ("commandline",       string),
+    ("build_id",          string),
     ], dir=DIR_OUT)
 
 libxl_domain_create_info = Struct("domain_create_info",[
index dfb1b0129d0b0cecebc1fbddae3899d64db51eab..03ab644caef255874042759ab4af8958455c093e 100644 (file)
@@ -5923,6 +5923,7 @@ static void output_xeninfo(void)
     printf("cc_compile_by          : %s\n", info->compile_by);
     printf("cc_compile_domain      : %s\n", info->compile_domain);
     printf("cc_compile_date        : %s\n", info->compile_date);
+    printf("build_id               : %s\n", info->build_id);
 
     return;
 }