[PATCH] Fix vmcoreinfo generation on 32bit hosts for 64bit kernels
Ken'ichi Ohmichi
oomichi at mxs.nes.nec.co.jp
Thu Jun 26 23:15:56 EDT 2008
Hi Bernhard,
Thank you for the patch.
Bernhard Walle wrote:
> This bug fixes the generation of vmcoreinfo files on 32bit hosts for ELF64
> files, i.e. 64bit kernels. The concrete problem was PPC64 which is built in a
> 32bit environment at SUSE.
I have one question.
I guess that the fundamental problem is that makedumpfile cannot
use vmcoreinfo which is contained in /proc/vmcore on ppc64, right ?
If yes, could you please test my attached patch for fixing it.
I created the kernel patch for adding the symbol "node_data" to
ppc64's vmcoreinfo, but I cannot tested it because I don't have
any ppc64 machine.
Thanks
Ken'ichi Ohmichi
--- ./arch/powerpc/kernel/machine_kexec.c.orig 2008-06-27 11:26:29.000000000 +0900
+++ ./arch/powerpc/kernel/machine_kexec.c 2008-06-27 11:32:05.000000000 +0900
@@ -116,3 +116,13 @@ int overlaps_crashkernel(unsigned long s
{
return (start + size) > crashk_res.start && start <= crashk_res.end;
}
+
+
+void arch_crash_save_vmcoreinfo(void)
+{
+#ifdef CONFIG_NUMA
+ VMCOREINFO_SYMBOL(node_data);
+ VMCOREINFO_LENGTH(node_data, MAX_NUMNODES);
+#endif
+}
+
> Signed-off-by: Bernhard Walle <bwalle at suse.de>
>
> ---
> makedumpfile.c | 37 ++++++++++++++++++-----------------
> makedumpfile.h | 60 ++++++++++++++++++++++++++++-----------------------------
> 2 files changed, 49 insertions(+), 48 deletions(-)
>
> --- a/makedumpfile.c
> +++ b/makedumpfile.c
> @@ -123,7 +123,7 @@ vaddr_to_offset_general(unsigned long lo
> * It is useful at few calls like get_str_osrelease_from_vmlinux().
> */
> off_t
> -vaddr_to_offset_slow(int fd, char *filename, unsigned long vaddr)
> +vaddr_to_offset_slow(int fd, char *filename, unsigned long long vaddr)
> {
> off_t offset = 0;
> int i, phnum, num_load, flag_elf64, elf_format;
> @@ -170,6 +170,7 @@ vaddr_to_offset_slow(int fd, char *filen
> break;
> }
> }
> +
> return offset;
> }
>
> @@ -970,11 +971,11 @@ out:
> return ret;
> }
>
> -unsigned long
> +unsigned long long
> get_symbol_addr(char *symname)
> {
> int i;
> - unsigned long symbol = NOT_FOUND_SYMBOL;
> + unsigned long long symbol = NOT_FOUND_SYMBOL;
> Elf *elfd = NULL;
> GElf_Shdr shdr;
> GElf_Sym sym;
> @@ -1949,7 +1950,7 @@ int
> get_str_osrelease_from_vmlinux()
> {
> struct utsname system_utsname;
> - unsigned long utsname;
> + unsigned long long utsname;
> off_t offset;
> const off_t failed = (off_t)-1;
>
> @@ -1968,7 +1969,7 @@ get_str_osrelease_from_vmlinux()
> dwarf_info.name_debuginfo, utsname);
>
> if (!offset) {
> - ERRMSG("Can't convert vaddr (%lx) of utsname to an offset.\n",
> + ERRMSG("Can't convert vaddr (%llx) of utsname to an offset.\n",
> utsname);
> return FALSE;
> }
> @@ -5684,19 +5685,19 @@ show_data_xen()
> * Show data for debug
> */
> MSG("\n");
> - MSG("SYMBOL(dom_xen): %lx\n", SYMBOL(dom_xen));
> - MSG("SYMBOL(dom_io): %lx\n", SYMBOL(dom_io));
> - MSG("SYMBOL(domain_list): %lx\n", SYMBOL(domain_list));
> - MSG("SYMBOL(xen_heap_start): %lx\n", SYMBOL(xen_heap_start));
> - MSG("SYMBOL(frame_table): %lx\n", SYMBOL(frame_table));
> - MSG("SYMBOL(alloc_bitmap): %lx\n", SYMBOL(alloc_bitmap));
> - MSG("SYMBOL(max_page): %lx\n", SYMBOL(max_page));
> - MSG("SYMBOL(pgd_l2): %lx\n", SYMBOL(pgd_l2));
> - MSG("SYMBOL(pgd_l3): %lx\n", SYMBOL(pgd_l3));
> - MSG("SYMBOL(pgd_l4): %lx\n", SYMBOL(pgd_l4));
> - MSG("SYMBOL(xenheap_phys_end): %lx\n", SYMBOL(xenheap_phys_end));
> - MSG("SYMBOL(xen_pstart): %lx\n", SYMBOL(xen_pstart));
> - MSG("SYMBOL(frametable_pg_dir): %lx\n", SYMBOL(frametable_pg_dir));
> + MSG("SYMBOL(dom_xen): %llx\n", SYMBOL(dom_xen));
> + MSG("SYMBOL(dom_io): %llx\n", SYMBOL(dom_io));
> + MSG("SYMBOL(domain_list): %llx\n", SYMBOL(domain_list));
> + MSG("SYMBOL(xen_heap_start): %llx\n", SYMBOL(xen_heap_start));
> + MSG("SYMBOL(frame_table): %llx\n", SYMBOL(frame_table));
> + MSG("SYMBOL(alloc_bitmap): %llx\n", SYMBOL(alloc_bitmap));
> + MSG("SYMBOL(max_page): %llx\n", SYMBOL(max_page));
> + MSG("SYMBOL(pgd_l2): %llx\n", SYMBOL(pgd_l2));
> + MSG("SYMBOL(pgd_l3): %llx\n", SYMBOL(pgd_l3));
> + MSG("SYMBOL(pgd_l4): %llx\n", SYMBOL(pgd_l4));
> + MSG("SYMBOL(xenheap_phys_end): %llx\n", SYMBOL(xenheap_phys_end));
> + MSG("SYMBOL(xen_pstart): %llx\n", SYMBOL(xen_pstart));
> + MSG("SYMBOL(frametable_pg_dir): %llx\n", SYMBOL(frametable_pg_dir));
>
> MSG("SIZE(page_info): %ld\n", SIZE(page_info));
> MSG("OFFSET(page_info.count_info): %ld\n", OFFSET(page_info.count_info));
> --- a/makedumpfile.h
> +++ b/makedumpfile.h
> @@ -258,7 +258,7 @@ do { \
> #define WRITE_SYMBOL(str_symbol, symbol) \
> do { \
> if (SYMBOL(symbol) != NOT_FOUND_SYMBOL) { \
> - fprintf(info->file_vmcoreinfo, "%s%lx\n", \
> + fprintf(info->file_vmcoreinfo, "%s%llx\n", \
> STR_SYMBOL(str_symbol), SYMBOL(symbol)); \
> } \
> } while (0)
> @@ -802,39 +802,39 @@ struct vm_table {
> extern struct vm_table vt;
>
> struct symbol_table {
> - unsigned long mem_map;
> - unsigned long mem_section;
> - unsigned long pkmap_count;
> - unsigned long pkmap_count_next;
> - unsigned long system_utsname;
> - unsigned long init_uts_ns;
> - unsigned long _stext;
> - unsigned long swapper_pg_dir;
> - unsigned long init_level4_pgt;
> - unsigned long phys_base;
> - unsigned long node_online_map;
> - unsigned long node_states;
> - unsigned long node_memblk;
> - unsigned long node_data;
> - unsigned long pgdat_list;
> - unsigned long contig_page_data;
> + unsigned long long mem_map;
> + unsigned long long mem_section;
> + unsigned long long pkmap_count;
> + unsigned long long pkmap_count_next;
> + unsigned long long system_utsname;
> + unsigned long long init_uts_ns;
> + unsigned long long _stext;
> + unsigned long long swapper_pg_dir;
> + unsigned long long init_level4_pgt;
> + unsigned long long phys_base;
> + unsigned long long node_online_map;
> + unsigned long long node_states;
> + unsigned long long node_memblk;
> + unsigned long long node_data;
> + unsigned long long pgdat_list;
> + unsigned long long contig_page_data;
>
> /*
> * for Xen extraction
> */
> - unsigned long dom_xen;
> - unsigned long dom_io;
> - unsigned long domain_list;
> - unsigned long frame_table;
> - unsigned long xen_heap_start;
> - unsigned long pgd_l2;
> - unsigned long pgd_l3;
> - unsigned long pgd_l4;
> - unsigned long xenheap_phys_end;
> - unsigned long xen_pstart;
> - unsigned long frametable_pg_dir;
> - unsigned long max_page;
> - unsigned long alloc_bitmap;
> + unsigned long long dom_xen;
> + unsigned long long dom_io;
> + unsigned long long domain_list;
> + unsigned long long frame_table;
> + unsigned long long xen_heap_start;
> + unsigned long long pgd_l2;
> + unsigned long long pgd_l3;
> + unsigned long long pgd_l4;
> + unsigned long long xenheap_phys_end;
> + unsigned long long xen_pstart;
> + unsigned long long frametable_pg_dir;
> + unsigned long long max_page;
> + unsigned long long alloc_bitmap;
> };
>
> struct size_table {
>
More information about the kexec
mailing list