kernel: re-implement sending handles via port messages

This commit is contained in:
2026-03-01 19:10:01 +00:00
parent b1bdb89ca4
commit 36c5ac7837
23 changed files with 399 additions and 168 deletions

View File

@@ -1,8 +1,8 @@
#ifndef KERNEL_ARG_H_
#define KERNEL_ARG_H_
#include <mango/types.h>
#include <stdbool.h>
#include <mango/status.h>
#define CMDLINE_MAX 4096

View File

@@ -25,15 +25,12 @@ extern kern_status_t channel_enqueue_msg(
extern kern_status_t channel_recv_msg(
struct channel *channel,
msgid_t *out_id,
struct iovec *out_data,
size_t out_data_count,
kern_msg_t *out_msg,
unsigned long *irq_flags);
extern kern_status_t channel_reply_msg(
struct channel *channel,
msgid_t id,
const struct iovec *resp_data,
size_t resp_data_count,
const kern_msg_t *reply,
unsigned long *irq_flags);
extern kern_status_t channel_read_msg(
@@ -41,7 +38,7 @@ extern kern_status_t channel_read_msg(
msgid_t msg,
size_t offset,
struct vm_region *dest_region,
const struct iovec *dest_iov,
const kern_iovec_t *dest_iov,
size_t dest_iov_count,
size_t *nr_read);
extern kern_status_t channel_write_msg(
@@ -49,7 +46,7 @@ extern kern_status_t channel_write_msg(
msgid_t msg,
size_t offset,
struct vm_region *src_region,
const struct iovec *src_iov,
const kern_iovec_t *src_iov,
size_t src_iov_count,
size_t *nr_written);

View File

@@ -14,9 +14,10 @@
representing a serial port may allow both sending AND receiving over the
port.
*/
#include <kernel/queue.h>
#include <kernel/locks.h>
#include <kernel/queue.h>
#include <mango/status.h>
#include <mango/types.h>
#ifdef __cplusplus
extern "C" {

View File

@@ -3,6 +3,7 @@
#include <kernel/bitmap.h>
#include <mango/status.h>
#include <mango/types.h>
#include <stddef.h>
#include <stdint.h>
@@ -16,6 +17,7 @@ typedef uintptr_t handle_flags_t;
struct task;
struct object;
struct vm_region;
struct handle_list;
struct handle {
@@ -54,4 +56,14 @@ extern struct handle *handle_table_get_handle(
struct handle_table *tab,
kern_handle_t handle);
extern kern_status_t handle_table_transfer(
struct vm_region *dst_region,
struct handle_table *dst,
kern_msg_handle_t *dst_handles,
size_t dst_handles_max,
struct vm_region *src_region,
struct handle_table *src,
kern_msg_handle_t *src_handles,
size_t src_handles_count);
#endif

View File

@@ -8,7 +8,7 @@ struct iovec_iterator {
/* if this is set, we are iterating over a list of iovecs stored in
* userspace, and must go through this region to retrieve the data. */
struct vm_region *it_region;
const struct iovec *it_vecs;
const kern_iovec_t *it_vecs;
size_t it_nr_vecs;
size_t it_vec_ptr;
@@ -18,12 +18,12 @@ struct iovec_iterator {
extern void iovec_iterator_begin(
struct iovec_iterator *it,
const struct iovec *vecs,
const kern_iovec_t *vecs,
size_t nr_vecs);
extern void iovec_iterator_begin_user(
struct iovec_iterator *it,
struct vm_region *address_space,
const struct iovec *vecs,
const kern_iovec_t *vecs,
size_t nr_vecs);
extern void iovec_iterator_seek(struct iovec_iterator *it, size_t nr_bytes);

View File

@@ -22,6 +22,38 @@ typedef __aligned(8) ml_hwlock_t spin_lock_t;
#define spin_unlock_irqrestore(lck, flags) \
ml_hwlock_unlock_irqrestore(lck, flags);
static inline void spin_lock_pair_irqsave(
spin_lock_t *a,
spin_lock_t *b,
unsigned long *flags)
{
if (a == b) {
spin_lock_irqsave(a, flags);
} else if (a < b) {
spin_lock_irqsave(a, flags);
spin_lock(b);
} else {
spin_lock_irqsave(b, flags);
spin_lock(a);
}
}
static inline void spin_unlock_pair_irqrestore(
spin_lock_t *a,
spin_lock_t *b,
unsigned long flags)
{
if (a == b) {
spin_unlock_irqrestore(a, flags);
} else if (a < b) {
spin_unlock(b);
spin_unlock_irqrestore(a, flags);
} else {
spin_unlock(a);
spin_unlock_irqrestore(b, flags);
}
}
#ifdef __cplusplus
}
#endif

View File

@@ -23,10 +23,7 @@ struct msg {
kern_status_t msg_result;
struct port *msg_sender_port;
struct thread *msg_sender_thread;
const struct iovec *msg_req_data;
size_t msg_req_data_count;
struct iovec *msg_resp_data;
size_t msg_resp_data_count;
kern_msg_t msg_req, msg_resp;
};
#endif

View File

@@ -32,10 +32,8 @@ extern kern_status_t port_connect(struct port *port, struct channel *remote);
extern kern_status_t port_disconnect(struct port *port);
extern kern_status_t port_send_msg(
struct port *port,
const struct iovec *req_data,
size_t req_data_count,
struct iovec *resp_data,
size_t resp_data_count,
const kern_msg_t *msg,
kern_msg_t *out_response,
unsigned long *lock_flags);
DEFINE_OBJECT_LOCK_FUNCTION(port, p_base)

View File

@@ -85,6 +85,7 @@ struct task {
pmap_t t_pmap;
struct vm_region *t_address_space;
spin_lock_t t_handles_lock;
struct handle_table *t_handles;
struct btree b_channels;

View File

@@ -153,32 +153,26 @@ extern kern_status_t sys_port_disconnect(kern_handle_t port);
extern kern_status_t sys_msg_send(
kern_handle_t port,
const struct iovec *req_data,
size_t req_data_count,
struct iovec *resp_data,
size_t resp_data_count);
extern kern_status_t sys_msg_recv(
kern_handle_t channel,
msgid_t *out_id,
struct iovec *out_data,
size_t out_data_count);
const kern_msg_t *msg,
kern_msg_t *out_reply);
extern kern_status_t sys_msg_recv(kern_handle_t channel, kern_msg_t *out_msg);
extern kern_status_t sys_msg_reply(
kern_handle_t channel,
msgid_t id,
const struct iovec *reply_data,
size_t reply_data_count);
const kern_msg_t *msg);
extern kern_status_t sys_msg_read(
kern_handle_t channel_handle,
msgid_t id,
size_t offset,
const struct iovec *iov,
const kern_iovec_t *iov,
size_t iov_count,
size_t *nr_read);
extern kern_status_t sys_msg_write(
kern_handle_t channel,
msgid_t id,
size_t offset,
const struct iovec *in,
const kern_iovec_t *in,
size_t nr_in,
size_t *nr_written);

View File

@@ -177,11 +177,11 @@ extern kern_status_t vm_region_memmove(
extern kern_status_t vm_region_memmove_v(
struct vm_region *dest_region,
size_t dest_offset,
const struct iovec *dest,
const kern_iovec_t *dest,
size_t nr_dest,
struct vm_region *src_region,
size_t src_offset,
const struct iovec *src,
const kern_iovec_t *src,
size_t nr_src,
size_t bytes_to_move,
size_t *nr_bytes_moved);