#pragma once #include "arch/MMU.h" #include #include #include class VMRegion : LinkedListNode { public: u64 start; u64 end; usize count; bool used { true }; bool persistent { false }; int flags { 0 }; int prot { 0 }; u64 shmid; void cleanup_shared(); }; class AddressSpace { public: AddressSpace(); ~AddressSpace(); AddressSpace& operator=(AddressSpace&& other); Result alloc_region(usize count, int prot, int flags, u64 shmid = 0, bool persistent = false); Result test_and_alloc_region(u64 address, usize count, int prot, int flags, u64 shmid = 0, bool persistent = false) { return set_region(address, count, true, prot, flags, shmid, persistent); } Result free_region(u64 address, usize count) { return set_region(address, count, false, 0, 0, 0, false); } static Result> try_create(); Result> clone(); PageDirectory* page_directory() const { return m_directory; } private: Result set_region(u64 address, usize count, bool used, int prot, int flags, u64 shmid, bool persistent); Result create_default_region(); Result create_null_region(); void try_merge_region_with_neighbors(VMRegion* region); void merge_contiguous_regions(VMRegion* a, VMRegion* b); Result split_region(VMRegion* parent, u64 boundary); LinkedList m_regions; PageDirectory* m_directory; };