#pragma once #include #include "object/memory_object.h" /* AddressRangeTree stores memory objects referred to by * ranges and ensures those ranges do not overlap. */ class MemoryMappingTree { public: MemoryMappingTree() = default; MemoryMappingTree(const MemoryMappingTree&) = delete; MemoryMappingTree(MemoryMappingTree&&) = delete; glcr::ErrorCode AddInMemoryObject(uint64_t vaddr, const glcr::RefPtr& object); glcr::ErrorCode FreeMemoryRange(uint64_t vaddr_base, uint64_t vaddr_limit); glcr::ErrorOr GetPhysicalPageAtVaddr(uint64_t vaddr); struct MemoryMapping { uint64_t vaddr_base; uint64_t vaddr_limit; glcr::RefPtr mem_object; }; private: // TODO: Consider adding a red-black tree implementation here. // As is this tree functions about as well as a linked list // because mappings are likely to be added in near-perfect ascedning order. // Also worth considering creating a special tree implementation for // just this purpose, or maybe a BinaryTree implementation that accepts // ranges rather than a single key. glcr::BinaryTree mapping_tree_; glcr::Optional> GetMemoryMappingForAddr( uint64_t vaddr); };