summaryrefslogtreecommitdiff
path: root/Kernel/Memory/AddressSpace.cpp
diff options
context:
space:
mode:
authorLiav A <liavalb@gmail.com>2022-12-15 21:08:57 +0200
committerAndrew Kaster <andrewdkaster@gmail.com>2022-12-16 01:02:00 -0700
commit8585b2dc23ec206777a4cfbd558766d90fc577e7 (patch)
tree36a87ee00a179aad52f4d1f0a9646b1c65206c22 /Kernel/Memory/AddressSpace.cpp
parent6c0486277e9bc8238ae82ee857a70014c9397db9 (diff)
downloadserenity-8585b2dc23ec206777a4cfbd558766d90fc577e7.zip
Kernel/Memory: Add option to annotate region mapping as immutable
We add this basic functionality to the Kernel so Userspace can request a particular virtual memory mapping to be immutable. This will be useful later on in the DynamicLoader code. The annotation of a particular Kernel Region as immutable implies that the following restrictions apply, so these features are prohibited: - Changing the region's protection bits - Unmapping the region - Annotating the region with other virtual memory flags - Applying further memory advises on the region - Changing the region name - Re-mapping the region
Diffstat (limited to 'Kernel/Memory/AddressSpace.cpp')
-rw-r--r--Kernel/Memory/AddressSpace.cpp6
1 files changed, 6 insertions, 0 deletions
diff --git a/Kernel/Memory/AddressSpace.cpp b/Kernel/Memory/AddressSpace.cpp
index e37d3f22c3..1fa839afdb 100644
--- a/Kernel/Memory/AddressSpace.cpp
+++ b/Kernel/Memory/AddressSpace.cpp
@@ -59,6 +59,8 @@ ErrorOr<void> AddressSpace::unmap_mmap_range(VirtualAddress addr, size_t size)
if (auto* whole_region = find_region_from_range(range_to_unmap)) {
if (!whole_region->is_mmap())
return EPERM;
+ if (whole_region->is_immutable())
+ return EPERM;
PerformanceManager::add_unmap_perf_event(Process::current(), whole_region->range());
@@ -69,6 +71,8 @@ ErrorOr<void> AddressSpace::unmap_mmap_range(VirtualAddress addr, size_t size)
if (auto* old_region = find_region_containing(range_to_unmap)) {
if (!old_region->is_mmap())
return EPERM;
+ if (old_region->is_immutable())
+ return EPERM;
// Remove the old region from our regions tree, since were going to add another region
// with the exact same start address.
@@ -99,6 +103,8 @@ ErrorOr<void> AddressSpace::unmap_mmap_range(VirtualAddress addr, size_t size)
for (auto* region : regions) {
if (!region->is_mmap())
return EPERM;
+ if (region->is_immutable())
+ return EPERM;
}
Vector<Region*, 2> new_regions;