aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2021-02-18 00:32:11 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2021-02-18 00:32:11 +0000
commit67932460c7b6893a637a47d98d5f29d63e92c727 (patch)
tree23ed861340f70fdc62a8048e99bb81571d4dbf1e
parentfa3bd463cee5c3abeac29a83dc86eb3abfa97b06 (diff)
downloadsrc-67932460c7b6893a637a47d98d5f29d63e92c727.tar.gz
src-67932460c7b6893a637a47d98d5f29d63e92c727.zip
Add a VA_IS_CLEANMAP() macro.
This macro returns true if a provided virtual address is contained in the kernel's clean submap. In CHERI kernels, the buffer cache and transient I/O map are allocated as separate regions. Abstracting this check reduces the diff relative to FreeBSD. It is perhaps slightly more readable as well. Reviewed by: kib Obtained from: CheriBSD Sponsored by: DARPA Differential Revision: https://reviews.freebsd.org/D28710
-rw-r--r--sys/amd64/amd64/pmap.c5
-rw-r--r--sys/arm/arm/pmap-v6.c5
-rw-r--r--sys/arm64/arm64/pmap.c2
-rw-r--r--sys/i386/i386/pmap.c6
-rw-r--r--sys/mips/mips/pmap.c5
-rw-r--r--sys/powerpc/aim/mmu_radix.c5
-rw-r--r--sys/riscv/riscv/pmap.c2
-rw-r--r--sys/vm/vm.h3
8 files changed, 16 insertions, 17 deletions
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c
index 0e1d1c02d1fc..7dddeb3ee4ea 100644
--- a/sys/amd64/amd64/pmap.c
+++ b/sys/amd64/amd64/pmap.c
@@ -6747,8 +6747,7 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
KASSERT(va < UPT_MIN_ADDRESS || va >= UPT_MAX_ADDRESS,
("pmap_enter: invalid to pmap_enter page table pages (va: 0x%lx)",
va));
- KASSERT((m->oflags & VPO_UNMANAGED) != 0 || va < kmi.clean_sva ||
- va >= kmi.clean_eva,
+ KASSERT((m->oflags & VPO_UNMANAGED) != 0 || !VA_IS_CLEANMAP(va),
("pmap_enter: managed mapping within the clean submap"));
if ((m->oflags & VPO_UNMANAGED) == 0)
VM_PAGE_OBJECT_BUSY_ASSERT(m);
@@ -7262,7 +7261,7 @@ pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m,
{
pt_entry_t newpte, *pte, PG_V;
- KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva ||
+ KASSERT(!VA_IS_CLEANMAP(va) ||
(m->oflags & VPO_UNMANAGED) != 0,
("pmap_enter_quick_locked: managed mapping within the clean submap"));
PG_V = pmap_valid_bit(pmap);
diff --git a/sys/arm/arm/pmap-v6.c b/sys/arm/arm/pmap-v6.c
index c9b939f6ce34..f596ace35ba7 100644
--- a/sys/arm/arm/pmap-v6.c
+++ b/sys/arm/arm/pmap-v6.c
@@ -3873,8 +3873,7 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
KASSERT(va < UPT2V_MIN_ADDRESS || va >= UPT2V_MAX_ADDRESS,
("%s: invalid to pmap_enter page table pages (va: 0x%x)", __func__,
va));
- KASSERT((m->oflags & VPO_UNMANAGED) != 0 || va < kmi.clean_sva ||
- va >= kmi.clean_eva,
+ KASSERT((m->oflags & VPO_UNMANAGED) != 0 || !VA_IS_CLEANMAP(va),
("%s: managed mapping within the clean submap", __func__));
if ((m->oflags & VPO_UNMANAGED) == 0)
VM_PAGE_OBJECT_BUSY_ASSERT(m);
@@ -4535,7 +4534,7 @@ pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m,
struct spglist free;
uint32_t l2prot;
- KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva ||
+ KASSERT(!VA_IS_CLEANMAP(va) ||
(m->oflags & VPO_UNMANAGED) != 0,
("%s: managed mapping within the clean submap", __func__));
rw_assert(&pvh_global_lock, RA_WLOCKED);
diff --git a/sys/arm64/arm64/pmap.c b/sys/arm64/arm64/pmap.c
index d4047fc84096..bb307b79d4c2 100644
--- a/sys/arm64/arm64/pmap.c
+++ b/sys/arm64/arm64/pmap.c
@@ -4438,7 +4438,7 @@ pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m,
vm_paddr_t pa;
int lvl;
- KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva ||
+ KASSERT(!VA_IS_CLEANMAP(va) ||
(m->oflags & VPO_UNMANAGED) != 0,
("pmap_enter_quick_locked: managed mapping within the clean submap"));
PMAP_LOCK_ASSERT(pmap, MA_OWNED);
diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c
index bc650cf378e0..b1014b332150 100644
--- a/sys/i386/i386/pmap.c
+++ b/sys/i386/i386/pmap.c
@@ -3654,7 +3654,7 @@ __CONCAT(PMTYPE, enter)(pmap_t pmap, vm_offset_t va, vm_page_t m,
("pmap_enter: invalid to pmap_enter into trampoline (va: 0x%x)",
va));
KASSERT(pmap != kernel_pmap || (m->oflags & VPO_UNMANAGED) != 0 ||
- va < kmi.clean_sva || va >= kmi.clean_eva,
+ !VA_IS_CLEANMAP(va),
("pmap_enter: managed mapping within the clean submap"));
if ((m->oflags & VPO_UNMANAGED) == 0)
VM_PAGE_OBJECT_BUSY_ASSERT(m);
@@ -4108,8 +4108,8 @@ pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m,
{
pt_entry_t newpte, *pte;
- KASSERT(pmap != kernel_pmap || va < kmi.clean_sva ||
- va >= kmi.clean_eva || (m->oflags & VPO_UNMANAGED) != 0,
+ KASSERT(pmap != kernel_pmap || !VA_IS_CLEANMAP(va) ||
+ (m->oflags & VPO_UNMANAGED) != 0,
("pmap_enter_quick_locked: managed mapping within the clean submap"));
rw_assert(&pvh_global_lock, RA_WLOCKED);
PMAP_LOCK_ASSERT(pmap, MA_OWNED);
diff --git a/sys/mips/mips/pmap.c b/sys/mips/mips/pmap.c
index 866013cbf38a..a022e7619bc5 100644
--- a/sys/mips/mips/pmap.c
+++ b/sys/mips/mips/pmap.c
@@ -2125,8 +2125,7 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
va &= ~PAGE_MASK;
KASSERT(va <= VM_MAX_KERNEL_ADDRESS, ("pmap_enter: toobig"));
- KASSERT((m->oflags & VPO_UNMANAGED) != 0 || va < kmi.clean_sva ||
- va >= kmi.clean_eva,
+ KASSERT((m->oflags & VPO_UNMANAGED) != 0 || !VA_IS_CLEANMAP(va),
("pmap_enter: managed mapping within the clean submap"));
if ((m->oflags & VPO_UNMANAGED) == 0)
VM_PAGE_OBJECT_BUSY_ASSERT(m);
@@ -2328,7 +2327,7 @@ pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m,
pt_entry_t *pte, npte;
vm_paddr_t pa;
- KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva ||
+ KASSERT(!VA_IS_CLEANMAP(va) ||
(m->oflags & VPO_UNMANAGED) != 0,
("pmap_enter_quick_locked: managed mapping within the clean submap"));
rw_assert(&pvh_global_lock, RA_WLOCKED);
diff --git a/sys/powerpc/aim/mmu_radix.c b/sys/powerpc/aim/mmu_radix.c
index 2373425afd30..b2500e4ec359 100644
--- a/sys/powerpc/aim/mmu_radix.c
+++ b/sys/powerpc/aim/mmu_radix.c
@@ -2813,8 +2813,7 @@ mmu_radix_enter(pmap_t pmap, vm_offset_t va, vm_page_t m,
CTR6(KTR_PMAP, "pmap_enter(%p, %#lx, %p, %#x, %#x, %d)", pmap, va,
m, prot, flags, psind);
KASSERT(va <= VM_MAX_KERNEL_ADDRESS, ("pmap_enter: toobig"));
- KASSERT((m->oflags & VPO_UNMANAGED) != 0 || va < kmi.clean_sva ||
- va >= kmi.clean_eva,
+ KASSERT((m->oflags & VPO_UNMANAGED) != 0 || !VA_IS_CLEANMAP(va),
("pmap_enter: managed mapping within the clean submap"));
if ((m->oflags & VPO_UNMANAGED) == 0)
VM_PAGE_OBJECT_BUSY_ASSERT(m);
@@ -3298,7 +3297,7 @@ mmu_radix_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m,
pt_entry_t *pte;
vm_paddr_t pa;
- KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva ||
+ KASSERT(!VA_IS_CLEANMAP(va) ||
(m->oflags & VPO_UNMANAGED) != 0,
("mmu_radix_enter_quick_locked: managed mapping within the clean submap"));
PMAP_LOCK_ASSERT(pmap, MA_OWNED);
diff --git a/sys/riscv/riscv/pmap.c b/sys/riscv/riscv/pmap.c
index f30dda17afae..d0b51d5199e2 100644
--- a/sys/riscv/riscv/pmap.c
+++ b/sys/riscv/riscv/pmap.c
@@ -3103,7 +3103,7 @@ pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m,
pd_entry_t *l2;
pt_entry_t *l3, newl3;
- KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva ||
+ KASSERT(!VA_IS_CLEANMAP(va) ||
(m->oflags & VPO_UNMANAGED) != 0,
("pmap_enter_quick_locked: managed mapping within the clean submap"));
rw_assert(&pvh_global_lock, RA_LOCKED);
diff --git a/sys/vm/vm.h b/sys/vm/vm.h
index 296449edc7c1..9bf77db4118c 100644
--- a/sys/vm/vm.h
+++ b/sys/vm/vm.h
@@ -145,6 +145,9 @@ struct kva_md_info {
vm_offset_t clean_eva;
};
+#define VA_IS_CLEANMAP(va) \
+ ((va) >= kmi.clean_sva && (va) < kmi.clean_eva)
+
extern struct kva_md_info kmi;
extern void vm_ksubmap_init(struct kva_md_info *);