mips: elfinfo

Simon Horman horms at verge.net.au
Wed Dec 15 21:05:17 EST 2010


Hi Maxim,

I noticed that your change "Patch adds kernel data section to final vmcore.
This forces gdb read kernel" causes the build to break as it was applied
after Eric's "crashdump: Move kern_vaddr_start from kexec_info into
crash_elf_info" patch.

I have it in mind to resolve this something along the lines of
the patch below. However, I now see the following warning:

	kexec/arch/mips/crashdump-mips.c: In function `get_kernel_vaddr_and_size':
	kexec/arch/mips/crashdump-mips.c:81: warning: integer constant is too large for "unsigned long" type

Which corresponds to this code:

        elf_info->kern_vaddr_start = elf_info->kern_paddr_start |
                                        0xffffffff80000000UL;

I am compiling for 32-bit, so at a glance that constant does
seem to large.

Also, if you have any tips on a cross-compiling environment for 64bit
on a x86_32 or x86_64 host I would be most grateful.


diff --git a/kexec/arch/mips/crashdump-mips.c b/kexec/arch/mips/crashdump-mips.c
index 5ea4f4f..b937ab5 100644
--- a/kexec/arch/mips/crashdump-mips.c
+++ b/kexec/arch/mips/crashdump-mips.c
@@ -51,7 +51,7 @@ 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)
+static int get_kernel_paddr(struct crash_elf_info *elf_info)
 {
 	uint64_t start;
 
@@ -59,7 +59,7 @@ static int get_kernel_paddr(struct kexec_info *info)
 		return 0;
 
 	if (parse_iomem_single("Kernel code\n", &start, NULL) == 0) {
-		info->kern_paddr_start = start;
+		elf_info->kern_paddr_start = start;
 #ifdef DEBUG
 		printf("kernel load physical addr start = 0x%lx\n", start);
 #endif
@@ -70,21 +70,22 @@ static int get_kernel_paddr(struct kexec_info *info)
 	return -1;
 }
 
-static int get_kernel_vaddr_and_size(struct kexec_info *info)
+static int get_kernel_vaddr_and_size(struct crash_elf_info *elf_info)
 {
 	uint64_t end;
 
-	if (!info->kern_paddr_start)
+	if (!elf_info->kern_paddr_start)
 		return -1;
 
-	info->kern_vaddr_start =  info->kern_paddr_start | 0xffffffff80000000UL;
+	elf_info->kern_vaddr_start = elf_info->kern_paddr_start |
+					0xffffffff80000000UL;
 	if (parse_iomem_single("Kernel data\n", NULL, &end) == 0) {
-		info->kern_size = end - info->kern_paddr_start;
+		elf_info->kern_size = end - elf_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);
+				elf_info->kern_vaddr_start,
+				elf_info->kern_paddr_start);
+		printf("kernel size = 0x%llx\n", elf_info->kern_size);
 #endif
 		return 0;
 		}
@@ -355,11 +356,20 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
 	unsigned long sz, elfcorehdr;
 	int nr_ranges, align = 1024;
 	struct memory_range *mem_range;
+	crash_create_elf_headers_func crash_create = crash_create_elf32_headers;
+	struct crash_elf_info *elf_info = &elf_info32;
 
-	if (get_kernel_paddr(info))
+#ifdef __mips64
+	if (arch_options.core_header_type == CORE_TYPE_ELF64) {
+		elf_info = &elf_info64;
+		crash_create = crash_create_elf64;
+	}
+#endif
+
+	if (get_kernel_paddr(elf_info))
 		return -1;
 
-	if (get_kernel_vaddr_and_size(info))
+	if (get_kernel_vaddr_and_size(elf_info))
 		return -1;
 
 	if (get_crash_memory_ranges(&mem_range, &nr_ranges) < 0)
@@ -373,28 +383,9 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
 				crash_reserved_mem.start,
 				crash_reserved_mem.end, -1);
 
-#ifdef __mips64
-	/* Create elf header segment and store crash image data. */
-	if (arch_options.core_header_type == CORE_TYPE_ELF64) {
-		if (crash_create_elf64_headers(info, &elf_info64,
-			crash_memory_range, nr_ranges,
-			&tmp, &sz,
-			ELF_CORE_HEADER_ALIGN) < 0)
-			return -1;
-	} else {
-		if (crash_create_elf32_headers(info, &elf_info32,
-			crash_memory_range, nr_ranges,
-			&tmp, &sz,
-			ELF_CORE_HEADER_ALIGN) < 0)
-			return -1;
-	}
-#else
-	if (crash_create_elf32_headers(info, &elf_info32,
-		crash_memory_range, nr_ranges,
-		&tmp, &sz,
-		ELF_CORE_HEADER_ALIGN) < 0)
+	if (crash_create(info, elf_info, crash_memory_range, nr_ranges,
+			 &tmp, &sz, ELF_CORE_HEADER_ALIGN) < 0)
 		return -1;
-#endif
 	elfcorehdr = add_buffer(info, tmp, sz, sz, align,
 		crash_reserved_mem.start,
 		crash_reserved_mem.end, -1);
diff --git a/kexec/crashdump.h b/kexec/crashdump.h
index eccdb9f..060bb88 100644
--- a/kexec/crashdump.h
+++ b/kexec/crashdump.h
@@ -35,6 +35,13 @@ struct crash_elf_info {
 	int (*get_note_info)(int cpu, uint64_t *addr, uint64_t *len);
 };
 
+typedef int(*crash_create_elf_headers_func)(struct kexec_info *info,
+					    struct crash_elf_info *elf_info,
+					    struct memory_range *range,
+					    int ranges,
+					    void **buf, unsigned long *size,
+					    unsigned long align);
+
 int crash_create_elf32_headers(struct kexec_info *info,
 			       struct crash_elf_info *elf_info,
 			       struct memory_range *range, int ranges,



More information about the kexec mailing list