kernel: channel: implement channel_read_msg and msg_read
This commit is contained in:
@@ -158,7 +158,8 @@ extern kern_status_t channel_recv_msg(
|
||||
0,
|
||||
msg->msg_req.msg_data,
|
||||
msg->msg_req.msg_data_count,
|
||||
VM_REGION_COPY_ALL);
|
||||
VM_REGION_COPY_ALL,
|
||||
NULL);
|
||||
if (status != KERN_OK) {
|
||||
kmsg_reply_error(msg, status, &msg_lock_flags);
|
||||
return status;
|
||||
@@ -216,7 +217,8 @@ extern kern_status_t channel_reply_msg(
|
||||
0,
|
||||
resp->msg_data,
|
||||
resp->msg_data_count,
|
||||
VM_REGION_COPY_ALL);
|
||||
VM_REGION_COPY_ALL,
|
||||
NULL);
|
||||
if (status != KERN_OK) {
|
||||
kmsg_reply_error(msg, status, &msg_lock_flags);
|
||||
return status;
|
||||
@@ -241,21 +243,49 @@ extern kern_status_t channel_reply_msg(
|
||||
|
||||
extern kern_status_t channel_read_msg(
|
||||
struct channel *channel,
|
||||
msgid_t msg,
|
||||
msgid_t id,
|
||||
size_t offset,
|
||||
void *buf,
|
||||
size_t len,
|
||||
struct vm_region *dest_region,
|
||||
const struct iovec *dest_iov,
|
||||
size_t dest_iov_count,
|
||||
size_t *nr_read)
|
||||
{
|
||||
return KERN_UNIMPLEMENTED;
|
||||
unsigned long msg_lock_flags;
|
||||
struct kmsg *msg = get_msg_with_id(&channel->c_msg, id);
|
||||
if (!msg) {
|
||||
return KERN_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&msg->msg_lock, &msg_lock_flags);
|
||||
if (msg->msg_status != KMSG_WAIT_REPLY) {
|
||||
spin_unlock_irqrestore(&msg->msg_lock, msg_lock_flags);
|
||||
return KERN_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
kern_status_t status = vm_region_memmove_v(
|
||||
dest_region,
|
||||
0,
|
||||
dest_iov,
|
||||
dest_iov_count,
|
||||
msg->msg_sender_thread->tr_parent->t_address_space,
|
||||
offset,
|
||||
msg->msg_req.msg_data,
|
||||
msg->msg_req.msg_data_count,
|
||||
VM_REGION_COPY_ALL,
|
||||
nr_read);
|
||||
|
||||
spin_unlock_irqrestore(&msg->msg_lock, msg_lock_flags);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
extern kern_status_t channel_write_msg(
|
||||
struct channel *channel,
|
||||
msgid_t msg,
|
||||
size_t offset,
|
||||
const void *buf,
|
||||
size_t len,
|
||||
struct vm_region *src_region,
|
||||
const struct iovec *src_iov,
|
||||
size_t src_iov_count,
|
||||
size_t *nr_written)
|
||||
{
|
||||
return KERN_UNIMPLEMENTED;
|
||||
|
||||
Reference in New Issue
Block a user