Serenity Operating System
at master 60 lines 1.6 kB view raw
1/* 2 * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org> 3 * Copyright (c) 2021, Leon Albrecht <leon2002.la@gmail.com> 4 * 5 * SPDX-License-Identifier: BSD-2-Clause 6 */ 7 8#include <AK/Vector.h> 9#include <Kernel/Memory/MemoryManager.h> 10#include <Kernel/Memory/VirtualRange.h> 11 12namespace Kernel::Memory { 13 14Vector<VirtualRange, 2> VirtualRange::carve(VirtualRange const& taken) const 15{ 16 VERIFY((taken.size() % PAGE_SIZE) == 0); 17 18 Vector<VirtualRange, 2> parts; 19 if (taken == *this) 20 return {}; 21 if (taken.base() > base()) 22 parts.append({ base(), taken.base().get() - base().get() }); 23 if (taken.end() < end()) 24 parts.append({ taken.end(), end().get() - taken.end().get() }); 25 return parts; 26} 27 28bool VirtualRange::intersects(VirtualRange const& other) const 29{ 30 auto a = *this; 31 auto b = other; 32 33 if (a.base() > b.base()) 34 swap(a, b); 35 36 return a.base() < b.end() && b.base() < a.end(); 37} 38 39VirtualRange VirtualRange::intersect(VirtualRange const& other) const 40{ 41 if (*this == other) { 42 return *this; 43 } 44 auto new_base = max(base(), other.base()); 45 auto new_end = min(end(), other.end()); 46 VERIFY(new_base < new_end); 47 return VirtualRange(new_base, (new_end - new_base).get()); 48} 49 50ErrorOr<VirtualRange> VirtualRange::expand_to_page_boundaries(FlatPtr address, size_t size) 51{ 52 if ((address + size) < address) 53 return EINVAL; 54 55 auto base = VirtualAddress { address }.page_base(); 56 auto end = TRY(page_round_up(address + size)); 57 return VirtualRange { base, end - base.get() }; 58} 59 60}