#pragma once #include #include #include class VMRegion : LinkedListNode { public: u64 start; u64 end; usize count; bool used { true }; bool persistent { false }; }; class UserVM { public: UserVM(); ~UserVM(); Result alloc_region(usize count, bool persistent = false); Result test_and_alloc_region(u64 address, usize count, bool persistent = false) { return set_region(address, count, true, persistent); } Result free_region(u64 address, usize count) { return set_region(address, count, false, false); } static Result> try_create(); Result> clone(); private: Result set_region(u64 address, usize count, bool used, 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; };