From c2f9f5388b69a4866486132c29bef79d5eaf5221 Mon Sep 17 00:00:00 2001 From: Drew Galbraith Date: Sun, 28 Jul 2024 20:54:52 -0700 Subject: [PATCH] Move yunq client to use syscall helpers. --- rust/lib/mammoth/src/syscall.rs | 40 +++++++++++++++++++++++++++++++++ rust/lib/yunq/src/buffer.rs | 8 +++---- rust/lib/yunq/src/client.rs | 30 ++++++++----------------- 3 files changed, 53 insertions(+), 25 deletions(-) diff --git a/rust/lib/mammoth/src/syscall.rs b/rust/lib/mammoth/src/syscall.rs index 799d467..3d029bc 100644 --- a/rust/lib/mammoth/src/syscall.rs +++ b/rust/lib/mammoth/src/syscall.rs @@ -115,3 +115,43 @@ pub fn port_poll( syscall(zion::kZionPortPoll, &req)?; Ok((num_bytes, num_caps)) } + +pub fn endpoint_send( + endpoint_cap: z_cap_t, + bytes: &[u8], + caps: &[z_cap_t], +) -> Result { + let mut reply_port_cap: u64 = 0; + let send_req = zion::ZEndpointSendReq { + caps: caps.as_ptr(), + num_caps: caps.len() as u64, + endpoint_cap, + data: bytes.as_ptr() as *const c_void, + num_bytes: bytes.len() as u64, + reply_port_cap: &mut reply_port_cap as *mut z_cap_t, + }; + + syscall(zion::kZionEndpointSend, &send_req)?; + + Ok(reply_port_cap) +} + +pub fn reply_port_recv( + reply_port_cap: z_cap_t, + bytes: &mut [u8], + caps: &mut [z_cap_t], +) -> Result<(u64, u64), ZError> { + let mut num_bytes = bytes.len() as u64; + let mut num_caps = caps.len() as u64; + let recv_req = zion::ZReplyPortRecvReq { + reply_port_cap, + caps: caps.as_mut_ptr(), + num_caps: &mut num_caps as *mut u64, + data: bytes.as_mut_ptr() as *mut c_void, + num_bytes: &mut num_bytes as *mut u64, + }; + + syscall(zion::kZionReplyPortRecv, &recv_req)?; + + Ok((num_bytes, num_caps)) +} diff --git a/rust/lib/yunq/src/buffer.rs b/rust/lib/yunq/src/buffer.rs index 5c13c76..c3b0b18 100644 --- a/rust/lib/yunq/src/buffer.rs +++ b/rust/lib/yunq/src/buffer.rs @@ -15,12 +15,12 @@ impl ByteBuffer { N as u64 } - pub fn raw_ptr(&self) -> *const u8 { - self.buffer.as_ptr() + pub fn slice(&self, len: usize) -> &[u8] { + &self.buffer[..len] } - pub fn mut_ptr(&mut self) -> *mut u8 { - self.buffer.as_mut_ptr() + pub fn mut_slice(&mut self) -> &mut [u8] { + &mut self.buffer[..] } pub fn write_at(&mut self, offset: usize, obj: T) -> Result<(), ZError> { diff --git a/rust/lib/yunq/src/client.rs b/rust/lib/yunq/src/client.rs index dbe4657..f8ff367 100644 --- a/rust/lib/yunq/src/client.rs +++ b/rust/lib/yunq/src/client.rs @@ -1,7 +1,6 @@ use crate::buffer::ByteBuffer; use crate::message::YunqMessage; use alloc::vec::Vec; -use core::ffi::c_void; use mammoth::zion::z_cap_t; use mammoth::zion::ZError; @@ -21,31 +20,20 @@ pub fn call_endpoint( byte_buffer.write_at(4, (16 + length) as u32)?; - let mut reply_port_cap: u64 = 0; - let send_req = mammoth::zion::ZEndpointSendReq { - caps: cap_buffer.as_ptr(), - num_caps: cap_buffer.len() as u64, + let reply_port_cap = mammoth::syscall::endpoint_send( endpoint_cap, - data: byte_buffer.raw_ptr() as *const c_void, - num_bytes: 16 + length as u64, - reply_port_cap: &mut reply_port_cap as *mut z_cap_t, - }; + byte_buffer.slice(16 + length), + cap_buffer.as_slice(), + )?; - mammoth::syscall::syscall(mammoth::zion::kZionEndpointSend, &send_req)?; // FIXME: Add a way to zero out the byte buffer. - let mut buffer_size = byte_buffer.size(); - let mut num_caps: u64 = 10; - cap_buffer = vec![0; num_caps as usize]; - let recv_req = mammoth::zion::ZReplyPortRecvReq { + cap_buffer = vec![0; 10]; + mammoth::syscall::reply_port_recv( reply_port_cap, - caps: cap_buffer.as_mut_ptr(), - num_caps: &mut num_caps as *mut u64, - data: byte_buffer.mut_ptr() as *mut c_void, - num_bytes: &mut buffer_size as *mut u64, - }; - - mammoth::syscall::syscall(mammoth::zion::kZionReplyPortRecv, &recv_req)?; + byte_buffer.mut_slice(), + cap_buffer.as_mut_slice(), + )?; if byte_buffer.at::(0)? != SENTINEL { return Err(ZError::INVALID_RESPONSE);