PATCH] support vmcores with 64k page size on 4k page size kernels

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Dave
Recently there were changes made to kexec tools to support 64K page size.
With those changes vmcore file obtained from a kernel which supports 64K
page size cannot be analyzed using crash on a machine running with kernel
supporting 4K page size.

The following changes in crash tool resolves the problem.
Look if the symbol __hash_page_64k exists. This symbol is defined only
for kernels with 64K PAGE SIZE support. If yes then the dump was taken
with a kernel supporting 64k page size. So use the vmcore page size[64K]
instead of getpagesize().

Thanks
-Sachin

* Recently there were changes made to kexec tools to support 64K page size. 
  With those changes vmcore file obtained from a kernel which supports 64K 
  page size cannot be analyzed using crash on a machine running with kernel 
  supporting 4K page size.
  The following change were made in crash tool to solve the problem. 
  Look if the symbol __hash_page_64k exists. If yes then the dump was taken 
  with a kernel supporting 64k page size. So change the page size accordingly.

Signed-Off-By: Sachin Sant <sachinp@xxxxxxxxxx>
--

diff -Naurp crash-4.0/defs.h crash-4.0-new/defs.h
--- crash-4.0/defs.h	2006-09-14 21:41:50.000000000 -0400
+++ crash-4.0-new/defs.h	2006-09-14 21:48:37.000000000 -0400
@@ -2297,6 +2297,7 @@ struct efi_memory_desc_t {
 #define _64BIT_
 #define MACHINE_TYPE       "PPC64"
 
+#define PPC64_64K_PAGE_SIZE	65536
 #define PAGEBASE(X)  (((ulong)(X)) & (ulong)machdep->pagemask)
 
 #define PTOV(X)            ((unsigned long)(X)+(machdep->kvbase))
diff -Naurp crash-4.0/ppc64.c crash-4.0-new/ppc64.c
--- crash-4.0/ppc64.c	2006-09-14 21:41:50.000000000 -0400
+++ crash-4.0-new/ppc64.c	2006-09-14 21:50:26.000000000 -0400
@@ -67,19 +67,6 @@ ppc64_init(int when)
 		machdep->verify_symbol = ppc64_verify_symbol;
 		if (pc->flags & KERNEL_DEBUG_QUERY)
 			return;
-		machdep->pagesize = memory_page_size();
-		machdep->pageshift = ffs(machdep->pagesize) - 1;
-		machdep->pageoffset = machdep->pagesize - 1;
-		machdep->pagemask = ~((ulonglong)machdep->pageoffset);
-		machdep->stacksize = 4 * machdep->pagesize;
-		if ((machdep->pgd = (char *)malloc(PAGESIZE())) == NULL)
-			error(FATAL, "cannot malloc pgd space.");
-		if ((machdep->pmd = (char *)malloc(PAGESIZE())) == NULL)
-			error(FATAL, "cannot malloc pmd space.");
-		if ((machdep->ptbl = (char *)malloc(PAGESIZE())) == NULL)
-			error(FATAL, "cannot malloc ptbl space.");
-		if ((machdep->machspec->level4 = (char *)malloc(PAGESIZE())) == NULL)
-			error(FATAL, "cannot malloc level4 space.");
 		machdep->last_pgd_read = 0;
                 machdep->last_pmd_read = 0;
                 machdep->last_ptbl_read = 0;
@@ -93,6 +80,40 @@ ppc64_init(int when)
 		break;
 
 	case PRE_GDB:
+		/*
+                * Recently there were changes made to kexec tools
+                * to support 64K page size. With those changes
+                * vmcore file obtained from a kernel which supports
+                * 64K page size cannot be analyzed using crash on a
+                * machine running with kernel supporting 4K page size
+                *
+                * The following modifications are required in crash
+                * tool to be in sync with kexec tools.
+                *
+                * Look if the following symbol exists. If yes then
+                * the dump was taken with a kernel supporting 64k
+                * page size. So change the page size accordingly.
+                *
+                * Also moved the following code block from
+                * PRE_SYMTAB case here.
+                */
+                if (symbol_exists("__hash_page_64K"))
+                        machdep->pagesize = PPC64_64K_PAGE_SIZE;
+                else
+			machdep->pagesize = memory_page_size();
+		machdep->pageshift = ffs(machdep->pagesize) - 1;
+		machdep->pageoffset = machdep->pagesize - 1;
+		machdep->pagemask = ~((ulonglong)machdep->pageoffset);
+		machdep->stacksize = 4 * machdep->pagesize;
+		if ((machdep->pgd = (char *)malloc(PAGESIZE())) == NULL)
+			error(FATAL, "cannot malloc pgd space.");
+		if ((machdep->pmd = (char *)malloc(PAGESIZE())) == NULL)
+			error(FATAL, "cannot malloc pmd space.");
+		if ((machdep->ptbl = (char *)malloc(PAGESIZE())) == NULL)
+			error(FATAL, "cannot malloc ptbl space.");
+		if ((machdep->machspec->level4 = (char *)malloc(PAGESIZE())) == NULL)
+			error(FATAL, "cannot malloc level4 space.");
+
 	        machdep->kvbase = symbol_value("_stext");
 		machdep->identity_map_base = machdep->kvbase;
                 machdep->is_kvaddr = generic_is_kvaddr;
--
Crash-utility mailing list
Crash-utility@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/crash-utility

[Index of Archives]     [Fedora Development]     [Fedora Desktop]     [Fedora SELinux]     [Yosemite News]     [KDE Users]     [Fedora Tools]

 

Powered by Linux