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