kernel: re-implement sending handles via port messages
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user