xen_kexec_range_t range;
struct resource *res;
int k = 0;
+ int rc;
if (!is_initial_xendomain())
return;
memset(&range, 0, sizeof(range));
range.range = KEXEC_RANGE_MA_VMCOREINFO;
- if (HYPERVISOR_kexec_op(KEXEC_CMD_kexec_get_range, &range))
- return;
+ rc = HYPERVISOR_kexec_op(KEXEC_CMD_kexec_get_range, &range);
- if (range.size) {
- paddr_vmcoreinfo_xen = range.start;
+ if (rc == 0) {
+ /* Hypercall succeeded */
vmcoreinfo_size_xen = range.size;
+ paddr_vmcoreinfo_xen = range.start;
+
+ } else {
+ /* Hypercall failed.
+ * Indicate not to create sysfs file by resetting globals
+ */
+ vmcoreinfo_size_xen = 0;
+ paddr_vmcoreinfo_xen = 0;
+
+ /* The KEXEC_CMD_kexec_get_range hypercall did not implement
+ * KEXEC_RANGE_MA_VMCOREINFO until Xen 3.3.
+ * Do not bail out if it fails for this reason.
+ */
+ if (rc != -EINVAL)
+ return;
}
if (machine_kexec_setup_resources(&xen_hypervisor_res, xen_phys_cpus,
static ssize_t vmcoreinfo_show(struct hyp_sysfs_attr *attr, char *page)
{
- extern size_t vmcoreinfo_size_xen;
- extern unsigned long paddr_vmcoreinfo_xen;
-
return sprintf(page, "%lx %zx\n",
paddr_vmcoreinfo_xen, vmcoreinfo_size_xen);
}
sysfs_remove_file(&hypervisor_subsys.kset.kobj, &vmcoreinfo_attr.attr);
}
-#else
-
-#define xen_sysfs_vmcoreinfo_init() 0
-#define xen_sysfs_vmcoreinfo_destroy() ((void)0)
-
#endif
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;
+#ifdef CONFIG_KEXEC
+ if (vmcoreinfo_size_xen != 0) {
+ ret = xen_sysfs_vmcoreinfo_init();
+ if (ret)
+ goto vmcoreinfo_out;
+ }
+#endif
+
+ goto out;
+#ifdef CONFIG_KEXEC
+vmcoreinfo_out:
+#endif
xen_properties_destroy();
prop_out:
xen_sysfs_uuid_destroy();
static void __exit hyper_sysfs_exit(void)
{
- xen_sysfs_vmcoreinfo_destroy();
+#ifdef CONFIG_KEXEC
+ if (vmcoreinfo_size_xen != 0)
+ xen_sysfs_vmcoreinfo_destroy();
+#endif
xen_properties_destroy();
xen_compilation_destroy();
xen_sysfs_uuid_destroy();
#define VMCOREINFO_OFFSET_ALIAS(name, field, alias) \
vmcoreinfo_append_str("OFFSET(%s.%s)=%lu\n", #name, #alias, \
(unsigned long)offsetof(struct name, field))
+extern size_t vmcoreinfo_size_xen;
+extern unsigned long paddr_vmcoreinfo_xen;
#endif /* _XEN_PUBLIC_KEXEC_H */