diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2010-04-22 09:39:17 +0100 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2010-04-22 09:39:17 +0100 |
commit | 63e8bcc364fa780d31bb272c383edf83c28aec72 (patch) | |
tree | 2213aba400c8772642a065f696a5124509f56fdb | |
parent | 419794de6896184846b0f2dce5f53f7128b7ea68 (diff) | |
download | xen-63e8bcc364fa780d31bb272c383edf83c28aec72.tar.gz xen-63e8bcc364fa780d31bb272c383edf83c28aec72.tar.bz2 xen-63e8bcc364fa780d31bb272c383edf83c28aec72.zip |
libxl: add version_info function
Xen provides a xen_version hypercall to query the values of several
interesting things (like hypervisor version, commandline used, actual
changeset, etc.). Create a user-friendly and efficient wrapper around
the libxc function to provide values for xl info output.
Since the information is static during the whole runtime, we store
it within the libxl_ctx structure and just deliver the pointer on
subsequent calls.
Signed-off-by: Andre Przywara <andre.przywara@amd.com>
Acked-by: Vincent Hanquez <vincent.hanquez@eu.citrix.com>
-rw-r--r-- | tools/libxl/libxl.c | 46 | ||||
-rw-r--r-- | tools/libxl/libxl.h | 18 |
2 files changed, 64 insertions, 0 deletions
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 3db4249a34..7cb3a1caeb 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -45,6 +45,7 @@ int libxl_ctx_init(struct libxl_ctx *ctx, int version) ctx->alloc_ptrs = calloc(ctx->alloc_maxsize, sizeof(void *)); if (!ctx->alloc_ptrs) return ERROR_NOMEM; + memset(&ctx->version_info, 0, sizeof(libxl_version_info)); ctx->xch = xc_interface_open(); if (ctx->xch == -1) { @@ -2351,6 +2352,51 @@ int libxl_get_physinfo(struct libxl_ctx *ctx, struct libxl_physinfo *physinfo) return 0; } +const libxl_version_info* libxl_get_version_info(struct libxl_ctx *ctx) +{ + union { + xen_extraversion_t xen_extra; + xen_compile_info_t xen_cc; + xen_changeset_info_t xen_chgset; + xen_capabilities_info_t xen_caps; + xen_platform_parameters_t p_parms; + xen_commandline_t xen_commandline; + } u; + long xen_version; + libxl_version_info *info = &ctx->version_info; + + if (info->xen_version_extra != NULL) + return info; + + xen_version = xc_version(ctx->xch, XENVER_version, NULL); + info->xen_version_major = xen_version >> 16; + info->xen_version_minor = xen_version & 0xFF; + xc_version(ctx->xch, XENVER_extraversion, &u.xen_extra); + info->xen_version_extra = libxl_sprintf(ctx, "%s", u.xen_extra); + + xc_version(ctx->xch, XENVER_compile_info, &u.xen_cc); + info->compiler = libxl_sprintf(ctx, "%s", u.xen_cc.compiler); + info->compile_by = libxl_sprintf(ctx, "%s", u.xen_cc.compile_by); + info->compile_domain = libxl_sprintf(ctx, "%s", u.xen_cc.compile_domain); + info->compile_date = libxl_sprintf(ctx, "%s", u.xen_cc.compile_date); + + xc_version(ctx->xch, XENVER_capabilities, &u.xen_caps); + info->capabilities = libxl_sprintf(ctx, "%s", u.xen_caps); + + xc_version(ctx->xch, XENVER_changeset, &u.xen_chgset); + info->changeset = libxl_sprintf(ctx, "%s", u.xen_chgset); + + xc_version(ctx->xch, XENVER_platform_parameters, &u.p_parms); + info->virt_start = u.p_parms.virt_start; + + info->pagesize = xc_version(ctx->xch, XENVER_pagesize, NULL); + + xc_version(ctx->xch, XENVER_commandline, &u.xen_commandline); + info->commandline = libxl_sprintf(ctx, "%s", u.xen_commandline); + + return info; +} + struct libxl_vcpuinfo *libxl_list_vcpu(struct libxl_ctx *ctx, uint32_t domid, int *nb_vcpu, int *cpusize) { diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index b079613112..0d3b767e65 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -41,6 +41,21 @@ struct libxl_vminfo { uint32_t domid; }; +typedef struct { + int xen_version_major; + int xen_version_minor; + char *xen_version_extra; + char *compiler; + char *compile_by; + char *compile_domain; + char *compile_date; + char *capabilities; + char *changeset; + unsigned long virt_start; + unsigned long pagesize; + char *commandline; +} libxl_version_info; + struct libxl_ctx { int xch; struct xs_handle *xsh; @@ -56,8 +71,11 @@ struct libxl_ctx { * set this after libxl_init and before any other call - or * may leave them untouched */ int (*waitpid_instead)(pid_t pid, int *status, int flags); + libxl_version_info version_info; }; +const libxl_version_info* libxl_get_version_info(struct libxl_ctx *ctx); + typedef struct { bool hvm; bool hap; |