From 857b7fae03aba1a80ab2c0c3e8c81140f85b9542 Mon Sep 17 00:00:00 2001 From: Drew Galbraith Date: Sat, 17 Jun 2023 01:05:10 -0700 Subject: [PATCH] [zion] Add a port send syscall --- zion/include/zcall.h | 3 +++ zion/syscall/syscall.cpp | 12 ++++++++++++ zion/usr/zcall.cpp | 13 +++++++++++++ zion/usr/zcall_internal.h | 5 +++++ 4 files changed, 33 insertions(+) diff --git a/zion/include/zcall.h b/zion/include/zcall.h index c0c756f..7c7a759 100644 --- a/zion/include/zcall.h +++ b/zion/include/zcall.h @@ -94,6 +94,9 @@ void ZThreadExit(); uint64_t* actual_caps); [[nodiscard]] z_err_t ZPortCreate(uint64_t* port_cap); +[[nodiscard]] z_err_t ZPortSend(uint64_t port_cap, uint64_t num_bytes, + const uint8_t* bytes, uint64_t num_caps, + uint64_t* caps); [[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 2e79bfa..04a5d5c 100644 --- a/zion/syscall/syscall.cpp +++ b/zion/syscall/syscall.cpp @@ -204,6 +204,16 @@ z_err_t PortCreate(ZPortCreateResp* resp) { return proc.AddNewCapability(port, ZC_WRITE | ZC_READ); } +z_err_t PortSend(ZPortSendReq* req) { + auto& proc = gScheduler->CurrentProcess(); + auto port_cap = proc.GetCapability(req->port_cap); + RET_ERR(ValidateCap(port_cap, ZC_WRITE)); + + auto port = port_cap->obj(); + RET_IF_NULL(port); + return port->Write(req->message); +} + z_err_t PortRecv(ZPortRecvReq* req) { auto& proc = gScheduler->CurrentProcess(); auto port_cap = proc.GetCapability(req->port_cap); @@ -293,6 +303,8 @@ extern "C" z_err_t SyscallHandler(uint64_t call_id, void* req, void* resp) { return ChannelRecv(reinterpret_cast(req)); case Z_PORT_CREATE: return PortCreate(reinterpret_cast(resp)); + case Z_PORT_SEND: + return PortSend(reinterpret_cast(req)); 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 fe98066..3a6d09f 100644 --- a/zion/usr/zcall.cpp +++ b/zion/usr/zcall.cpp @@ -170,6 +170,19 @@ z_err_t ZPortCreate(uint64_t* port_cap) { return ret; } +z_err_t ZPortSend(uint64_t port_cap, uint64_t num_bytes, const uint8_t* bytes, + uint64_t num_caps, uint64_t* caps) { + ZPortSendReq req{.port_cap = port_cap, + .message = { + .type = 0, + .num_bytes = num_bytes, + .bytes = const_cast(bytes), + .num_caps = num_caps, + .caps = caps, + }}; + return SysCall1(Z_PORT_SEND, &req); +} + 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 6fd5382..1d70406 100644 --- a/zion/usr/zcall_internal.h +++ b/zion/usr/zcall_internal.h @@ -90,6 +90,11 @@ struct ZPortCreateResp { uint64_t port_cap; }; +struct ZPortSendReq { + uint64_t port_cap; + ZMessage message; +}; + struct ZPortRecvReq { uint64_t port_cap; ZMessage message;