From 378ced6b6cf7ca3a4c86329ba7bf2c4f9a410666 Mon Sep 17 00:00:00 2001 From: Drew Galbraith Date: Sat, 17 Jun 2023 00:31:02 -0700 Subject: [PATCH] [zion] Add a port create syscall --- zion/include/zcall.h | 1 + zion/syscall/syscall.cpp | 8 ++++++++ zion/usr/zcall.cpp | 7 +++++++ zion/usr/zcall_internal.h | 4 ++++ 4 files changed, 20 insertions(+) diff --git a/zion/include/zcall.h b/zion/include/zcall.h index 562fc8d..dc0cc81 100644 --- a/zion/include/zcall.h +++ b/zion/include/zcall.h @@ -90,6 +90,7 @@ void ZThreadExit(); uint64_t* actual_bytes, uint64_t* actual_caps); +[[nodiscard]] z_err_t ZPortCreate(uint64_t* port_cap); [[nodiscard]] z_err_t ZPortRecv(uint64_t port_cap, uint64_t num_bytes, uint8_t* bytes, uint64_t num_caps, uint64_t* caps, uint64_t* type, diff --git a/zion/syscall/syscall.cpp b/zion/syscall/syscall.cpp index 7f86778..4bdf22d 100644 --- a/zion/syscall/syscall.cpp +++ b/zion/syscall/syscall.cpp @@ -198,6 +198,12 @@ z_err_t ChannelRecv(ZChannelRecvReq* req) { return chan->Read(req->message); } +z_err_t PortCreate(ZPortCreateResp* resp) { + auto& proc = gScheduler->CurrentProcess(); + auto port = MakeRefCounted(); + return proc.AddNewCapability(port, ZC_WRITE | ZC_READ); +} + z_err_t PortRecv(ZPortRecvReq* req) { auto& proc = gScheduler->CurrentProcess(); auto port_cap = proc.GetCapability(req->port_cap); @@ -275,6 +281,8 @@ extern "C" z_err_t SyscallHandler(uint64_t call_id, void* req, void* resp) { return ChannelSend(reinterpret_cast(req)); case Z_CHANNEL_RECV: return ChannelRecv(reinterpret_cast(req)); + case Z_PORT_CREATE: + return PortCreate(reinterpret_cast(resp)); case Z_PORT_RECV: return PortRecv(reinterpret_cast(req)); case Z_PORT_POLL: diff --git a/zion/usr/zcall.cpp b/zion/usr/zcall.cpp index 27999b1..f7b981a 100644 --- a/zion/usr/zcall.cpp +++ b/zion/usr/zcall.cpp @@ -163,6 +163,13 @@ z_err_t ZChannelRecv(uint64_t chan_cap, uint64_t num_bytes, uint8_t* bytes, return ret; } +z_err_t ZPortCreate(uint64_t* port_cap) { + ZPortCreateResp resp; + z_err_t ret = SysCall2(Z_PORT_CREATE, 0, &resp); + *port_cap = resp.port_cap; + return ret; +} + z_err_t ZPortRecv(uint64_t port_cap, uint64_t num_bytes, uint8_t* bytes, uint64_t num_caps, uint64_t* caps, uint64_t* type, uint64_t* actual_bytes, uint64_t* actual_caps) { diff --git a/zion/usr/zcall_internal.h b/zion/usr/zcall_internal.h index f55a361..031c0a2 100644 --- a/zion/usr/zcall_internal.h +++ b/zion/usr/zcall_internal.h @@ -86,6 +86,10 @@ struct ZChannelRecvReq { ZMessage message; }; +struct ZPortCreateResp { + uint64_t port_cap; +}; + struct ZPortRecvReq { uint64_t port_cap; ZMessage message;