2 * copyright (c) 2006 IBM Corporation
3 * Authored by: Mike D. Day <ncmike@us.ibm.com>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
10 #include <linux/config.h>
11 #include <linux/err.h>
12 #include <linux/kernel.h>
13 #include <linux/module.h>
14 #include <linux/init.h>
15 #include <asm/hypervisor.h>
16 #include <xen/features.h>
17 #include <xen/hypervisor_sysfs.h>
18 #include <xen/xenbus.h>
20 MODULE_LICENSE("GPL");
21 MODULE_AUTHOR("Mike D. Day <ncmike@us.ibm.com>");
23 static ssize_t type_show(struct hyp_sysfs_attr *attr, char *buffer)
25 return sprintf(buffer, "xen\n");
28 HYPERVISOR_ATTR_RO(type);
30 static int __init xen_sysfs_type_init(void)
32 return sysfs_create_file(&hypervisor_subsys.kset.kobj, &type_attr.attr);
35 static void xen_sysfs_type_destroy(void)
37 sysfs_remove_file(&hypervisor_subsys.kset.kobj, &type_attr.attr);
40 /* xen version attributes */
41 static ssize_t major_show(struct hyp_sysfs_attr *attr, char *buffer)
43 int version = HYPERVISOR_xen_version(XENVER_version, NULL);
45 return sprintf(buffer, "%d\n", version >> 16);
49 HYPERVISOR_ATTR_RO(major);
51 static ssize_t minor_show(struct hyp_sysfs_attr *attr, char *buffer)
53 int version = HYPERVISOR_xen_version(XENVER_version, NULL);
55 return sprintf(buffer, "%d\n", version & 0xff);
59 HYPERVISOR_ATTR_RO(minor);
61 static ssize_t extra_show(struct hyp_sysfs_attr *attr, char *buffer)
66 extra = kmalloc(XEN_EXTRAVERSION_LEN, GFP_KERNEL);
68 ret = HYPERVISOR_xen_version(XENVER_extraversion, extra);
70 ret = sprintf(buffer, "%s\n", extra);
77 HYPERVISOR_ATTR_RO(extra);
79 static struct attribute *version_attrs[] = {
86 static struct attribute_group version_group = {
88 .attrs = version_attrs,
91 static int __init xen_sysfs_version_init(void)
93 return sysfs_create_group(&hypervisor_subsys.kset.kobj,
97 static void xen_sysfs_version_destroy(void)
99 sysfs_remove_group(&hypervisor_subsys.kset.kobj, &version_group);
104 static ssize_t uuid_show(struct hyp_sysfs_attr *attr, char *buffer)
109 vm = xenbus_read(XBT_NIL, "vm", "", NULL);
112 val = xenbus_read(XBT_NIL, vm, "uuid", NULL);
116 ret = sprintf(buffer, "%s\n", val);
121 HYPERVISOR_ATTR_RO(uuid);
123 static int __init xen_sysfs_uuid_init(void)
125 return sysfs_create_file(&hypervisor_subsys.kset.kobj, &uuid_attr.attr);
128 static void xen_sysfs_uuid_destroy(void)
130 sysfs_remove_file(&hypervisor_subsys.kset.kobj, &uuid_attr.attr);
133 /* xen compilation attributes */
135 static ssize_t compiler_show(struct hyp_sysfs_attr *attr, char *buffer)
138 struct xen_compile_info *info;
140 info = kmalloc(sizeof(struct xen_compile_info), GFP_KERNEL);
142 ret = HYPERVISOR_xen_version(XENVER_compile_info, info);
144 ret = sprintf(buffer, "%s\n", info->compiler);
151 HYPERVISOR_ATTR_RO(compiler);
153 static ssize_t compiled_by_show(struct hyp_sysfs_attr *attr, char *buffer)
156 struct xen_compile_info *info;
158 info = kmalloc(sizeof(struct xen_compile_info), GFP_KERNEL);
160 ret = HYPERVISOR_xen_version(XENVER_compile_info, info);
162 ret = sprintf(buffer, "%s\n", info->compile_by);
169 HYPERVISOR_ATTR_RO(compiled_by);
171 static ssize_t compile_date_show(struct hyp_sysfs_attr *attr, char *buffer)
174 struct xen_compile_info *info;
176 info = kmalloc(sizeof(struct xen_compile_info), GFP_KERNEL);
178 ret = HYPERVISOR_xen_version(XENVER_compile_info, info);
180 ret = sprintf(buffer, "%s\n", info->compile_date);
187 HYPERVISOR_ATTR_RO(compile_date);
189 static struct attribute *xen_compile_attrs[] = {
191 &compiled_by_attr.attr,
192 &compile_date_attr.attr,
196 static struct attribute_group xen_compilation_group = {
197 .name = "compilation",
198 .attrs = xen_compile_attrs,
201 int __init static xen_compilation_init(void)
203 return sysfs_create_group(&hypervisor_subsys.kset.kobj,
204 &xen_compilation_group);
207 static void xen_compilation_destroy(void)
209 sysfs_remove_group(&hypervisor_subsys.kset.kobj,
210 &xen_compilation_group);
213 /* xen properties info */
215 static ssize_t capabilities_show(struct hyp_sysfs_attr *attr, char *buffer)
220 caps = kmalloc(XEN_CAPABILITIES_INFO_LEN, GFP_KERNEL);
222 ret = HYPERVISOR_xen_version(XENVER_capabilities, caps);
224 ret = sprintf(buffer, "%s\n", caps);
231 HYPERVISOR_ATTR_RO(capabilities);
233 static ssize_t changeset_show(struct hyp_sysfs_attr *attr, char *buffer)
238 cset = kmalloc(XEN_CHANGESET_INFO_LEN, GFP_KERNEL);
240 ret = HYPERVISOR_xen_version(XENVER_changeset, cset);
242 ret = sprintf(buffer, "%s\n", cset);
249 HYPERVISOR_ATTR_RO(changeset);
251 static ssize_t virtual_start_show(struct hyp_sysfs_attr *attr, char *buffer)
254 struct xen_platform_parameters *parms;
256 parms = kmalloc(sizeof(struct xen_platform_parameters), GFP_KERNEL);
258 ret = HYPERVISOR_xen_version(XENVER_platform_parameters,
261 ret = sprintf(buffer, "%lx\n", parms->virt_start);
268 HYPERVISOR_ATTR_RO(virtual_start);
270 static ssize_t pagesize_show(struct hyp_sysfs_attr *attr, char *buffer)
274 ret = HYPERVISOR_xen_version(XENVER_pagesize, NULL);
276 ret = sprintf(buffer, "%x\n", ret);
281 HYPERVISOR_ATTR_RO(pagesize);
283 /* eventually there will be several more features to export */
284 static ssize_t xen_feature_show(int index, char *buffer)
287 struct xen_feature_info *info;
289 info = kmalloc(sizeof(struct xen_feature_info), GFP_KERNEL);
291 info->submap_idx = index;
292 ret = HYPERVISOR_xen_version(XENVER_get_features, info);
294 ret = sprintf(buffer, "%d\n", info->submap);
301 static ssize_t writable_pt_show(struct hyp_sysfs_attr *attr, char *buffer)
303 return xen_feature_show(XENFEAT_writable_page_tables, buffer);
306 HYPERVISOR_ATTR_RO(writable_pt);
308 static struct attribute *xen_properties_attrs[] = {
309 &capabilities_attr.attr,
310 &changeset_attr.attr,
311 &virtual_start_attr.attr,
313 &writable_pt_attr.attr,
317 static struct attribute_group xen_properties_group = {
318 .name = "properties",
319 .attrs = xen_properties_attrs,
322 static int __init xen_properties_init(void)
324 return sysfs_create_group(&hypervisor_subsys.kset.kobj,
325 &xen_properties_group);
328 static void xen_properties_destroy(void)
330 sysfs_remove_group(&hypervisor_subsys.kset.kobj,
331 &xen_properties_group);
334 static int __init hyper_sysfs_init(void)
338 if (!is_running_on_xen())
341 ret = xen_sysfs_type_init();
344 ret = xen_sysfs_version_init();
347 ret = xen_compilation_init();
350 ret = xen_sysfs_uuid_init();
353 ret = xen_properties_init();
357 xen_sysfs_uuid_destroy();
359 xen_compilation_destroy();
361 xen_sysfs_version_destroy();
363 xen_sysfs_type_destroy();
368 static void hyper_sysfs_exit(void)
370 xen_properties_destroy();
371 xen_compilation_destroy();
372 xen_sysfs_uuid_destroy();
373 xen_sysfs_version_destroy();
374 xen_sysfs_type_destroy();
378 module_init(hyper_sysfs_init);
379 module_exit(hyper_sysfs_exit);