From d32988c56ca065c3049b87a17fed26bcfbba4f4c Mon Sep 17 00:00:00 2001 From: Max Wash Date: Mon, 23 Feb 2026 21:56:16 +0000 Subject: [PATCH] lib: msg: implement generic messave init and receive --- lib/libmsg/CMakeLists.txt | 2 +- lib/libmsg/include/rosetta/msg.h | 16 ++++++++++++++++ lib/libmsg/msg.c | 32 +++++++++++++++++++++++++++++++- 3 files changed, 48 insertions(+), 2 deletions(-) diff --git a/lib/libmsg/CMakeLists.txt b/lib/libmsg/CMakeLists.txt index e17787b..71d8544 100644 --- a/lib/libmsg/CMakeLists.txt +++ b/lib/libmsg/CMakeLists.txt @@ -18,4 +18,4 @@ sysroot_add_library( HEADER_DIR /usr/include LIB_DIR /usr/lib) -target_link_libraries(libmsg libmango) +target_link_libraries(libmsg libmango ulibc) diff --git a/lib/libmsg/include/rosetta/msg.h b/lib/libmsg/include/rosetta/msg.h index 80a9e4c..7f67c18 100644 --- a/lib/libmsg/include/rosetta/msg.h +++ b/lib/libmsg/include/rosetta/msg.h @@ -3,6 +3,7 @@ #define ROSETTA_MSG_MAGIC 0x9AB07D10U +#include #include struct rosetta_msg { @@ -12,4 +13,19 @@ struct rosetta_msg { uint16_t msg_reserved; }; +struct rosetta_msg_string { + char *s_buf; + size_t s_len; + size_t s_max; +}; + +extern void rosetta_msg_init( + struct rosetta_msg *msg, + uint32_t protocol_id, + uint16_t msg_id); +extern kern_status_t rosetta_msg_recv( + kern_handle_t channel, + msgid_t *out_id, + struct rosetta_msg *out_msg); + #endif diff --git a/lib/libmsg/msg.c b/lib/libmsg/msg.c index 418fc0f..324b492 100644 --- a/lib/libmsg/msg.c +++ b/lib/libmsg/msg.c @@ -1,3 +1,33 @@ -void msg_tmp(void) +#include +#include + +void rosetta_msg_init( + struct rosetta_msg *msg, + uint32_t protocol_id, + uint16_t msg_id) { + memset(msg, 0x0, sizeof *msg); + + msg->msg_magic = ROSETTA_MSG_MAGIC; + msg->msg_protocol = protocol_id; + msg->msg_id = msg_id; +} + +kern_status_t rosetta_msg_recv( + kern_handle_t channel, + msgid_t *out_id, + struct rosetta_msg *out_msg) +{ + struct iovec iov = IOVEC(out_msg, sizeof *out_msg); + struct msg kmsg = MSG(&iov, 1, NULL, 0); + kern_status_t status = msg_recv(channel, 0, out_id, &kmsg); + if (status != KERN_OK) { + return status; + } + + if (out_msg->msg_magic != ROSETTA_MSG_MAGIC) { + return KERN_INVALID_ARGUMENT; + } + + return KERN_OK; }