diff --git a/zion/include/zcall.h b/zion/include/zcall.h index ef84eb5..211f5fe 100644 --- a/zion/include/zcall.h +++ b/zion/include/zcall.h @@ -31,6 +31,7 @@ #define Z_INIT_VMAS_SELF 0x20 #define Z_MEMORY_OBJECT_CREATE 0x30 +#define Z_MEMORY_OBJECT_CREATE_PHYSICAL 0x31 #define Z_TEMP_PCIE_CONFIG_OBJECT_CREATE 0x3F @@ -67,6 +68,8 @@ void ZThreadExit(); [[nodiscard]] z_err_t ZAddressSpaceMap(uint64_t vmas_cap, uint64_t vmas_offset, uint64_t vmmo_cap, uint64_t* vaddr); [[nodiscard]] z_err_t ZMemoryObjectCreate(uint64_t size, uint64_t* vmmo_cap); +[[nodiscard]] z_err_t ZMemoryObjectCreatePhysical(uint64_t paddr, uint64_t size, + uint64_t* vmmo_cap); [[nodiscard]] z_err_t ZTempPcieConfigObjectCreate(uint64_t* vmmo_cap, uint64_t* vmmo_size); diff --git a/zion/syscall/syscall.cpp b/zion/syscall/syscall.cpp index 3ac8c4b..0a15662 100644 --- a/zion/syscall/syscall.cpp +++ b/zion/syscall/syscall.cpp @@ -130,14 +130,20 @@ z_err_t MemoryObjectCreate(ZMemoryObjectCreateReq* req, return Z_OK; } +z_err_t MemoryObjectCreatePhysical(ZMemoryObjectCreatePhysicalReq* req, + ZMemoryObjectCreateResp* resp) { + auto& curr_proc = gScheduler->CurrentProcess(); + auto vmmo_ref = MakeRefCounted(req->paddr, req->size); + resp->vmmo_cap = + curr_proc.AddCapability(StaticCastRefPtr(vmmo_ref)); + return Z_OK; +} + z_err_t TempPcieConfigObjectCreate(ZTempPcieConfigObjectCreateResp* resp) { auto& curr_proc = gScheduler->CurrentProcess(); uint64_t pci_base, pci_size; - dbgln("Getting config"); RET_ERR(GetPciExtendedConfiguration(&pci_base, &pci_size)); - dbgln("Making obj"); auto vmmo_ref = MakeRefCounted(pci_base, pci_size); - dbgln("Adding cap"); resp->vmmo_cap = curr_proc.AddCapability(StaticCastRefPtr(vmmo_ref)); resp->vmmo_size = pci_size; @@ -201,6 +207,10 @@ extern "C" z_err_t SyscallHandler(uint64_t call_id, void* req, void* resp) { return MemoryObjectCreate( reinterpret_cast(req), reinterpret_cast(resp)); + case Z_MEMORY_OBJECT_CREATE_PHYSICAL: + return MemoryObjectCreatePhysical( + reinterpret_cast(req), + reinterpret_cast(resp)); case Z_TEMP_PCIE_CONFIG_OBJECT_CREATE: return TempPcieConfigObjectCreate( reinterpret_cast(resp)); diff --git a/zion/usr/zcall.cpp b/zion/usr/zcall.cpp index 9baa1fb..d048160 100644 --- a/zion/usr/zcall.cpp +++ b/zion/usr/zcall.cpp @@ -73,6 +73,7 @@ z_err_t ZAddressSpaceMap(uint64_t vmas_cap, uint64_t vmas_offset, *vaddr = resp.vaddr; return ret; } + z_err_t ZMemoryObjectCreate(uint64_t size, uint64_t* vmmo_cap) { ZMemoryObjectCreateReq req{ .size = size, @@ -83,6 +84,18 @@ z_err_t ZMemoryObjectCreate(uint64_t size, uint64_t* vmmo_cap) { return ret; } +z_err_t ZMemoryObjectCreatePhysical(uint64_t paddr, uint64_t size, + uint64_t* vmmo_cap) { + ZMemoryObjectCreatePhysicalReq req{ + .paddr = paddr, + .size = size, + }; + ZMemoryObjectCreateResp resp; + z_err_t ret = SysCall2(Z_MEMORY_OBJECT_CREATE_PHYSICAL, &req, &resp); + *vmmo_cap = resp.vmmo_cap; + return ret; +} + z_err_t ZTempPcieConfigObjectCreate(uint64_t* vmmo_cap, uint64_t* vmmo_size) { ZTempPcieConfigObjectCreateResp resp; z_err_t ret = SysCall2(Z_TEMP_PCIE_CONFIG_OBJECT_CREATE, 0, &resp); diff --git a/zion/usr/zcall_internal.h b/zion/usr/zcall_internal.h index 1375fd8..bfdda5c 100644 --- a/zion/usr/zcall_internal.h +++ b/zion/usr/zcall_internal.h @@ -46,6 +46,11 @@ struct ZMemoryObjectCreateResp { uint64_t vmmo_cap; }; +struct ZMemoryObjectCreatePhysicalReq { + uint64_t paddr; + uint64_t size; +}; + struct ZTempPcieConfigObjectCreateResp { uint64_t vmmo_cap; uint64_t vmmo_size;