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. 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 {