summaryrefslogtreecommitdiff
path: root/sys/arch/mac68k
diff options
context:
space:
mode:
Diffstat (limited to 'sys/arch/mac68k')
-rw-r--r--sys/arch/mac68k/mac68k/pmap.c78
1 files changed, 55 insertions, 23 deletions
diff --git a/sys/arch/mac68k/mac68k/pmap.c b/sys/arch/mac68k/mac68k/pmap.c
index a97f05d39d0..72b9f2655d3 100644
--- a/sys/arch/mac68k/mac68k/pmap.c
+++ b/sys/arch/mac68k/mac68k/pmap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pmap.c,v 1.25 2001/06/27 04:22:38 art Exp $ */
+/* $OpenBSD: pmap.c,v 1.26 2001/07/18 10:47:04 art Exp $ */
/* $NetBSD: pmap.c,v 1.55 1999/04/22 04:24:53 chs Exp $ */
/*
@@ -663,21 +663,14 @@ pmap_map(va, spa, epa, prot)
*
* Note: no locking is necessary in this function.
*/
-pmap_t
-pmap_create(size)
- vsize_t size;
+struct pmap *
+pmap_create(void)
{
- pmap_t pmap;
+ struct pmap *pmap;
PMAP_DPRINTF(PDB_FOLLOW|PDB_CREATE,
("pmap_create(%lx)\n", size));
- /*
- * Software use map does not need a pmap
- */
- if (size)
- return (NULL);
-
pmap = pool_get(&pmap_pmap_pool, PR_WAITOK);
bzero(pmap, sizeof(*pmap));
@@ -896,13 +889,14 @@ pmap_remove(pmap, sva, eva)
* the permissions specified.
*/
void
-pmap_page_protect(pa, prot)
- paddr_t pa;
- vm_prot_t prot;
+pmap_page_protect(struct vm_page *pg, vm_prot_t prot)
{
+ paddr_t pa;
struct pv_entry *pv;
int s;
+ pa = VM_PAGE_TO_PHYS(pg);
+
#ifdef DEBUG
if ((pmapdebug & (PDB_FOLLOW|PDB_PROTECT)) ||
(prot == VM_PROT_NONE && (pmapdebug & PDB_REMOVE)))
@@ -1654,14 +1648,19 @@ pmap_copy_page(src, dst)
*
* Clear the modify bits on the specified physical page.
*/
-void
-pmap_clear_modify(pa)
- paddr_t pa;
+boolean_t
+pmap_clear_modify(struct vm_page *pg)
{
+ paddr_t pa = VM_PAGE_TO_PHYS(pg);
+ boolean_t ret;
+
+ ret = pmap_is_modified(pg);
PMAP_DPRINTF(PDB_FOLLOW, ("pmap_clear_modify(%lx)\n", pa));
pmap_changebit(pa, 0, ~PG_M);
+
+ return (ret);
}
/*
@@ -1670,13 +1669,18 @@ pmap_clear_modify(pa)
* Clear the reference bit on the specified physical page.
*/
void
-pmap_clear_reference(pa)
- paddr_t pa;
+pmap_clear_reference(struct vm_page *pg)
{
+ paddr_t pa = VM_PAGE_TO_PHYS(pg);
+ boolean_t ret;
+
+ ret = pmap_is_referenced(pg);
PMAP_DPRINTF(PDB_FOLLOW, ("pmap_clear_reference(%lx)\n", pa));
pmap_changebit(pa, 0, ~PG_U);
+
+ return (ret);
}
/*
@@ -1686,9 +1690,10 @@ pmap_clear_reference(pa)
* by any physical maps.
*/
boolean_t
-pmap_is_referenced(pa)
- paddr_t pa;
+pmap_is_referenced(struct vm_page *pg)
{
+ paddr_t pa = VM_PAGE_TO_PHYS(pg);
+
#ifdef DEBUG
if (pmapdebug & PDB_FOLLOW) {
boolean_t rv = pmap_testbit(pa, PG_U);
@@ -1706,9 +1711,10 @@ pmap_is_referenced(pa)
* by any physical maps.
*/
boolean_t
-pmap_is_modified(pa)
- paddr_t pa;
+pmap_is_modified(struct vm_page *pg)
{
+ paddr_t pa = VM_PAGE_TO_PHYS(pg);
+
#ifdef DEBUG
if (pmapdebug & PDB_FOLLOW) {
boolean_t rv = pmap_testbit(pa, PG_M);
@@ -2352,3 +2358,29 @@ pmap_check_wiring(str, va)
str, va, entry->wired_count, count);
}
#endif /* DEBUG */
+
+void
+pmap_kenter_pa(vaddr_t va, paddr_t pa, vm_prot_t prot)
+{
+ pmap_enter(pmap_kernel(), va, pa, prot, 1, VM_PROT_READ|VM_PROT_WRITE);
+}
+
+void
+pmap_kenter_pgs(vaddr_t va, struct vm_page **pgs, int npgs)
+{
+ int i;
+
+ for (i = 0; i < npgs; i++, va += PAGE_SIZE) {
+ pmap_enter(pmap_kernel(), va, VM_PAGE_TO_PHYS(pgs[i]),
+ VM_PROT_READ|VM_PROT_WRITE, 1,
+ VM_PROT_READ|VM_PROT_WRITE);
+ }
+}
+
+void
+pmap_kremove(vaddr_t va, vsize_t len)
+{
+ for (len >>= PAGE_SHIFT; len > 0; len--, va += PAGE_SIZE) {
+ pmap_remove(pmap_kernel(), va, va + PAGE_SIZE);
+ }
+}