summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/amd64/amd64/pmap.c65
-rw-r--r--sys/amd64/include/pmap.h2
-rw-r--r--sys/i386/i386/pmap.c65
-rw-r--r--sys/i386/include/pmap.h2
4 files changed, 82 insertions, 52 deletions
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c
index ca469aa..7531770 100644
--- a/sys/amd64/amd64/pmap.c
+++ b/sys/amd64/amd64/pmap.c
@@ -757,6 +757,39 @@ pmap_invalidate_all(pmap_t pmap)
#endif /* !I386_CPU */
/*
+ * Are we current address space or kernel?
+ */
+static __inline int
+pmap_is_current(pmap_t pmap)
+{
+ return (pmap == kernel_pmap ||
+ (pmap->pm_pdir[PTDPTDI] & PG_FRAME) == (PTDpde[0] & PG_FRAME));
+}
+
+/*
+ * Are we alternate address space?
+ */
+static __inline int
+pmap_is_alternate(pmap_t pmap)
+{
+ return ((pmap->pm_pdir[PTDPTDI] & PG_FRAME) ==
+ (APTDpde[0] & PG_FRAME));
+}
+
+/*
+ * Map in a pmap's pagetables as alternate address space.
+ */
+static __inline void
+pmap_set_alternate(pmap_t pmap)
+{
+
+ if (!pmap_is_alternate(pmap)) {
+ APTDpde[0] = pmap->pm_pdir[PTDPTDI];
+ pmap_invalidate_all(kernel_pmap); /* XXX Bandaid */
+ }
+}
+
+/*
* Return an address which is the base of the Virtual mapping of
* all the PTEs for the given pmap. Note this doesn't say that
* all the PTEs will be present or that the pages there are valid.
@@ -767,19 +800,10 @@ static pt_entry_t *
get_ptbase(pmap)
pmap_t pmap;
{
- pd_entry_t frame;
- /* are we current address space or kernel? */
- if (pmap == kernel_pmap)
- return PTmap;
- frame = pmap->pm_pdir[PTDPTDI] & PG_FRAME;
- if (frame == (PTDpde & PG_FRAME))
+ if (pmap_is_current(pmap))
return PTmap;
- /* otherwise, we are alternate address space */
- if (frame != (APTDpde & PG_FRAME)) {
- APTDpde = (pd_entry_t) (frame | PG_RW | PG_V);
- pmap_invalidate_all(kernel_pmap); /* XXX Bandaid */
- }
+ pmap_set_alternate(pmap);
return APTmap;
}
@@ -799,10 +823,9 @@ pmap_pte_quick(pmap, va)
pd_entry_t pde, newpf;
pde = pmap->pm_pdir[va >> PDRSHIFT];
if (pde != 0) {
- pd_entry_t frame = pmap->pm_pdir[PTDPTDI] & PG_FRAME;
unsigned index = i386_btop(va);
/* are we current address space or kernel? */
- if (pmap == kernel_pmap || frame == (PTDpde & PG_FRAME))
+ if (pmap_is_current(pmap))
return PTmap + index;
newpf = pde & PG_FRAME;
if (((*PMAP1) & PG_FRAME) != newpf) {
@@ -1191,8 +1214,7 @@ _pmap_unwire_pte_hold(pmap_t pmap, vm_page_t m)
*/
pmap->pm_pdir[m->pindex] = 0;
--pmap->pm_stats.resident_count;
- if ((pmap->pm_pdir[PTDPTDI] & PG_FRAME) ==
- (PTDpde & PG_FRAME)) {
+ if (pmap_is_current(pmap)) {
/*
* Do an invltlb to make the invalidated mapping
* take effect immediately.
@@ -1423,8 +1445,7 @@ _pmap_allocpte(pmap, ptepindex)
* do it with the routine that maps the page explicitly.
*/
if ((m->flags & PG_ZERO) == 0) {
- if ((pmap->pm_pdir[PTDPTDI] & PG_FRAME) ==
- (PTDpde & PG_FRAME)) {
+ if (pmap_is_current(pmap)) {
pteva = VM_MAXUSER_ADDRESS + i386_ptob(ptepindex);
bzero((caddr_t) pteva, PAGE_SIZE);
} else {
@@ -2611,17 +2632,14 @@ pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, vm_size_t len,
vm_offset_t addr;
vm_offset_t end_addr = src_addr + len;
vm_offset_t pdnxt;
- pd_entry_t src_frame, dst_frame;
vm_page_t m;
if (dst_addr != src_addr)
return;
- src_frame = src_pmap->pm_pdir[PTDPTDI] & PG_FRAME;
- if (src_frame != (PTDpde & PG_FRAME))
+ if (!pmap_is_current(src_pmap))
return;
- dst_frame = dst_pmap->pm_pdir[PTDPTDI] & PG_FRAME;
for (addr = src_addr; addr < end_addr; addr = pdnxt) {
pt_entry_t *src_pte, *dst_pte;
vm_page_t dstmpte, srcmpte;
@@ -2667,10 +2685,7 @@ pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, vm_size_t len,
* Have to recheck this before every avtopte() call below
* in case we have blocked and something else used APTDpde.
*/
- if (dst_frame != (APTDpde & PG_FRAME)) {
- APTDpde = dst_frame | PG_RW | PG_V;
- pmap_invalidate_all(kernel_pmap); /* XXX Bandaid */
- }
+ pmap_set_alternate(dst_pmap);
src_pte = vtopte(addr);
dst_pte = avtopte(addr);
while (addr < pdnxt) {
diff --git a/sys/amd64/include/pmap.h b/sys/amd64/include/pmap.h
index 0c667ad..e199eed 100644
--- a/sys/amd64/include/pmap.h
+++ b/sys/amd64/include/pmap.h
@@ -147,7 +147,7 @@ typedef u_int32_t pt_entry_t;
#ifdef _KERNEL
extern pt_entry_t PTmap[], APTmap[];
extern pd_entry_t PTD[], APTD[];
-extern pd_entry_t PTDpde, APTDpde;
+extern pd_entry_t PTDpde[], APTDpde[];
extern pd_entry_t *IdlePTD; /* physical address of "Idle" state directory */
#endif
diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c
index ca469aa..7531770 100644
--- a/sys/i386/i386/pmap.c
+++ b/sys/i386/i386/pmap.c
@@ -757,6 +757,39 @@ pmap_invalidate_all(pmap_t pmap)
#endif /* !I386_CPU */
/*
+ * Are we current address space or kernel?
+ */
+static __inline int
+pmap_is_current(pmap_t pmap)
+{
+ return (pmap == kernel_pmap ||
+ (pmap->pm_pdir[PTDPTDI] & PG_FRAME) == (PTDpde[0] & PG_FRAME));
+}
+
+/*
+ * Are we alternate address space?
+ */
+static __inline int
+pmap_is_alternate(pmap_t pmap)
+{
+ return ((pmap->pm_pdir[PTDPTDI] & PG_FRAME) ==
+ (APTDpde[0] & PG_FRAME));
+}
+
+/*
+ * Map in a pmap's pagetables as alternate address space.
+ */
+static __inline void
+pmap_set_alternate(pmap_t pmap)
+{
+
+ if (!pmap_is_alternate(pmap)) {
+ APTDpde[0] = pmap->pm_pdir[PTDPTDI];
+ pmap_invalidate_all(kernel_pmap); /* XXX Bandaid */
+ }
+}
+
+/*
* Return an address which is the base of the Virtual mapping of
* all the PTEs for the given pmap. Note this doesn't say that
* all the PTEs will be present or that the pages there are valid.
@@ -767,19 +800,10 @@ static pt_entry_t *
get_ptbase(pmap)
pmap_t pmap;
{
- pd_entry_t frame;
- /* are we current address space or kernel? */
- if (pmap == kernel_pmap)
- return PTmap;
- frame = pmap->pm_pdir[PTDPTDI] & PG_FRAME;
- if (frame == (PTDpde & PG_FRAME))
+ if (pmap_is_current(pmap))
return PTmap;
- /* otherwise, we are alternate address space */
- if (frame != (APTDpde & PG_FRAME)) {
- APTDpde = (pd_entry_t) (frame | PG_RW | PG_V);
- pmap_invalidate_all(kernel_pmap); /* XXX Bandaid */
- }
+ pmap_set_alternate(pmap);
return APTmap;
}
@@ -799,10 +823,9 @@ pmap_pte_quick(pmap, va)
pd_entry_t pde, newpf;
pde = pmap->pm_pdir[va >> PDRSHIFT];
if (pde != 0) {
- pd_entry_t frame = pmap->pm_pdir[PTDPTDI] & PG_FRAME;
unsigned index = i386_btop(va);
/* are we current address space or kernel? */
- if (pmap == kernel_pmap || frame == (PTDpde & PG_FRAME))
+ if (pmap_is_current(pmap))
return PTmap + index;
newpf = pde & PG_FRAME;
if (((*PMAP1) & PG_FRAME) != newpf) {
@@ -1191,8 +1214,7 @@ _pmap_unwire_pte_hold(pmap_t pmap, vm_page_t m)
*/
pmap->pm_pdir[m->pindex] = 0;
--pmap->pm_stats.resident_count;
- if ((pmap->pm_pdir[PTDPTDI] & PG_FRAME) ==
- (PTDpde & PG_FRAME)) {
+ if (pmap_is_current(pmap)) {
/*
* Do an invltlb to make the invalidated mapping
* take effect immediately.
@@ -1423,8 +1445,7 @@ _pmap_allocpte(pmap, ptepindex)
* do it with the routine that maps the page explicitly.
*/
if ((m->flags & PG_ZERO) == 0) {
- if ((pmap->pm_pdir[PTDPTDI] & PG_FRAME) ==
- (PTDpde & PG_FRAME)) {
+ if (pmap_is_current(pmap)) {
pteva = VM_MAXUSER_ADDRESS + i386_ptob(ptepindex);
bzero((caddr_t) pteva, PAGE_SIZE);
} else {
@@ -2611,17 +2632,14 @@ pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, vm_size_t len,
vm_offset_t addr;
vm_offset_t end_addr = src_addr + len;
vm_offset_t pdnxt;
- pd_entry_t src_frame, dst_frame;
vm_page_t m;
if (dst_addr != src_addr)
return;
- src_frame = src_pmap->pm_pdir[PTDPTDI] & PG_FRAME;
- if (src_frame != (PTDpde & PG_FRAME))
+ if (!pmap_is_current(src_pmap))
return;
- dst_frame = dst_pmap->pm_pdir[PTDPTDI] & PG_FRAME;
for (addr = src_addr; addr < end_addr; addr = pdnxt) {
pt_entry_t *src_pte, *dst_pte;
vm_page_t dstmpte, srcmpte;
@@ -2667,10 +2685,7 @@ pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, vm_size_t len,
* Have to recheck this before every avtopte() call below
* in case we have blocked and something else used APTDpde.
*/
- if (dst_frame != (APTDpde & PG_FRAME)) {
- APTDpde = dst_frame | PG_RW | PG_V;
- pmap_invalidate_all(kernel_pmap); /* XXX Bandaid */
- }
+ pmap_set_alternate(dst_pmap);
src_pte = vtopte(addr);
dst_pte = avtopte(addr);
while (addr < pdnxt) {
diff --git a/sys/i386/include/pmap.h b/sys/i386/include/pmap.h
index 0c667ad..e199eed 100644
--- a/sys/i386/include/pmap.h
+++ b/sys/i386/include/pmap.h
@@ -147,7 +147,7 @@ typedef u_int32_t pt_entry_t;
#ifdef _KERNEL
extern pt_entry_t PTmap[], APTmap[];
extern pd_entry_t PTD[], APTD[];
-extern pd_entry_t PTDpde, APTDpde;
+extern pd_entry_t PTDpde[], APTDpde[];
extern pd_entry_t *IdlePTD; /* physical address of "Idle" state directory */
#endif
OpenPOWER on IntegriCloud