#pragma once #include #include #include #include namespace Kernel { class VirtualRange { BAN_NON_COPYABLE(VirtualRange); BAN_NON_MOVABLE(VirtualRange); public: static BAN::ErrorOr> create_to_vaddr_range(PageTable&, AddressRange address_range, size_t, PageTable::flags_t flags, bool add_guard_pages); ~VirtualRange(); vaddr_t vaddr() const { return m_vaddr + (m_has_guard_pages ? PAGE_SIZE : 0); } size_t size() const { return m_size - (m_has_guard_pages ? 2 * PAGE_SIZE : 0); } PageTable::flags_t flags() const { return m_flags; } paddr_t paddr_of(vaddr_t vaddr) const { return m_page_table.physical_address_of(vaddr & PAGE_ADDR_MASK); } bool contains(vaddr_t address) const { return vaddr() <= address && address < vaddr() + size(); } private: VirtualRange(PageTable&, bool has_guard_pages, vaddr_t, size_t, PageTable::flags_t); BAN::ErrorOr initialize(); private: PageTable& m_page_table; const bool m_has_guard_pages; const vaddr_t m_vaddr; const size_t m_size; const PageTable::flags_t m_flags; SpinLock m_lock; friend class BAN::UniqPtr; }; }