Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 17 Jan 2008 01:19:53 GMT
From:      Kip Macy <kmacy@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 133448 for review
Message-ID:  <200801170119.m0H1Jrpt081589@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=133448

Change 133448 by kmacy@pandemonium:kmacy:xen31 on 2008/01/17 01:19:23

	add copious asserts to check for invariants in pmap utility functions

Affected files ...

.. //depot/projects/xen31/sys/i386/xen/pmap.c#15 edit

Differences ...

==== //depot/projects/xen31/sys/i386/xen/pmap.c#15 (text+ko) ====

@@ -2805,7 +2805,7 @@
 	 * But that isn't as quick as vtopte.
 	 */
 	pte = vtopte(va);
-	if (*pte) {
+	if (*pte & PG_V) {
 		if (mpte != NULL) {
 			mpte->wire_count--;
 			mpte = NULL;
@@ -3123,6 +3123,9 @@
 #else	
 	*sysmaps->CMAP2 = PG_V | PG_RW | VM_PAGE_TO_PHYS(m) | PG_A | PG_M;
 #endif
+	KASSERT(*sysmaps->CMAP2 == (PG_V | PG_RW | xpmap_ptom(VM_PAGE_TO_PHYS(m)) | PG_A | PG_M),
+	    ("CMAP2 did not get set is %llx", *sysmaps->CMAP2));
+	
 	invlcaddr(sysmaps->CADDR2);
 	pagezero(sysmaps->CADDR2);
 	PT_CLEAR_VA(sysmaps->CMAP2, TRUE);
@@ -3193,17 +3196,25 @@
 	sysmaps = &sysmaps_pcpu[PCPU_GET(cpuid)];
 	mtx_lock(&sysmaps->lock);
 	if (*sysmaps->CMAP1)
-		panic("pmap_copy_page: CMAP1 busy");
+		panic("pmap_copy_page: CMAP1 busy, CMAP1=%llx", *sysmaps->CMAP1);
 	if (*sysmaps->CMAP2)
 		panic("pmap_copy_page: CMAP2 busy");
 	sched_pin();
 	invlpg((u_int)sysmaps->CADDR1);
 	invlpg((u_int)sysmaps->CADDR2);
-	PT_SET_VA(sysmaps->CMAP1, PG_V | VM_PAGE_TO_PHYS(src) | PG_A, FALSE);
+	PT_SET_VA(sysmaps->CMAP1, PG_V | VM_PAGE_TO_PHYS(src) | PG_A, TRUE);
 	PT_SET_VA(sysmaps->CMAP2, PG_V | PG_RW | VM_PAGE_TO_PHYS(dst) | PG_A | PG_M, TRUE);
+	KASSERT(*sysmaps->CMAP1 == (PG_V | xpmap_ptom(VM_PAGE_TO_PHYS(src)) | PG_A ),
+	    ("CMAP1 did not get set is %llx", *sysmaps->CMAP1));
+	KASSERT(*sysmaps->CMAP2 == (PG_V | PG_RW | xpmap_ptom(VM_PAGE_TO_PHYS(dst)) | PG_A | PG_M),
+	    ("CMAP2 did not get set is %llx", *sysmaps->CMAP2));	
 	bcopy(sysmaps->CADDR1, sysmaps->CADDR2, PAGE_SIZE);
 	PT_CLEAR_VA(sysmaps->CMAP1, FALSE);
 	PT_CLEAR_VA(sysmaps->CMAP2, TRUE);
+	if (*sysmaps->CMAP1)
+		panic("pmap_copy_page: CMAP1 busy, CMAP1=%llx", *sysmaps->CMAP1);
+	if (*sysmaps->CMAP2)
+		panic("pmap_copy_page: CMAP2 busy");
 	sched_unpin();
 	mtx_unlock(&sysmaps->lock);
 }
@@ -3317,9 +3328,8 @@
 					printf(
 					    "TPTE at %p  IS ZERO @ VA %08x\n",
 					    pte, pv->pv_va);
-					panic("bad pte");
+					panic("bad pte tpte");
 				}
-
 /*
  * We cannot remove wired pages from a process' mapping at this time
  */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200801170119.m0H1Jrpt081589>