[PATCH] Patch adds kernel data section to final vmcore. This forces gdb read kernel
Maxim Uvarov
muvarov at gmail.com
Sat Nov 13 05:23:20 EST 2010
From: Maxim Uvarov <muvarov at gmail.com>
static data from dump instead of not initialized values from vmlinux.
Signed-off-by: Maxim Uvarov <muvarov at gmail.com>
---
kexec/arch/mips/crashdump-mips.c | 49 ++++++++++++++++++++++++++++++++++++++
1 files changed, 49 insertions(+), 0 deletions(-)
diff --git a/kexec/arch/mips/crashdump-mips.c b/kexec/arch/mips/crashdump-mips.c
index 17cf52d..5ea4f4f 100644
--- a/kexec/arch/mips/crashdump-mips.c
+++ b/kexec/arch/mips/crashdump-mips.c
@@ -49,6 +49,49 @@ static struct memory_range crash_reserved_mem;
*/
unsigned long long saved_max_mem;
+/* Read kernel physical load addr from the file returned by proc_iomem()
+ * (Kernel Code) and store in kexec_info */
+static int get_kernel_paddr(struct kexec_info *info)
+{
+ uint64_t start;
+
+ if (xen_present()) /* Kernel not entity mapped under Xen */
+ return 0;
+
+ if (parse_iomem_single("Kernel code\n", &start, NULL) == 0) {
+ info->kern_paddr_start = start;
+#ifdef DEBUG
+ printf("kernel load physical addr start = 0x%lx\n", start);
+#endif
+ return 0;
+ }
+
+ fprintf(stderr, "Cannot determine kernel physical load addr\n");
+ return -1;
+}
+
+static int get_kernel_vaddr_and_size(struct kexec_info *info)
+{
+ uint64_t end;
+
+ if (!info->kern_paddr_start)
+ return -1;
+
+ info->kern_vaddr_start = info->kern_paddr_start | 0xffffffff80000000UL;
+ if (parse_iomem_single("Kernel data\n", NULL, &end) == 0) {
+ info->kern_size = end - info->kern_paddr_start;
+#ifdef DEBUG
+ printf("kernel_vaddr= 0x%llx paddr %llx\n",
+ info->kern_vaddr_start,
+ info->kern_paddr_start);
+ printf("kernel size = 0x%llx\n", info->kern_size);
+#endif
+ return 0;
+ }
+ fprintf(stderr, "Cannot determine kernel virtual load addr and size\n");
+ return -1;
+}
+
/* Removes crash reserve region from list of memory chunks for whom elf program
* headers have to be created. Assuming crash reserve region to be a single
* continuous area fully contained inside one of the memory chunks */
@@ -313,6 +356,12 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
int nr_ranges, align = 1024;
struct memory_range *mem_range;
+ if (get_kernel_paddr(info))
+ return -1;
+
+ if (get_kernel_vaddr_and_size(info))
+ return -1;
+
if (get_crash_memory_ranges(&mem_range, &nr_ranges) < 0)
return -1;
Best regards,
Maxim Uvarov.
More information about the kexec
mailing list