Date: Fri, 18 Jan 2008 21:52:50 GMT From: Scott Long <scottl@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 133602 for review Message-ID: <200801182152.m0ILqoDZ090822@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=133602 Change 133602 by scottl@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; }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200801182152.m0ILqoDZ090822>