diff --git a/Kernel/VM/Range.cpp b/Kernel/VM/Range.cpp index d62ef3cdc9..f1dd42c592 100644 --- a/Kernel/VM/Range.cpp +++ b/Kernel/VM/Range.cpp @@ -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 @@ -43,5 +44,15 @@ Vector Range::carve(const Range& taken) const parts.append({ taken.end(), end().get() - taken.end().get() }); return parts; } +Range Range::intersect(const Range& other) const +{ + if (*this == other) { + return *this; + } + auto new_base = max(base(), other.base()); + auto new_end = min(end(), other.end()); + VERIFY(new_base < new_end); + return Range(new_base, (new_end - new_base).get()); +} } diff --git a/Kernel/VM/Range.h b/Kernel/VM/Range.h index 9d1c6ca476..e20ded5bf1 100644 --- a/Kernel/VM/Range.h +++ b/Kernel/VM/Range.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 @@ -67,6 +68,7 @@ public: } Vector carve(const Range&) const; + Range intersect(const Range&) const; private: VirtualAddress m_base;