Hi,

the crash utility is unable to read xendump cores from kernel versions
2.6.27 or newer. Bernhard fixed this only for kdump Xen cores.

With 2.6.27 and newer kernels, the max_pfn symbol should be used
to get the highest PFN in the system. However, xendump code still
tries to use end_pfn. Without the patch, early initialization
fails with the error message: "crash: cannot resolve "end_pfn".

Signed-off-by: Petr Tesarik <[email protected]>

---
 x86_64.c |   22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

--- a/x86_64.c
+++ b/x86_64.c
@@ -4851,6 +4851,7 @@ x86_64_xen_kdump_p2m_create(struct xen_k
         ulong frames;
         ulong frame_mfn[MAX_X86_64_FRAMES] = { 0 };
         int mfns[MAX_X86_64_FRAMES] = { 0 };
+       struct syment *sp;
 
         /*
          *  Temporarily read physical (machine) addresses from vmcore by
@@ -4932,7 +4933,15 @@ use_cr3:
                 x86_64_debug_dump_page(fp, machdep->machspec->pml4,
                         "contents of PML4 page:");
 
-       kvaddr = symbol_value("end_pfn");
+       /*
+        * kernel version <  2.6.27 => end_pfn
+        * kernel version >= 2.6.27 => max_pfn
+        */
+       if ((sp = symbol_search("end_pfn")))
+               kvaddr = sp->value;
+       else
+               kvaddr = symbol_value("max_pfn");
+
         if (!x86_64_xen_kdump_load_page(kvaddr, xkd->page))
                 return FALSE;
         up = (ulong *)(xkd->page + PAGEOFFSET(kvaddr));
@@ -5262,6 +5271,7 @@ x86_64_xendump_p2m_create(struct xendump
        ulong mfn, kvaddr, ctrlreg[8], ctrlreg_offset;
        ulong *up;
        off_t offset; 
+       struct syment *sp;
 
         if (!symbol_exists("phys_to_machine_mapping")) {
                 xd->flags |= XC_CORE_NO_P2M;
@@ -5299,7 +5309,15 @@ x86_64_xendump_p2m_create(struct xendump
                x86_64_debug_dump_page(xd->ofp, machdep->machspec->pml4, 
                        "contents of PML4 page:");
 
-       kvaddr = symbol_value("end_pfn");
+       /*
+        * kernel version <  2.6.27 => end_pfn
+        * kernel version >= 2.6.27 => max_pfn
+        */
+       if ((sp = symbol_search("end_pfn")))
+               kvaddr = sp->value;
+       else
+               kvaddr = symbol_value("max_pfn");
+
        if (!x86_64_xendump_load_page(kvaddr, xd))
                return FALSE;
 


--
Crash-utility mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/crash-utility

Reply via email to