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,