PERFORCE change 111907 for review
Oleksandr Tymoshenko
gonzo at FreeBSD.org
Mon Dec 18 10:59:32 PST 2006
http://perforce.freebsd.org/chv.cgi?CH=111907
Change 111907 by gonzo at gonzo_hq on 2006/12/18 18:56:53
o Clean out pmap_pte_XXX bits checking macroses, use those
presented in pte.h header file.
o Brace sensitve section of pmap_protect with
vm_page_lock_queues/vm_page_unlock_queues calls.
Affected files ...
.. //depot/projects/mips2/src/sys/mips/mips/pmap.c#18 edit
Differences ...
==== //depot/projects/mips2/src/sys/mips/mips/pmap.c#18 (text+ko) ====
@@ -105,6 +105,7 @@
#include <machine/cache.h>
#include <machine/locore.h>
#include <machine/md_var.h>
+#include <machine/pte.h>
#include <machine/tlb.h>
#ifndef PMAP_SHPGPERPROC
@@ -133,21 +134,9 @@
/*
* Get PDEs and PTEs for user/kernel address space
*/
-#define pmap_pte_ro(pte) ((*(pte) & PG_RO) != 0)
-#define pmap_pte_w(pte) ((*(pte) & PG_W) != 0)
-#define pmap_pte_v(pte) ((*(pte) & PG_V) != 0)
-#define pmap_pte_pa(pte) (MIPS_PTE_TO_PA(*(pte)))
-#define pmap_pte_prot(pte) (*(pte) & PG_PROT)
-
-#define pmap_pte_set_prot(pte, v) ((*pte &= ~PG_PROT), (*pte |= (v)))
-
-/*
- * Given a map and a machine independent protection code,
- * convert to a mips protection code.
- *
- * XXX
- */
-#define pte_prot(m, p) (0)
+#define pmap_pte_pa(pte) (MIPS_PTE_TO_PA(*(pte)))
+#define pmap_pte_prot(pte) (*(pte) & PG_PROT)
+#define pmap_pte_set_prot(pte, v) ((*pte &= ~PG_PROT), (*pte |= (v)))
/*
* Return non-zero if this pmap is currently active
@@ -210,6 +199,14 @@
vm_page_t mpte, vm_page_t m);
/*
+ * Given a map and a machine independent protection code,
+ * convert to a mips protection code.
+ *
+ * XXX
+ */
+#define pte_prot(m, p) (0)
+
+/*
* Routine: pmap_pte
* Function:
* Extract the page table entry associated with
@@ -1117,7 +1114,7 @@
* If pte is invalid, skip this page
*/
pte = pmap_pte(pmap, sva);
- if (!pmap_pte_v(pte)) {
+ if (!pte_valid(pte)) {
sva += PAGE_SIZE;
continue;
}
@@ -1125,6 +1122,8 @@
if (pmap_pte_prot(pte) != newprot) {
pt_entry_t oldpte = *pte;
vm_page_t m = NULL;
+
+ vm_page_lock_queues();
if ((oldpte & PG_D) == 0) {
m = PHYS_TO_VM_PAGE(pmap_pte_pa(pte));
vm_page_flag_set(m, PG_REFERENCED);
@@ -1139,6 +1138,7 @@
oldpte = (oldpte & ~PG_PROT) | newprot;
*pte = oldpte;
pmap_invalidate_page(pmap, sva);
+ vm_page_unlock_queues();
}
sva += PAGE_SIZE;
@@ -1498,7 +1498,7 @@
pv = npv) {
pte = pmap_pte(pv->pv_pmap, pv->pv_va);
- if (!pmap_pte_v(pte))
+ if (!pte_valid(pte))
panic("pmap_remove_pages: page on pm_pvlist has no pte\n");
tpte = *pte;
@@ -1541,6 +1541,9 @@
void
pmap_page_protect(vm_page_t m, vm_prot_t prot)
{
+ /*
+ * Consider only readonly case
+ */
if ((prot & VM_PROT_WRITE) == 0) {
if (prot & (VM_PROT_READ | VM_PROT_EXECUTE)) {
panic("pmap_page_protect unimplemented\n");
@@ -1729,7 +1732,7 @@
return 0;
}
- if (pmap_pte_v(pte)) {
+ if (pte_valid(pte)) {
vm_page_t m;
vm_offset_t pa;
More information about the p4-projects
mailing list