diff --git a/lib/mammoth/include/mammoth/memory_region.h b/lib/mammoth/include/mammoth/memory_region.h index c8c1521..0f7ac4c 100644 --- a/lib/mammoth/include/mammoth/memory_region.h +++ b/lib/mammoth/include/mammoth/memory_region.h @@ -7,7 +7,6 @@ class MappedMemoryRegion { public: // FIXME: Introduce optional type to contain error or. static MappedMemoryRegion DirectPhysical(uint64_t phys_addr, uint64_t size); - static MappedMemoryRegion ContiguousPhysical(uint64_t size); static MappedMemoryRegion Default(uint64_t size); MappedMemoryRegion() {} @@ -49,6 +48,8 @@ class OwnedMemoryRegion { ~OwnedMemoryRegion(); static OwnedMemoryRegion FromCapability(z_cap_t vmmo_cap); + // TODO: Consider making this its own class. + static OwnedMemoryRegion ContiguousPhysical(uint64_t size, uint64_t* paddr); uint64_t vaddr() { return vaddr_; } uint64_t size() { return size_; } diff --git a/lib/mammoth/src/memory_region.cpp b/lib/mammoth/src/memory_region.cpp index e4177f8..e547f6e 100644 --- a/lib/mammoth/src/memory_region.cpp +++ b/lib/mammoth/src/memory_region.cpp @@ -16,16 +16,6 @@ MappedMemoryRegion MappedMemoryRegion::DirectPhysical(uint64_t paddr, return MappedMemoryRegion(vmmo_cap, paddr, vaddr, size); } -MappedMemoryRegion MappedMemoryRegion::ContiguousPhysical(uint64_t size) { - uint64_t vmmo_cap, paddr; - check(ZMemoryObjectCreateContiguous(size, &vmmo_cap, &paddr)); - - uint64_t vaddr; - check(ZAddressSpaceMap(gSelfVmasCap, 0, vmmo_cap, &vaddr)); - - return MappedMemoryRegion(vmmo_cap, paddr, vaddr, size); -} - MappedMemoryRegion MappedMemoryRegion::Default(uint64_t size) { uint64_t vmmo_cap; check(ZMemoryObjectCreate(size, &vmmo_cap)); @@ -73,6 +63,17 @@ OwnedMemoryRegion OwnedMemoryRegion::FromCapability(z_cap_t vmmo_cap) { return OwnedMemoryRegion(vmmo_cap, vaddr, size); } +OwnedMemoryRegion OwnedMemoryRegion::ContiguousPhysical(uint64_t size, + uint64_t* paddr) { + uint64_t vmmo_cap; + check(ZMemoryObjectCreateContiguous(size, &vmmo_cap, paddr)); + + uint64_t vaddr; + check(ZAddressSpaceMap(gSelfVmasCap, 0, vmmo_cap, &vaddr)); + + return OwnedMemoryRegion(vmmo_cap, vaddr, size); +} + z_cap_t OwnedMemoryRegion::DuplicateCap() { z_cap_t cap; check(ZCapDuplicate(vmmo_cap_, kZionPerm_All, &cap)); diff --git a/sys/denali/ahci/ahci_device.cpp b/sys/denali/ahci/ahci_device.cpp index 78a80ce..2aca049 100644 --- a/sys/denali/ahci/ahci_device.cpp +++ b/sys/denali/ahci/ahci_device.cpp @@ -13,8 +13,8 @@ AhciDevice::AhciDevice(AhciPort* port) : port_struct_(port) { // 0x0-0x400 -> Command List // 0x400-0x500 -> Received FIS // 0x500-0x2500 -> Command Tables (0x100 each) (Max PRDT Length is 8 for now) - command_structures_ = MappedMemoryRegion::ContiguousPhysical(0x2500); - uint64_t paddr = command_structures_.paddr(); + uint64_t paddr; + command_structures_ = OwnedMemoryRegion::ContiguousPhysical(0x2500, &paddr); command_list_ = reinterpret_cast(command_structures_.vaddr()); port_struct_->command_list_base = paddr; diff --git a/sys/denali/ahci/ahci_device.h b/sys/denali/ahci/ahci_device.h index a07289a..71f39aa 100644 --- a/sys/denali/ahci/ahci_device.h +++ b/sys/denali/ahci/ahci_device.h @@ -26,7 +26,7 @@ class AhciDevice { private: AhciPort* port_struct_ = nullptr; - MappedMemoryRegion command_structures_; + OwnedMemoryRegion command_structures_; CommandList* command_list_ = nullptr; ReceivedFis* received_fis_ = nullptr; diff --git a/sys/denali/denali_server.cpp b/sys/denali/denali_server.cpp index ee2ab21..91ac668 100644 --- a/sys/denali/denali_server.cpp +++ b/sys/denali/denali_server.cpp @@ -18,10 +18,11 @@ glcr::ErrorCode DenaliServer::HandleRead(const ReadRequest& req, ASSIGN_OR_RETURN(Mutex mutex, Mutex::Create()); RET_ERR(mutex.Lock()); - MappedMemoryRegion region = - MappedMemoryRegion::ContiguousPhysical(req.size() * 512); + uint64_t paddr; + OwnedMemoryRegion region = + OwnedMemoryRegion::ContiguousPhysical(req.size() * 512, &paddr); - DmaReadCommand command(req.lba(), req.size(), region.paddr(), mutex); + DmaReadCommand command(req.lba(), req.size(), paddr, mutex); device->IssueCommand(&command); // Wait for read operation to complete. @@ -30,7 +31,7 @@ glcr::ErrorCode DenaliServer::HandleRead(const ReadRequest& req, resp.set_device_id(req.device_id()); resp.set_size(req.size()); - resp.set_memory(region.cap()); + resp.set_memory(region.DuplicateCap()); return glcr::OK; } @@ -40,8 +41,9 @@ glcr::ErrorCode DenaliServer::HandleReadMany(const ReadManyRequest& req, ASSIGN_OR_RETURN(Mutex mutex, Mutex::Create()); RET_ERR(mutex.Lock()); - MappedMemoryRegion region = - MappedMemoryRegion::ContiguousPhysical(req.lba().size() * 512); + uint64_t region_paddr; + OwnedMemoryRegion region = OwnedMemoryRegion::ContiguousPhysical( + req.lba().size() * 512, ®ion_paddr); auto& vec = req.lba(); uint64_t curr_run_start = 0; @@ -51,7 +53,7 @@ glcr::ErrorCode DenaliServer::HandleReadMany(const ReadManyRequest& req, } uint64_t lba = vec.at(curr_run_start); uint64_t size = (i - curr_run_start) + 1; - uint64_t paddr = region.paddr() + curr_run_start * 512; + uint64_t paddr = region_paddr + curr_run_start * 512; DmaReadCommand command(lba, size, paddr, mutex); device->IssueCommand(&command); @@ -63,6 +65,6 @@ glcr::ErrorCode DenaliServer::HandleReadMany(const ReadManyRequest& req, resp.set_device_id(req.device_id()); resp.set_size(req.lba().size()); - resp.set_memory(region.cap()); + resp.set_memory(region.DuplicateCap()); return glcr::OK; }