summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2021-02-25 11:42:49 +0100
committerAndreas Kling <kling@serenityos.org>2021-02-25 16:21:14 +0100
commit17f076d9129e959a0b670562f4e167029bd0a4fa (patch)
tree868e5509668e754fbbccc31c315d1d66695bebb6
parentc11511a0aba0745aae4175d2566466462777b9e5 (diff)
downloadserenity-17f076d9129e959a0b670562f4e167029bd0a4fa.zip
Kernel: Move the VM Range class to its own files
-rw-r--r--Kernel/CMakeLists.txt1
-rw-r--r--Kernel/VM/Range.cpp47
-rw-r--r--Kernel/VM/Range.h76
-rw-r--r--Kernel/VM/RangeAllocator.cpp14
-rw-r--r--Kernel/VM/RangeAllocator.h46
5 files changed, 125 insertions, 59 deletions
diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt
index f77281137c..c7667644b2 100644
--- a/Kernel/CMakeLists.txt
+++ b/Kernel/CMakeLists.txt
@@ -212,6 +212,7 @@ set(KERNEL_SOURCES
VM/PrivateInodeVMObject.cpp
VM/ProcessPagingScope.cpp
VM/PurgeablePageRanges.cpp
+ VM/Range.cpp
VM/RangeAllocator.cpp
VM/Region.cpp
VM/SharedInodeVMObject.cpp
diff --git a/Kernel/VM/Range.cpp b/Kernel/VM/Range.cpp
new file mode 100644
index 0000000000..d62ef3cdc9
--- /dev/null
+++ b/Kernel/VM/Range.cpp
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <AK/Vector.h>
+#include <Kernel/Arch/i386/CPU.h>
+#include <Kernel/VM/Range.h>
+
+namespace Kernel {
+
+Vector<Range, 2> Range::carve(const Range& taken) const
+{
+ VERIFY((taken.size() % PAGE_SIZE) == 0);
+
+ Vector<Range, 2> parts;
+ if (taken == *this)
+ return {};
+ if (taken.base() > base())
+ parts.append({ base(), taken.base().get() - base().get() });
+ if (taken.end() < end())
+ parts.append({ taken.end(), end().get() - taken.end().get() });
+ return parts;
+}
+
+}
diff --git a/Kernel/VM/Range.h b/Kernel/VM/Range.h
new file mode 100644
index 0000000000..9d1c6ca476
--- /dev/null
+++ b/Kernel/VM/Range.h
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include <Kernel/VirtualAddress.h>
+
+namespace Kernel {
+
+class Range {
+ friend class RangeAllocator;
+
+public:
+ Range() = delete;
+ Range(VirtualAddress base, size_t size)
+ : m_base(base)
+ , m_size(size)
+ {
+ }
+
+ VirtualAddress base() const { return m_base; }
+ size_t size() const { return m_size; }
+ bool is_valid() const { return !m_base.is_null(); }
+
+ bool contains(VirtualAddress vaddr) const { return vaddr >= base() && vaddr < end(); }
+
+ VirtualAddress end() const { return m_base.offset(m_size); }
+
+ bool operator==(const Range& other) const
+ {
+ return m_base == other.m_base && m_size == other.m_size;
+ }
+
+ bool contains(VirtualAddress base, size_t size) const
+ {
+ if (base.offset(size) < base)
+ return false;
+ return base >= m_base && base.offset(size) <= end();
+ }
+
+ bool contains(const Range& other) const
+ {
+ return contains(other.base(), other.size());
+ }
+
+ Vector<Range, 2> carve(const Range&) const;
+
+private:
+ VirtualAddress m_base;
+ size_t m_size { 0 };
+};
+
+}
diff --git a/Kernel/VM/RangeAllocator.cpp b/Kernel/VM/RangeAllocator.cpp
index 1675e6946a..6ac0e045f9 100644
--- a/Kernel/VM/RangeAllocator.cpp
+++ b/Kernel/VM/RangeAllocator.cpp
@@ -66,20 +66,6 @@ void RangeAllocator::dump() const
}
}
-Vector<Range, 2> Range::carve(const Range& taken)
-{
- VERIFY((taken.size() % PAGE_SIZE) == 0);
-
- Vector<Range, 2> parts;
- if (taken == *this)
- return {};
- if (taken.base() > base())
- parts.append({ base(), taken.base().get() - base().get() });
- if (taken.end() < end())
- parts.append({ taken.end(), end().get() - taken.end().get() });
- return parts;
-}
-
void RangeAllocator::carve_at_index(int index, const Range& range)
{
VERIFY(m_lock.is_locked());
diff --git a/Kernel/VM/RangeAllocator.h b/Kernel/VM/RangeAllocator.h
index 0ea8206577..0ecfca7a43 100644
--- a/Kernel/VM/RangeAllocator.h
+++ b/Kernel/VM/RangeAllocator.h
@@ -26,57 +26,13 @@
#pragma once
-#include <AK/String.h>
#include <AK/Traits.h>
#include <AK/Vector.h>
#include <Kernel/SpinLock.h>
-#include <Kernel/VirtualAddress.h>
+#include <Kernel/VM/Range.h>
namespace Kernel {
-class Range {
- friend class RangeAllocator;
-
-public:
- Range() = delete;
- Range(VirtualAddress base, size_t size)
- : m_base(base)
- , m_size(size)
- {
- }
-
- VirtualAddress base() const { return m_base; }
- size_t size() const { return m_size; }
- bool is_valid() const { return !m_base.is_null(); }
-
- bool contains(VirtualAddress vaddr) const { return vaddr >= base() && vaddr < end(); }
-
- VirtualAddress end() const { return m_base.offset(m_size); }
-
- bool operator==(const Range& other) const
- {
- return m_base == other.m_base && m_size == other.m_size;
- }
-
- bool contains(VirtualAddress base, size_t size) const
- {
- if (base.offset(size) < base)
- return false;
- return base >= m_base && base.offset(size) <= end();
- }
-
- bool contains(const Range& other) const
- {
- return contains(other.base(), other.size());
- }
-
- Vector<Range, 2> carve(const Range&);
-
-private:
- VirtualAddress m_base;
- size_t m_size { 0 };
-};
-
class RangeAllocator {
public:
RangeAllocator();