>Kernel code only exports virtual address of phys_base now and it's helpless >for Crash and Makedumpfile. Below patch which changes code to export value >of phys_base has been posted to upstream. So adapt code to get it. > >kexec: Change to export the value of phys_base instead of symbol address >marc.info/?l=linux-kernel&m=147856863629624&w=2 > >Signed-off-by: Baoquan He <bhe at redhat.com> I suspect that this patch will break backward compatibility. >--- > arch/x86_64.c | 7 +++++-- > makedumpfile.c | 5 ++--- > makedumpfile.h | 2 +- > 3 files changed, 8 insertions(+), 6 deletions(-) > >diff --git a/arch/x86_64.c b/arch/x86_64.c >index 3ef33ae..8593c1a 100644 >--- a/arch/x86_64.c >+++ b/arch/x86_64.c >@@ -61,7 +61,10 @@ get_phys_base_x86_64(void) > /* > * Get the relocatable offset > */ >- info->phys_base = 0; /* default/traditional */ >+ if (NUMBER(phys_base) != NOT_FOUND_NUMBER) { >+ info->phys_base = NUMBER(phys_base); >+ return TRUE; >+ } > > for (i = 0; get_pt_load(i, &phys_start, NULL, &virt_start, NULL); i++) { > if (virt_start >= __START_KERNEL_map) { >@@ -189,7 +192,7 @@ vtop4_x86_64(unsigned long vaddr) > unsigned long pte_paddr, pte; > unsigned long phys_base; > >- if (SYMBOL(phys_base) != NOT_FOUND_SYMBOL) >+ if (NUMBER(phys_base) != NOT_FOUND_NUMBER) > phys_base = info->phys_base; > else > phys_base = 0; In older kernel, even if get_phys_base_x86_64() calculates info->phys_base from PT_LOAD, it will not be used since the kernels export *SYMBOL*(phys_base) and phys_base will be always set to 0 here. Is this check really needed ? Why don't you just set info->phys_base to phys_base ? (Of course, info->phys_base should be initialized with 0 in get_phys_base_x86_64() in that case.) Thanks, Atsushi Kumagai >diff --git a/makedumpfile.c b/makedumpfile.c >index b916dfb..a3f711e 100644 >--- a/makedumpfile.c >+++ b/makedumpfile.c >@@ -1507,7 +1507,6 @@ get_symbol_info(void) > SYMBOL_INIT(init_level4_pgt, "init_level4_pgt"); > SYMBOL_INIT(vmlist, "vmlist"); > SYMBOL_INIT(vmap_area_list, "vmap_area_list"); >- SYMBOL_INIT(phys_base, "phys_base"); > SYMBOL_INIT(node_online_map, "node_online_map"); > SYMBOL_INIT(node_states, "node_states"); > SYMBOL_INIT(node_memblk, "node_memblk"); >@@ -2134,7 +2133,6 @@ write_vmcoreinfo_data(void) > WRITE_SYMBOL("init_level4_pgt", init_level4_pgt); > WRITE_SYMBOL("vmlist", vmlist); > WRITE_SYMBOL("vmap_area_list", vmap_area_list); >- WRITE_SYMBOL("phys_base", phys_base); > WRITE_SYMBOL("node_online_map", node_online_map); > WRITE_SYMBOL("node_states", node_states); > WRITE_SYMBOL("node_data", node_data); >@@ -2261,6 +2259,7 @@ write_vmcoreinfo_data(void) > > WRITE_NUMBER("PAGE_BUDDY_MAPCOUNT_VALUE", PAGE_BUDDY_MAPCOUNT_VALUE); > WRITE_NUMBER("KERNEL_IMAGE_SIZE", KERNEL_IMAGE_SIZE); >+ WRITE_NUMBER("phys_base", phys_base); > > WRITE_NUMBER("HUGETLB_PAGE_DTOR", HUGETLB_PAGE_DTOR); > >@@ -2488,7 +2487,6 @@ read_vmcoreinfo(void) > READ_SYMBOL("init_level4_pgt", init_level4_pgt); > READ_SYMBOL("vmlist", vmlist); > READ_SYMBOL("vmap_area_list", vmap_area_list); >- READ_SYMBOL("phys_base", phys_base); > READ_SYMBOL("node_online_map", node_online_map); > READ_SYMBOL("node_states", node_states); > READ_SYMBOL("node_data", node_data); >@@ -2609,6 +2607,7 @@ read_vmcoreinfo(void) > > READ_NUMBER("PAGE_BUDDY_MAPCOUNT_VALUE", PAGE_BUDDY_MAPCOUNT_VALUE); > READ_NUMBER("KERNEL_IMAGE_SIZE", KERNEL_IMAGE_SIZE); >+ READ_NUMBER("phys_base", phys_base); > > READ_NUMBER("HUGETLB_PAGE_DTOR", HUGETLB_PAGE_DTOR); > >diff --git a/makedumpfile.h b/makedumpfile.h >index 338c651..422b6be 100644 >--- a/makedumpfile.h >+++ b/makedumpfile.h >@@ -1394,7 +1394,6 @@ struct symbol_table { > unsigned long long init_level4_pgt; > unsigned long long vmlist; > unsigned long long vmap_area_list; >- unsigned long long phys_base; > unsigned long long node_online_map; > unsigned long long node_states; > unsigned long long node_memblk; >@@ -1718,6 +1717,7 @@ struct number_table { > long SECTION_SIZE_BITS; > long MAX_PHYSMEM_BITS; > long HUGETLB_PAGE_DTOR; >+ long phys_base; > }; > > struct srcfile_table { >-- >2.5.5