Skip to content

Commit

Permalink
Kernel: Implement helper to find multiple Regions in a Range
Browse files Browse the repository at this point in the history
  • Loading branch information
Hendiadyoin1 authored and awesomekling committed Mar 13, 2021
1 parent 7874b89 commit 61f0aa6
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 0 deletions.
22 changes: 22 additions & 0 deletions Kernel/VM/Space.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2021, Andreas Kling <[email protected]>
* Copyright (c) 2021, Leon Albrecht <[email protected]>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
Expand Down Expand Up @@ -158,6 +159,27 @@ Region* Space::find_region_containing(const Range& range)
return nullptr;
}

Vector<Region*> Space::find_regions_intersecting(const Range& range)
{
Vector<Region*> 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(&region);

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> region)
{
auto* ptr = region.ptr();
Expand Down
4 changes: 4 additions & 0 deletions Kernel/VM/Space.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2018-2021, Andreas Kling <[email protected]>
* Copyright (c) 2021, Leon Albrecht <[email protected]>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
Expand Down Expand Up @@ -27,6 +28,7 @@
#pragma once

#include <AK/NonnullOwnPtrVector.h>
#include <AK/Vector.h>
#include <AK/WeakPtr.h>
#include <Kernel/UnixTypes.h>
#include <Kernel/VM/AllocationStrategy.h>
Expand Down Expand Up @@ -63,6 +65,8 @@ class Space {
Region* find_region_from_range(const Range&);
Region* find_region_containing(const Range&);

Vector<Region*> 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; }

Expand Down

0 comments on commit 61f0aa6

Please sign in to comment.