[PATCH 1/2] makedumpfile: Adapt code to get value of phys_base

Atsushi Kumagai ats-kumagai at wm.jp.nec.com
Wed Nov 9 19:57:51 PST 2016


>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



More information about the kexec mailing list