Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > 89877e42827f16fa5f86b1df0c2860b1 > files > 2710

kernel-2.6.18-128.1.10.el5.src.rpm

From: Neil Horman <nhorman@redhat.com>
Date: Mon, 18 Aug 2008 11:00:28 -0400
Subject: [xen] kdump: ability to use makedumpfile with vmcoreinfo
Message-id: 20080818150028.GE7052@hmsendeavour.rdu.redhat.com
O-Subject: [RHEL 5.3 PATCH] 2/2: xen: add ability for dom0 kernels to use makedumpfile with vmcoreinfo (bz 454498)
Bugzilla: 454498
RH-Acked-by: Bill Burns <bburns@redhat.com>
RH-Acked-by: Bill Burns <bburns@redhat.com>

Hey-
	The kernel portion of this patch

diff --git a/drivers/xen/core/machine_kexec.c b/drivers/xen/core/machine_kexec.c
index 2a44474..54bfe42 100644
--- a/drivers/xen/core/machine_kexec.c
+++ b/drivers/xen/core/machine_kexec.c
@@ -16,6 +16,9 @@ int xen_max_nr_phys_cpus;
 struct resource xen_hypervisor_res;
 struct resource *xen_phys_cpus;
 
+size_t vmcoreinfo_size_xen;
+unsigned long paddr_vmcoreinfo_xen;
+
 void xen_machine_kexec_setup_resources(void)
 {
 	xen_kexec_range_t range;
@@ -93,6 +96,18 @@ void xen_machine_kexec_setup_resources(void)
 		crashk_res.end = range.start + range.size - 1;
 	}
 
+	/* get physical address of vmcoreinfo */
+	memset(&range, 0, sizeof(range));
+	range.range = KEXEC_RANGE_MA_VMCOREINFO;
+
+	if (HYPERVISOR_kexec_op(KEXEC_CMD_kexec_get_range, &range))
+		return;
+
+	if (range.size) {
+		paddr_vmcoreinfo_xen = range.start;
+		vmcoreinfo_size_xen = range.size;
+	}
+
 	return;
 
  err:
diff --git a/drivers/xen/core/xen_sysfs.c b/drivers/xen/core/xen_sysfs.c
index fd8bfdb..eec5ec8 100644
--- a/drivers/xen/core/xen_sysfs.c
+++ b/drivers/xen/core/xen_sysfs.c
@@ -15,6 +15,7 @@
 #include <xen/features.h>
 #include <xen/hypervisor_sysfs.h>
 #include <xen/xenbus.h>
+#include <xen/interface/kexec.h>
 
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Mike D. Day <ncmike@us.ibm.com>");
@@ -330,6 +331,33 @@ static void xen_properties_destroy(void)
 			   &xen_properties_group);
 }
 
+#ifdef CONFIG_KEXEC
+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);
+
+#endif
+
+static int __init xen_sysfs_vmcoreinfo_init(void)
+{
+#ifdef CONFIG_KEXEC
+	return sysfs_create_file(&hypervisor_subsys.kset.kobj, &vmcoreinfo_attr.attr);
+#else
+	return 0;
+#endif
+}
+
+static void xen_sysfs_vmcoreinfo_destroy(void)
+{
+#ifdef CONFIG_KEXEC
+	sysfs_remove_file(&hypervisor_subsys.kset.kobj, &vmcoreinfo_attr.attr);
+#endif
+}
+
 static int __init hyper_sysfs_init(void)
 {
 	int ret;
@@ -350,9 +378,14 @@ static int __init hyper_sysfs_init(void)
 	if (ret)
 		goto uuid_out;
 	ret = xen_properties_init();
+	if (ret)
+		goto prop_out;
+	ret = xen_sysfs_vmcoreinfo_init();
 	if (!ret)
 		goto out;
 
+	xen_properties_destroy();
+prop_out:
 	xen_sysfs_uuid_destroy();
 uuid_out:
 	xen_compilation_destroy();
@@ -366,6 +399,7 @@ out:
 
 static void hyper_sysfs_exit(void)
 {
+	xen_sysfs_vmcoreinfo_destroy();
 	xen_properties_destroy();
 	xen_compilation_destroy();
 	xen_sysfs_uuid_destroy();
diff --git a/include/xen/interface/kexec.h b/include/xen/interface/kexec.h
index 7bc8b27..46b98f6 100644
--- a/include/xen/interface/kexec.h
+++ b/include/xen/interface/kexec.h
@@ -109,6 +109,11 @@ typedef struct xen_kexec_load {
 #define KEXEC_RANGE_MA_XEN   1   /* machine address and size of Xen itself */
 #define KEXEC_RANGE_MA_CPU   2   /* machine address and size of a CPU note */
 
+#define KEXEC_RANGE_MA_VMCOREINFO 6 /* machine address and size of vmcoreinfo */
+ 
+extern size_t vmcoreinfo_size_xen;
+extern unsigned long paddr_vmcoreinfo_xen;
+
 /*
  * Find the address and size of certain memory areas
  * range == KEXEC_RANGE_... [in]