- Update Xen patches to 3.3-rc5 and c/s 1157.
[linux-flexiantxendom0-3.2.10.git] / drivers / xen / sys-hypervisor.c
index 1e0fe01..3f0283e 100644 (file)
 #include <linux/module.h>
 #include <linux/kobject.h>
 
+#if defined(CONFIG_XEN) || defined(MODULE)
+#include <asm/hypervisor.h>
+#else
 #include <asm/xen/hypervisor.h>
 #include <asm/xen/hypercall.h>
+#endif
 
 #include <xen/xen.h>
 #include <xen/xenbus.h>
 #include <xen/interface/xen.h>
 #include <xen/interface/version.h>
 
+#include "xenbus/xenbus_comms.h"
+
 #define HYPERVISOR_ATTR_RO(_name) \
 static struct hyp_sysfs_attr  _name##_attr = __ATTR_RO(_name)
 
@@ -97,7 +103,7 @@ static struct attribute *version_attrs[] = {
        NULL
 };
 
-static struct attribute_group version_group = {
+static const struct attribute_group version_group = {
        .name = "version",
        .attrs = version_attrs,
 };
@@ -118,9 +124,8 @@ static ssize_t uuid_show(struct hyp_sysfs_attr *attr, char *buffer)
 {
        char *vm, *val;
        int ret;
-       extern int xenstored_ready;
 
-       if (!xenstored_ready)
+       if (!is_xenstored_ready())
                return -EBUSY;
 
        vm = xenbus_read(XBT_NIL, "vm", "", NULL);
@@ -210,7 +215,7 @@ static struct attribute *xen_compile_attrs[] = {
        NULL
 };
 
-static struct attribute_group xen_compilation_group = {
+static const struct attribute_group xen_compilation_group = {
        .name = "compilation",
        .attrs = xen_compile_attrs,
 };
@@ -340,7 +345,7 @@ static struct attribute *xen_properties_attrs[] = {
        NULL
 };
 
-static struct attribute_group xen_properties_group = {
+static const struct attribute_group xen_properties_group = {
        .name = "properties",
        .attrs = xen_properties_attrs,
 };
@@ -355,6 +360,35 @@ static void xen_properties_destroy(void)
        sysfs_remove_group(hypervisor_kobj, &xen_properties_group);
 }
 
+#if defined(CONFIG_XEN) && defined(CONFIG_KEXEC)
+extern size_t vmcoreinfo_size_xen;
+extern unsigned long paddr_vmcoreinfo_xen;
+
+static ssize_t vmcoreinfo_show(struct hyp_sysfs_attr *attr, char *page)
+{
+       return sprintf(page, "%lx %zx\n",
+                      paddr_vmcoreinfo_xen, vmcoreinfo_size_xen);
+}
+
+HYPERVISOR_ATTR_RO(vmcoreinfo);
+
+static int __init xen_sysfs_vmcoreinfo_init(void)
+{
+       if (!vmcoreinfo_size_xen)
+               return 0;
+       return sysfs_create_file(hypervisor_kobj, &vmcoreinfo_attr.attr);
+}
+
+static void xen_sysfs_vmcoreinfo_destroy(void)
+{
+       if (vmcoreinfo_size_xen)
+               sysfs_remove_file(hypervisor_kobj, &vmcoreinfo_attr.attr);
+}
+#else
+static inline int __init xen_sysfs_vmcoreinfo_init(void) { return 0; }
+static inline void xen_sysfs_vmcoreinfo_destroy(void) { }
+#endif
+
 static int __init hyper_sysfs_init(void)
 {
        int ret;
@@ -377,9 +411,11 @@ static int __init hyper_sysfs_init(void)
        ret = xen_properties_init();
        if (ret)
                goto prop_out;
+       ret = xen_sysfs_vmcoreinfo_init();
+       if (!ret)
+               goto out;
 
-       goto out;
-
+       xen_properties_destroy();
 prop_out:
        xen_sysfs_uuid_destroy();
 uuid_out:
@@ -394,6 +430,7 @@ out:
 
 static void __exit hyper_sysfs_exit(void)
 {
+       xen_sysfs_vmcoreinfo_destroy();
        xen_properties_destroy();
        xen_compilation_destroy();
        xen_sysfs_uuid_destroy();