From 6b76d296bbfad35e3cea2f6073820e1dc9d8a8e7 Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Sun, 19 Jun 2005 17:05:55 +0000 Subject: bitkeeper revision 1.1718.1.6 (42b5a5f3otSuOxDZ6KTFKrxR1U1m4Q) Extend the xen_version hypercall to return extraversion and compile info. Signed-off-by: Nguyen Anh Quynh Signed-off-by: Keir Fraser --- .rootkeys | 1 + xen/common/kernel.c | 41 +++++++++++++++++++++++++++++++++-------- xen/include/public/version.h | 30 ++++++++++++++++++++++++++++++ xen/include/xen/string.h | 5 +++++ 4 files changed, 69 insertions(+), 8 deletions(-) create mode 100644 xen/include/public/version.h diff --git a/.rootkeys b/.rootkeys index cf29782b84..338b1be862 100644 --- a/.rootkeys +++ b/.rootkeys @@ -1504,6 +1504,7 @@ 4051db79512nOCGweabrFWO2M2h5ng xen/include/public/physdev.h 40589968wmhPmV5-ENbBYmMjnedgKw xen/include/public/sched_ctl.h 404f3d2eR2Owk-ZcGOx9ULGHg3nrww xen/include/public/trace.h +42b5a5f2QC1IxeuwCwwsOEhvcJ2BJg xen/include/public/version.h 4266bd01Ul-pC01ZVvBkhBnv5eqzvw xen/include/public/vmx_assist.h 3ddb79c25UE59iu4JJcbRalx95mvcg xen/include/public/xen.h 3e397e66m2tO3s-J8Jnr7Ws_tGoPTg xen/include/xen/ac_timer.h diff --git a/xen/common/kernel.c b/xen/common/kernel.c index 3acaac8e1b..d63c235248 100644 --- a/xen/common/kernel.c +++ b/xen/common/kernel.c @@ -1,10 +1,7 @@ /****************************************************************************** * kernel.c * - * This file should contain architecture-independent bootstrap and low-level - * help routines. It's a bit x86/PC specific right now! - * - * Copyright (c) 2002-2003 K A Fraser + * Copyright (c) 2002-2005 K A Fraser */ #include @@ -14,6 +11,7 @@ #include #include #include +#include void cmdline_parse(char *cmdline) { @@ -83,11 +81,38 @@ void cmdline_parse(char *cmdline) * Simple hypercalls. */ -long do_xen_version(int cmd) +long do_xen_version(int cmd, void *arg) { - if ( cmd != 0 ) - return -ENOSYS; - return (XEN_VERSION<<16) | (XEN_SUBVERSION); + switch ( cmd ) + { + case XENVER_version: + { + return (XEN_VERSION<<16) | (XEN_SUBVERSION); + } + + case XENVER_extraversion: + { + char extraversion[16]; + safe_strcpy(extraversion, XEN_EXTRAVERSION); + if ( copy_to_user(arg, extraversion, sizeof(extraversion)) ) + return -EFAULT; + return 0; + } + + case XENVER_compile_info: + { + struct xen_compile_info info; + safe_strcpy(info.compiler, XEN_COMPILER); + safe_strcpy(info.compile_by, XEN_COMPILE_BY); + safe_strcpy(info.compile_domain, XEN_COMPILE_DOMAIN); + safe_strcpy(info.compile_date, XEN_COMPILE_DATE); + if ( copy_to_user(arg, &info, sizeof(info)) ) + return -EFAULT; + return 0; + } + } + + return -ENOSYS; } long do_vm_assist(unsigned int cmd, unsigned int type) diff --git a/xen/include/public/version.h b/xen/include/public/version.h new file mode 100644 index 0000000000..1860d061da --- /dev/null +++ b/xen/include/public/version.h @@ -0,0 +1,30 @@ +/****************************************************************************** + * version.h + * + * Xen version, type, and compile information. + * + * Copyright (c) 2005, Nguyen Anh Quynh + * Copyright (c) 2005, Keir Fraser + */ + +#ifndef __XEN_PUBLIC_VERSION_H__ +#define __XEN_PUBLIC_VERSION_H__ + +/* NB. All ops return zero on success, except XENVER_version. */ + +/* arg == NULL; returns major:minor (16:16). */ +#define XENVER_version 0 + +/* arg == 16-char string buffer. */ +#define XENVER_extraversion 1 + +/* arg == xenversion_compile_info_t. */ +#define XENVER_compile_info 2 +typedef struct xen_compile_info { + char compiler[64]; + char compile_by[16]; + char compile_domain[32]; + char compile_date[32]; +} xen_compile_info_t; + +#endif /* __XEN_PUBLIC_VERSION_H__ */ diff --git a/xen/include/xen/string.h b/xen/include/xen/string.h index 384ee2cfce..0c6dd612ad 100644 --- a/xen/include/xen/string.h +++ b/xen/include/xen/string.h @@ -81,4 +81,9 @@ extern void * memchr(const void *,int,__kernel_size_t); } #endif +#define safe_strcpy(d,s) \ +do { strncpy((d),(s),sizeof((d))); \ + (d)[sizeof((d))-1] = '\0'; \ +} while (0) + #endif /* _LINUX_STRING_H_ */ -- cgit v1.2.3