diff --git a/zion/loader/init_loader.cpp b/zion/loader/init_loader.cpp index b6962e4..367b4eb 100644 --- a/zion/loader/init_loader.cpp +++ b/zion/loader/init_loader.cpp @@ -132,8 +132,8 @@ void WriteInitProgram(glcr::RefPtr port, glcr::String name, uint64_t id) { glcr::ErrorCode WritePciVmmo(glcr::RefPtr port, uint64_t id) { ASSIGN_OR_RETURN(PcieConfiguration config, GetPciExtendedConfiguration()); - auto vmmo = glcr::MakeRefCounted(config.base, - config.offset, false); + auto vmmo = + glcr::MakeRefCounted(config.base, config.offset); port->WriteKernel(id, MakeRefCounted(vmmo)); diff --git a/zion/object/memory_object.cpp b/zion/object/memory_object.cpp index cefb371..552f22a 100644 --- a/zion/object/memory_object.cpp +++ b/zion/object/memory_object.cpp @@ -72,18 +72,15 @@ uint64_t VariableMemoryObject::PageNumberToPhysAddr(uint64_t page_num) { } FixedMemoryObject::~FixedMemoryObject() { - if (should_free_) { - phys_mem::FreePages(physical_addr_, num_pages()); - } + phys_mem::FreePages(physical_addr_, num_pages()); } -glcr::ErrorOr> FixedMemoryObject::Duplicate( +glcr::ErrorOr> ViewMemoryObject::Duplicate( uint64_t offset, uint64_t length) { if (offset + length > size()) { return glcr::INVALID_ARGUMENT; } return glcr::StaticCastRefPtr( - glcr::MakeRefCounted(physical_addr_ + offset, length, - false)); + glcr::MakeRefCounted(physical_addr_ + offset, length)); } diff --git a/zion/object/memory_object.h b/zion/object/memory_object.h index 3c39c4a..900ea21 100644 --- a/zion/object/memory_object.h +++ b/zion/object/memory_object.h @@ -68,12 +68,37 @@ class VariableMemoryObject : public MemoryObject { class FixedMemoryObject : public MemoryObject { public: // FIXME: Validate that this is 4k aligned. - // Create a new class object for should free. - FixedMemoryObject(uint64_t physical_addr, uint64_t size, bool should_free) - : size_(size), physical_addr_(physical_addr), should_free_(should_free) {} + FixedMemoryObject(uint64_t physical_addr, uint64_t size) + : size_(size), physical_addr_(physical_addr) {} ~FixedMemoryObject() override; + virtual uint64_t size() override { return size_; } + virtual glcr::ErrorOr> Duplicate( + uint64_t offset, uint64_t length) override { + return glcr::UNIMPLEMENTED; + } + + protected: + uint64_t PageNumberToPhysAddr(uint64_t page_num) override { + return physical_addr_ + (kPageSize * page_num); + } + + private: + uint64_t size_; + uint64_t physical_addr_; +}; + +// Like a FixedMemoryObject except it doesn't release +// it's pages when it is done. Should be used for things +// like HBAs and the PCI config space. +class ViewMemoryObject : public MemoryObject { + public: + ViewMemoryObject(uint64_t physical_addr, uint64_t size) + : size_(size), physical_addr_(physical_addr) {} + + ~ViewMemoryObject(){}; + virtual uint64_t size() override { return size_; } virtual glcr::ErrorOr> Duplicate( uint64_t offset, uint64_t length) override; @@ -86,5 +111,4 @@ class FixedMemoryObject : public MemoryObject { private: uint64_t size_; uint64_t physical_addr_; - bool should_free_; }; diff --git a/zion/syscall/memory_object.cpp b/zion/syscall/memory_object.cpp index eebd12f..06b8ce5 100644 --- a/zion/syscall/memory_object.cpp +++ b/zion/syscall/memory_object.cpp @@ -14,8 +14,7 @@ z_err_t MemoryObjectCreate(ZMemoryObjectCreateReq* req) { z_err_t MemoryObjectCreatePhysical(ZMemoryObjectCreatePhysicalReq* req) { auto& curr_proc = gScheduler->CurrentProcess(); uint64_t paddr = req->paddr; - auto vmmo_ref = - glcr::MakeRefCounted(paddr, req->size, false); + auto vmmo_ref = glcr::MakeRefCounted(paddr, req->size); *req->vmmo_cap = curr_proc.AddNewCapability(StaticCastRefPtr(vmmo_ref)); return glcr::OK; @@ -25,8 +24,7 @@ z_err_t MemoryObjectCreateContiguous(ZMemoryObjectCreateContiguousReq* req) { auto& curr_proc = gScheduler->CurrentProcess(); uint64_t num_pages = ((req->size - 1) / 0x1000) + 1; uint64_t paddr = phys_mem::AllocateContinuous(num_pages); - auto vmmo_ref = - glcr::MakeRefCounted(paddr, req->size, true); + auto vmmo_ref = glcr::MakeRefCounted(paddr, req->size); *req->vmmo_cap = curr_proc.AddNewCapability(StaticCastRefPtr(vmmo_ref)); *req->paddr = paddr;