diff --git a/Kernel/VM/Space.cpp b/Kernel/VM/Space.cpp index 4489ca17f7..94a7628f95 100644 --- a/Kernel/VM/Space.cpp +++ b/Kernel/VM/Space.cpp @@ -1,5 +1,6 @@ /* * Copyright (c) 2021, Andreas Kling + * Copyright (c) 2021, Leon Albrecht * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -158,6 +159,27 @@ Region* Space::find_region_containing(const Range& range) return nullptr; } +Vector Space::find_regions_intersecting(const Range& range) +{ + Vector regions = {}; + size_t total_size_collected = 0; + + ScopedSpinLock lock(m_lock); + + // FIXME: Maybe take the cache from the single lookup? + for (auto& region : m_regions) { + if (region.range().base() < range.end() && region.range().end() > range.base()) { + regions.append(®ion); + + total_size_collected += region.size() - region.range().intersect(range).size(); + if (total_size_collected == range.size()) + break; + } + } + + return regions; +} + Region& Space::add_region(NonnullOwnPtr region) { auto* ptr = region.ptr(); diff --git a/Kernel/VM/Space.h b/Kernel/VM/Space.h index 17240d2378..dde64230dc 100644 --- a/Kernel/VM/Space.h +++ b/Kernel/VM/Space.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2018-2021, Andreas Kling + * Copyright (c) 2021, Leon Albrecht * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -27,6 +28,7 @@ #pragma once #include +#include #include #include #include @@ -63,6 +65,8 @@ public: Region* find_region_from_range(const Range&); Region* find_region_containing(const Range&); + Vector find_regions_intersecting(const Range&); + bool enforces_syscall_regions() const { return m_enforces_syscall_regions; } void set_enforces_syscall_regions(bool b) { m_enforces_syscall_regions = b; }