PERFORCE change 117915 for review
Oleksandr Tymoshenko
gonzo at FreeBSD.org
Wed Apr 11 19:09:43 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=117915
Change 117915 by gonzo at gonzo_jeeves on 2007/04/11 19:08:48
o Obsolete pmap_page_protect in favour of pmap_remove_write
o Dump physical memory chunks in verbose mode
o Get rid of PG_BUSY flug
o Set PG_WRITABLE in pmap_enter
Affected files ...
.. //depot/projects/mips2/src/sys/mips/mips/pmap.c#27 edit
Differences ...
==== //depot/projects/mips2/src/sys/mips/mips/pmap.c#27 (text+ko) ====
@@ -315,6 +315,22 @@
}
}
+ if (bootverbose) {
+ int indx;
+
+ printf("Physical memory chunk(s):\n");
+ for (indx = 0; phys_avail[indx + 1] != 0; indx += 2) {
+ vm_paddr_t size;
+
+ size = phys_avail[indx + 1] - phys_avail[indx];
+ printf("%#08jx - %#08jx, %ju bytes (%ju pages)\n",
+ (uintmax_t)phys_avail[indx],
+ (uintmax_t)phys_avail[indx + 1] - 1,
+ (uintmax_t)size, (uintmax_t)size / PAGE_SIZE);
+ }
+ }
+
+
/*
* Steal the message buffer from the beginning of memory.
*/
@@ -766,7 +782,6 @@
VM_ALLOC_NORMAL | VM_ALLOC_RETRY | VM_ALLOC_WIRED | VM_ALLOC_ZERO);
vm_page_lock_queues();
- vm_page_flag_clear(lev1pg, PG_BUSY);
lev1pg->valid = VM_PAGE_BITS_ALL;
vm_page_unlock_queues();
VM_OBJECT_UNLOCK(pmap->pm_pteobj);
@@ -1221,10 +1236,7 @@
if(!mem)
panic("pmap_enter: failed to get a page for lev2 segment");
- vm_page_lock_queues();
- vm_page_flag_clear(mem, PG_BUSY);
mem->valid = VM_PAGE_BITS_ALL;
- vm_page_unlock_queues();
VM_OBJECT_UNLOCK(pmap->pm_pteobj);
pmap_segmap(pmap, va) =
@@ -1304,6 +1316,13 @@
if (wired)
pmap->pm_stats.wired_count++;
+ if(prot & VM_PROT_WRITE)
+ {
+ vm_page_lock_queues();
+ vm_page_flag_set(m, PG_WRITEABLE);
+ vm_page_unlock_queues();
+ }
+
wired = wired ? PG_W : 0;
global = pmap == kernel_pmap ? PG_G : 0;
p = pte_prot(pmap, prot);
@@ -1576,42 +1595,36 @@
}
/*
- * pmap_page_protect:
- *
- * Lower the permission for all mappings to a given page.
+ * Clear the write and modified bits in each of the given page's mappings.
*/
void
-pmap_page_protect(vm_page_t m, vm_prot_t prot)
+pmap_remove_write(vm_page_t m)
{
pv_entry_t pv, npv;
vm_offset_t va;
pt_entry_t *pte;
- /*
- * Consider only readonly case
+ if((m->flags & PG_WRITEABLE) == 0)
+ return;
+
+ /*
+ * Loop over all current mappings
+ * setting/clearing as appropos.
*/
- if ((prot & VM_PROT_WRITE) == 0) {
- if (prot & (VM_PROT_READ | VM_PROT_EXECUTE)) {
- /*
- * Loop over all current mappings
- * setting/clearing as appropos.
- */
- for(pv = TAILQ_FIRST(&m->md.pv_list); pv; pv = npv) {
- npv = TAILQ_NEXT(pv, pv_plist);
- pte = pmap_pte(pv->pv_pmap, pv->pv_va);
-
- if ((pte == NULL) || !pte_valid(pte))
- panic("page on pm_pvlist has no pte\n");
+ for(pv = TAILQ_FIRST(&m->md.pv_list); pv; pv = npv)
+ {
+ npv = TAILQ_NEXT(pv, pv_plist);
+ pte = pmap_pte(pv->pv_pmap, pv->pv_va);
+
+ if ((pte == NULL) || !pte_valid(pte))
+ panic("page on pm_pvlist has no pte\n");
- va = pv->pv_va;
- pmap_protect(pv->pv_pmap, va, va + PAGE_SIZE,
- prot);
+ va = pv->pv_va;
+ pmap_protect(pv->pv_pmap, va, va + PAGE_SIZE,
+ VM_PROT_READ | VM_PROT_EXECUTE);
+ }
- }
- } else {
- pmap_remove_all(m);
- }
- }
+ vm_page_flag_clear(m, PG_WRITEABLE);
}
/*
More information about the p4-projects
mailing list