PERFORCE change 133602 for review

Scott Long scottl at FreeBSD.org
Fri Jan 18 13:52:51 PST 2008


http://perforce.freebsd.org/chv.cgi?CH=133602

Change 133602 by scottl at scottl-ix on 2008/01/18 21:52:25

	Merge more console and pmap fixes from xen31

Affected files ...

.. //depot/projects/xen31-xenbus/sys/dev/xen/console/console.c#3 integrate
.. //depot/projects/xen31-xenbus/sys/i386/xen/pmap.c#3 integrate

Differences ...

==== //depot/projects/xen31-xenbus/sys/dev/xen/console/console.c#3 (text+ko) ====

@@ -19,6 +19,7 @@
 #include <machine/xen/xen_intr.h>
 #include <sys/cons.h>
 #include <sys/priv.h>
+#include <sys/proc.h>
 
 #include <dev/xen/console/xencons_ring.h>
 #include <xen/interface/io/console.h>
@@ -78,8 +79,16 @@
 #define CN_LOCK_INIT(x, _name) \
         mtx_init(&x, _name, NULL, MTX_SPIN|MTX_RECURSE)
 
-#define CN_LOCK(l)        mtx_lock_spin(&(l))
-#define CN_UNLOCK(l)      mtx_unlock_spin(&(l))
+#define CN_LOCK(l)        								\
+		do {											\
+				if (panicstr == NULL)					\
+                        mtx_lock_spin(&(l));			\
+		} while (0)
+#define CN_UNLOCK(l)        							\
+		do {											\
+				if (panicstr == NULL)					\
+                        mtx_unlock_spin(&(l));			\
+		} while (0)
 #define CN_LOCK_ASSERT(x)    mtx_assert(&x, MA_OWNED)
 #define CN_LOCK_DESTROY(x)   mtx_destroy(&x)
 
@@ -318,8 +327,12 @@
 		work_done = 1;
 	}
 	CN_UNLOCK(cn_mtx);
-	
-	if (work_done && xen_console_up)
+
+	/*
+	 * ttwakeup calls routines using blocking locks
+	 *
+	 */
+	if (work_done && xen_console_up && curthread->td_critnest == 0)
 		ttwakeup(xccons);
 }
 

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

@@ -332,13 +332,13 @@
 	switch (type) {
 	case SH_PD_SET_VA:
 		xen_queue_pt_update(shadow_pdir_ma,
-				    xpmap_ptom(val & ~(PG_RW|PG_M)));
+				    xpmap_ptom(val & ~(PG_RW)));
 		xen_queue_pt_update(pdir_ma,
 				    xpmap_ptom(val)); 	
 		break;
 	case SH_PD_SET_VA_MA:
 		xen_queue_pt_update(shadow_pdir_ma,
-				    val & ~(PG_RW|PG_M));
+				    val & ~(PG_RW));
 		xen_queue_pt_update(pdir_ma, val); 	
 		break;
 	case SH_PD_SET_VA_CLEAR:
@@ -948,7 +948,7 @@
 		mtx_lock(&PMAP2mutex);
 		newpf = *pde & PG_FRAME;
 		if ((*PMAP2 & PG_FRAME) != newpf) {
-			*PMAP2 = newpf | PG_V | PG_A;
+			*PMAP2 = newpf | PG_V | PG_A | PG_M;
 			pmap_invalidate_page(kernel_pmap, (vm_offset_t)PADDR2);
 		}
 		return (PADDR2 + (i386_btop(va) & (NPTEPG - 1)));
@@ -1005,7 +1005,7 @@
 		KASSERT(curthread->td_pinned > 0, ("curthread not pinned"));
 		newpf = *pde & PG_FRAME;
 		if ((*PMAP1 & PG_FRAME) != newpf) {
-			*PMAP1 = newpf | PG_V | PG_A;
+			*PMAP1 = newpf | PG_V | PG_A | PG_M;
 #ifdef SMP
 			PMAP1cpu = PCPU_GET(cpuid);
 #endif
@@ -1457,7 +1457,7 @@
 		pmap->pm_pdir[PTDPTDI + i] =
 		    xpmap_ptom(VM_PAGE_TO_PHYS(ptdpg[i + NPGPTD])) | PG_V;
 	for (i = KPTDI; i < KPTDI + nkpt; i++)
-		pmap->pm_pdir_shadow[i] = PTD[i] & ~(PG_RW|PG_M|PG_A);
+		pmap->pm_pdir_shadow[i] = PTD[i] & ~(PG_RW);
 	for (i = 0; i < NPGPTD; i++) {
 		pt_entry_t *pd;
 
@@ -2161,8 +2161,16 @@
 	 * why, but I think the most likely explanation is that xen's writable
 	 * page table implementation doesn't respect the unused bits.
 	 */
-	if ((oldpte & PG_MANAGED) || ((oldpte & PG_V) && (va < VM_MAXUSER_ADDRESS))) {
+	if ((oldpte & PG_MANAGED)
+#ifdef PTEBROKEN
+	    || ((oldpte & PG_V) && (va < VM_MAXUSER_ADDRESS))
+#endif
+		) {
 		m = PHYS_TO_VM_PAGE(xpmap_mtop(oldpte) & PG_FRAME);
+
+		if (!(oldpte & PG_MANAGED))
+			printf("va=0x%x is unmanaged :-( pte=0x%llx\n", va, oldpte);
+
 		if (oldpte & PG_M) {
 			KASSERT((oldpte & PG_RW),
 	("pmap_remove_pte: modified page not writable: va: %#x, pte: %#jx",
@@ -2172,11 +2180,9 @@
 		if (oldpte & PG_A)
 			vm_page_flag_set(m, PG_REFERENCED);
 		pmap_remove_entry(pmap, m, va);
-	}
-#ifdef DEBUG
-	else if (va < VM_MAXUSER_ADDRESS) 
-		printf("va=0x%x is unmanaged :-( \n", va);
-#endif	
+	} else if ((va < VM_MAXUSER_ADDRESS) && (oldpte & PG_V))
+		printf("va=0x%x is unmanaged :-( pte=0x%llx\n", va, oldpte);
+
 	return (pmap_unuse_pt(pmap, va, free));
 }
 
@@ -2932,7 +2938,7 @@
 		npdes = size >> PDRSHIFT;
 		for(i = 0; i < npdes; i++) {
 			PD_SET_VA(pmap, ptepindex,
-			    ptepa | PG_U | PG_RW | PG_V | PG_PS, FALSE);
+			    ptepa | PG_U | PG_M | PG_RW | PG_V | PG_PS, FALSE);
 			ptepa += NBPDR;
 			ptepindex += 1;
 		}


More information about the p4-projects mailing list