aboutsummaryrefslogtreecommitdiff
path: root/sys/vm/vm_map.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/vm/vm_map.c')
-rw-r--r--sys/vm/vm_map.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c
index b8295bb2108d..63bdce9d60f8 100644
--- a/sys/vm/vm_map.c
+++ b/sys/vm/vm_map.c
@@ -4163,6 +4163,38 @@ vm_map_check_protection(vm_map_t map, vm_offset_t start, vm_offset_t end,
}
/*
+ * Check whether the specified range partially overlaps a map entry with
+ * fixed boundaries, and return false if so.
+ *
+ * The map must be locked.
+ */
+bool
+vm_map_check_boundary(vm_map_t map, vm_offset_t start, vm_offset_t end)
+{
+ vm_map_entry_t entry;
+ int bdry_idx;
+
+ if (!vm_map_range_valid(map, start, end))
+ return (false);
+ if (start == end)
+ return (true);
+
+ if (vm_map_lookup_entry(map, start, &entry)) {
+ bdry_idx = MAP_ENTRY_SPLIT_BOUNDARY_INDEX(entry);
+ if (bdry_idx != 0 &&
+ (start & (pagesizes[bdry_idx] - 1)) != 0)
+ return (false);
+ }
+ if (vm_map_lookup_entry(map, end - 1, &entry)) {
+ bdry_idx = MAP_ENTRY_SPLIT_BOUNDARY_INDEX(entry);
+ if (bdry_idx != 0 &&
+ (end & (pagesizes[bdry_idx] - 1)) != 0)
+ return (false);
+ }
+ return (true);
+}
+
+/*
*
* vm_map_copy_swap_object:
*