[PATCH] fix for ppc64 virtual-to-physical translation w/64K pages

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

 




A recent patch to the the upstream 2.6.23 kernel, and RHEL5
kernels from 2.6.18-40.el5 and beyond, changes the ppc64
PTE_RPN_SHIFT in pgtable-64k.h from 32 to 30 bits.  This
in turn causes the crash utility's virtual-to-physical address
translation of kernel vmalloc() and user-space virtual addresses
to fail on ppc64 kernels configured with 64K pages.  During
crash session initialization, this warning message is displayed:

 WARNING: cannot access vmalloc'd module memory

The same message will appear if the "mod" command is subsequently
attempted.

Translations and reads of vmalloc'd kernel virtual addresses and
user virtual addresses will appear to work, but bogus data will
be returned because the resultant physical address that is read
is incorrect.

The attached patch recognizes whether this patch has been applied
and adjusts the PTE shift value accordingly.  There's also some
additional "help -m" output for the machine-specific data that
was missing from the display.

The patch tests OK, and I don't believe any other vtop-related
changes are required, but given that the ppc64.c was contributed
by IBM, can I get an ACK from the IBM brain-trust out there?

Thanks,
  Dave


--- crash-4.0-4.8/defs.h	2007-11-13 11:21:32.000000000 -0500
+++ next/defs.h	2007-11-13 11:20:00.000000000 -0500
@@ -2526,7 +2526,8 @@
 #define PMD_INDEX_SIZE_L4_64K  12
 #define PUD_INDEX_SIZE_L4_64K  0
 #define PGD_INDEX_SIZE_L4_64K  4
-#define PTE_SHIFT_L4_64K  32
+#define PTE_SHIFT_L4_64K_V1  32
+#define PTE_SHIFT_L4_64K_V2  30
 #define PMD_MASKED_BITS_64K  0x1ff
 
 #define L4_OFFSET(vaddr)  ((vaddr >> (machdep->machspec->l4_shift)) & 0x1ff)
--- crash-4.0-4.8/ppc64.c	2007-11-13 11:21:32.000000000 -0500
+++ next/ppc64.c	2007-11-13 11:20:00.000000000 -0500
@@ -160,7 +160,8 @@
 				m->l2_index_size = PMD_INDEX_SIZE_L4_64K;
 				m->l3_index_size = PUD_INDEX_SIZE_L4_64K;
 				m->l4_index_size = PGD_INDEX_SIZE_L4_64K;
-				m->pte_shift = PTE_SHIFT_L4_64K; 
+				m->pte_shift = symbol_exists("demote_segment_4k") ?
+					PTE_SHIFT_L4_64K_V2 : PTE_SHIFT_L4_64K_V1; 
 				m->l2_masked_bits = PMD_MASKED_BITS_64K;
 			} else {
 				/* 4K pagesize */
@@ -305,7 +306,7 @@
 void
 ppc64_dump_machdep_table(ulong arg)
 {
-        int others; 
+        int i, c, others; 
  
         others = 0;
         fprintf(fp, "              flags: %lx (", machdep->flags);
@@ -368,10 +369,43 @@
         fprintf(fp, "   max_physmem_bits: %ld\n", machdep->max_physmem_bits);
         fprintf(fp, "  sections_per_root: %ld\n", machdep->sections_per_root);
 	fprintf(fp, "           machspec: %lx\n", (ulong)machdep->machspec);
-	fprintf(fp, "     pgd_index_size: %d\n", machdep->machspec->l4_index_size);
-	fprintf(fp, "     pud_index_size: %d\n", machdep->machspec->l3_index_size);
-	fprintf(fp, "     pmd_index_size: %d\n", machdep->machspec->l2_index_size);
-	fprintf(fp, "     pte_index_size: %d\n", machdep->machspec->l1_index_size);
+	fprintf(fp, "     hwintrstack[%d]: ", NR_CPUS, machdep->machspec->l4_index_size);
+       	for (c = 0; c < NR_CPUS; c++) {
+		for (others = 0, i = c; i < NR_CPUS; i++) {
+			if (machdep->machspec->hwintrstack[i])
+				others++;
+		}
+		if (!others) {
+			fprintf(fp, "%s%s", 
+			        c && ((c % 4) == 0) ? "\n  " : "",
+				c ? "(remainder unused)" : "(unused)");
+			break;
+		}
+
+		fprintf(fp, "%s%016lx ", 
+			((c % 4) == 0) ? "\n  " : "",
+			machdep->machspec->hwintrstack[c]);
+	}
+	fprintf(fp, "\n");
+	fprintf(fp, "           hwstackbuf: %lx\n", (ulong)machdep->machspec->hwstackbuf);
+	fprintf(fp, "          hwstacksize: %d\n", (ulong)machdep->machspec->hwstacksize);
+	fprintf(fp, "               level4: %lx\n", (ulong)machdep->machspec->level4);
+	fprintf(fp, "     last_level4_read: %lx\n", (ulong)machdep->machspec->last_level4_read);
+	fprintf(fp, "        l4_index_size: %d\n", machdep->machspec->l4_index_size);
+	fprintf(fp, "        l3_index_size: %d\n", machdep->machspec->l3_index_size);
+	fprintf(fp, "        l2_index_size: %d\n", machdep->machspec->l2_index_size);
+	fprintf(fp, "        l1_index_size: %d\n", machdep->machspec->l1_index_size);
+	fprintf(fp, "          ptrs_per_l3: %d\n", machdep->machspec->ptrs_per_l3);
+	fprintf(fp, "          ptrs_per_l2: %d\n", machdep->machspec->ptrs_per_l2);
+	fprintf(fp, "          ptrs_per_l1: %d\n", machdep->machspec->ptrs_per_l1);
+	fprintf(fp, "             l4_shift: %d\n", machdep->machspec->l4_shift);
+	fprintf(fp, "             l3_shift: %d\n", machdep->machspec->l3_shift);
+	fprintf(fp, "             l2_shift: %d\n", machdep->machspec->l2_shift);
+	fprintf(fp, "             l1_shift: %d\n", machdep->machspec->l1_shift);
+	fprintf(fp, "            pte_shift: %d\n", machdep->machspec->pte_shift);
+	fprintf(fp, "       l2_masked_bits: %d\n", machdep->machspec->l2_masked_bits);
+
+
 }
 
 /*
--
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