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

@@ -124,9 +124,7 @@ 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)
{
struct wait_item waiter;
@@ -155,20 +153,47 @@ extern kern_status_t channel_recv_msg(
struct vm_region *src = sender->t_address_space,
*dst = receiver->t_address_space;
unsigned long f;
vm_region_lock_pair_irqsave(src, dst, &f);
kern_status_t status = vm_region_memmove_v(
dst,
0,
out_data,
out_data_count,
out_msg->msg_data,
out_msg->msg_data_count,
src,
0,
msg->msg_req_data,
msg->msg_req_data_count,
msg->msg_req.msg_data,
msg->msg_req.msg_data_count,
VM_REGION_COPY_ALL,
NULL);
if (status != KERN_OK) {
kmsg_reply_error(msg, status, &msg_lock_flags);
return status;
}
struct handle_table *src_table = sender->t_handles,
*dst_table = receiver->t_handles;
spin_lock_pair_irqsave(
&sender->t_handles_lock,
&receiver->t_handles_lock,
&f);
status = handle_table_transfer(
dst,
dst_table,
out_msg->msg_handles,
out_msg->msg_handles_count,
src,
src_table,
msg->msg_req.msg_handles,
msg->msg_req.msg_handles_count);
spin_unlock_pair_irqrestore(
&sender->t_handles_lock,
&receiver->t_handles_lock,
f);
vm_region_unlock_pair_irqrestore(src, dst, f);
if (status != KERN_OK) {
@@ -176,7 +201,7 @@ extern kern_status_t channel_recv_msg(
return status;
}
*out_id = msg->msg_id;
out_msg->msg_id = msg->msg_id;
spin_unlock_irqrestore(&msg->msg_lock, msg_lock_flags);
@@ -186,8 +211,7 @@ extern kern_status_t channel_recv_msg(
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)
{
unsigned long msg_lock_flags;
@@ -216,14 +240,40 @@ extern kern_status_t channel_reply_msg(
kern_status_t status = vm_region_memmove_v(
dst,
0,
msg->msg_resp_data,
msg->msg_resp_data_count,
msg->msg_resp.msg_data,
msg->msg_resp.msg_data_count,
src,
0,
resp_data,
resp_data_count,
reply->msg_data,
reply->msg_data_count,
VM_REGION_COPY_ALL,
NULL);
if (status != KERN_OK) {
kmsg_reply_error(msg, status, &msg_lock_flags);
return status;
}
struct handle_table *src_table = sender->t_handles,
*dst_table = receiver->t_handles;
spin_lock_pair_irqsave(
&sender->t_handles_lock,
&receiver->t_handles_lock,
&f);
status = handle_table_transfer(
dst,
dst_table,
msg->msg_resp.msg_handles,
msg->msg_resp.msg_handles_count,
src,
src_table,
reply->msg_handles,
reply->msg_handles_count);
spin_unlock_pair_irqrestore(
&sender->t_handles_lock,
&receiver->t_handles_lock,
f);
vm_region_unlock_pair_irqrestore(src, dst, f);
if (status != KERN_OK) {
@@ -241,7 +291,7 @@ extern kern_status_t channel_read_msg(
msgid_t id,
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)
{
@@ -270,8 +320,8 @@ extern kern_status_t channel_read_msg(
dest_iov_count,
src_region,
offset,
msg->msg_req_data,
msg->msg_req_data_count,
msg->msg_req.msg_data,
msg->msg_req.msg_data_count,
VM_REGION_COPY_ALL,
nr_read);
vm_region_unlock_pair_irqrestore(src_region, dest_region, f);
@@ -286,7 +336,7 @@ extern kern_status_t channel_write_msg(
msgid_t id,
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)
{
@@ -311,8 +361,8 @@ extern kern_status_t channel_write_msg(
kern_status_t status = vm_region_memmove_v(
dest_region,
0,
msg->msg_resp_data,
msg->msg_resp_data_count,
msg->msg_resp.msg_data,
msg->msg_resp.msg_data_count,
src_region,
offset,
src_iov,