[Zion] Separate Memory "Views" to a separate MemoryObject.

This commit is contained in:
Drew Galbraith 2023-11-19 23:22:56 -08:00
parent a8ad225cf1
commit 12ca4e4e89
4 changed files with 35 additions and 16 deletions

View File

@ -132,8 +132,8 @@ void WriteInitProgram(glcr::RefPtr<Port> port, glcr::String name, uint64_t id) {
glcr::ErrorCode WritePciVmmo(glcr::RefPtr<Port> port, uint64_t id) { glcr::ErrorCode WritePciVmmo(glcr::RefPtr<Port> port, uint64_t id) {
ASSIGN_OR_RETURN(PcieConfiguration config, GetPciExtendedConfiguration()); ASSIGN_OR_RETURN(PcieConfiguration config, GetPciExtendedConfiguration());
auto vmmo = glcr::MakeRefCounted<FixedMemoryObject>(config.base, auto vmmo =
config.offset, false); glcr::MakeRefCounted<ViewMemoryObject>(config.base, config.offset);
port->WriteKernel(id, MakeRefCounted<Capability>(vmmo)); port->WriteKernel(id, MakeRefCounted<Capability>(vmmo));

View File

@ -72,18 +72,15 @@ uint64_t VariableMemoryObject::PageNumberToPhysAddr(uint64_t page_num) {
} }
FixedMemoryObject::~FixedMemoryObject() { FixedMemoryObject::~FixedMemoryObject() {
if (should_free_) {
phys_mem::FreePages(physical_addr_, num_pages()); phys_mem::FreePages(physical_addr_, num_pages());
}
} }
glcr::ErrorOr<glcr::RefPtr<MemoryObject>> FixedMemoryObject::Duplicate( glcr::ErrorOr<glcr::RefPtr<MemoryObject>> ViewMemoryObject::Duplicate(
uint64_t offset, uint64_t length) { uint64_t offset, uint64_t length) {
if (offset + length > size()) { if (offset + length > size()) {
return glcr::INVALID_ARGUMENT; return glcr::INVALID_ARGUMENT;
} }
return glcr::StaticCastRefPtr<MemoryObject>( return glcr::StaticCastRefPtr<MemoryObject>(
glcr::MakeRefCounted<FixedMemoryObject>(physical_addr_ + offset, length, glcr::MakeRefCounted<ViewMemoryObject>(physical_addr_ + offset, length));
false));
} }

View File

@ -68,12 +68,37 @@ class VariableMemoryObject : public MemoryObject {
class FixedMemoryObject : public MemoryObject { class FixedMemoryObject : public MemoryObject {
public: public:
// FIXME: Validate that this is 4k aligned. // FIXME: Validate that this is 4k aligned.
// Create a new class object for should free. FixedMemoryObject(uint64_t physical_addr, uint64_t size)
FixedMemoryObject(uint64_t physical_addr, uint64_t size, bool should_free) : size_(size), physical_addr_(physical_addr) {}
: size_(size), physical_addr_(physical_addr), should_free_(should_free) {}
~FixedMemoryObject() override; ~FixedMemoryObject() override;
virtual uint64_t size() override { return size_; }
virtual glcr::ErrorOr<glcr::RefPtr<MemoryObject>> 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 uint64_t size() override { return size_; }
virtual glcr::ErrorOr<glcr::RefPtr<MemoryObject>> Duplicate( virtual glcr::ErrorOr<glcr::RefPtr<MemoryObject>> Duplicate(
uint64_t offset, uint64_t length) override; uint64_t offset, uint64_t length) override;
@ -86,5 +111,4 @@ class FixedMemoryObject : public MemoryObject {
private: private:
uint64_t size_; uint64_t size_;
uint64_t physical_addr_; uint64_t physical_addr_;
bool should_free_;
}; };

View File

@ -14,8 +14,7 @@ z_err_t MemoryObjectCreate(ZMemoryObjectCreateReq* req) {
z_err_t MemoryObjectCreatePhysical(ZMemoryObjectCreatePhysicalReq* req) { z_err_t MemoryObjectCreatePhysical(ZMemoryObjectCreatePhysicalReq* req) {
auto& curr_proc = gScheduler->CurrentProcess(); auto& curr_proc = gScheduler->CurrentProcess();
uint64_t paddr = req->paddr; uint64_t paddr = req->paddr;
auto vmmo_ref = auto vmmo_ref = glcr::MakeRefCounted<ViewMemoryObject>(paddr, req->size);
glcr::MakeRefCounted<FixedMemoryObject>(paddr, req->size, false);
*req->vmmo_cap = *req->vmmo_cap =
curr_proc.AddNewCapability(StaticCastRefPtr<MemoryObject>(vmmo_ref)); curr_proc.AddNewCapability(StaticCastRefPtr<MemoryObject>(vmmo_ref));
return glcr::OK; return glcr::OK;
@ -25,8 +24,7 @@ z_err_t MemoryObjectCreateContiguous(ZMemoryObjectCreateContiguousReq* req) {
auto& curr_proc = gScheduler->CurrentProcess(); auto& curr_proc = gScheduler->CurrentProcess();
uint64_t num_pages = ((req->size - 1) / 0x1000) + 1; uint64_t num_pages = ((req->size - 1) / 0x1000) + 1;
uint64_t paddr = phys_mem::AllocateContinuous(num_pages); uint64_t paddr = phys_mem::AllocateContinuous(num_pages);
auto vmmo_ref = auto vmmo_ref = glcr::MakeRefCounted<FixedMemoryObject>(paddr, req->size);
glcr::MakeRefCounted<FixedMemoryObject>(paddr, req->size, true);
*req->vmmo_cap = *req->vmmo_cap =
curr_proc.AddNewCapability(StaticCastRefPtr<MemoryObject>(vmmo_ref)); curr_proc.AddNewCapability(StaticCastRefPtr<MemoryObject>(vmmo_ref));
*req->paddr = paddr; *req->paddr = paddr;