kernel: remove support for sending kernel handles via port/channel
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
#include <kernel/object.h>
|
||||
#include <kernel/sched.h>
|
||||
|
||||
struct kmsg;
|
||||
struct msg;
|
||||
|
||||
struct channel {
|
||||
struct object c_base;
|
||||
@@ -21,17 +21,19 @@ extern struct channel *channel_create(void);
|
||||
|
||||
extern kern_status_t channel_enqueue_msg(
|
||||
struct channel *channel,
|
||||
struct kmsg *msg);
|
||||
struct msg *msg);
|
||||
|
||||
extern kern_status_t channel_recv_msg(
|
||||
struct channel *channel,
|
||||
struct msg *out_msg,
|
||||
msgid_t *out_id,
|
||||
struct iovec *out_data,
|
||||
size_t out_data_count,
|
||||
unsigned long *irq_flags);
|
||||
extern kern_status_t channel_reply_msg(
|
||||
struct channel *channel,
|
||||
msgid_t id,
|
||||
const struct msg *resp,
|
||||
const struct iovec *resp_data,
|
||||
size_t resp_data_count,
|
||||
unsigned long *irq_flags);
|
||||
|
||||
extern kern_status_t channel_read_msg(
|
||||
|
||||
@@ -54,12 +54,4 @@ extern struct handle *handle_table_get_handle(
|
||||
struct handle_table *tab,
|
||||
kern_handle_t handle);
|
||||
|
||||
extern kern_status_t handle_list_transfer(
|
||||
struct handle_table *dest,
|
||||
struct handle_list *dest_list,
|
||||
size_t dest_list_count,
|
||||
struct handle_table *src,
|
||||
const struct handle_list *src_list,
|
||||
size_t src_list_count);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -15,7 +15,7 @@ enum kmsg_status {
|
||||
KMSG_REPLY_SENT,
|
||||
};
|
||||
|
||||
struct kmsg {
|
||||
struct msg {
|
||||
spin_lock_t msg_lock;
|
||||
enum kmsg_status msg_status;
|
||||
struct btree_node msg_node;
|
||||
@@ -23,8 +23,10 @@ struct kmsg {
|
||||
kern_status_t msg_result;
|
||||
struct port *msg_sender_port;
|
||||
struct thread *msg_sender_thread;
|
||||
struct msg msg_req;
|
||||
struct msg msg_resp;
|
||||
const struct iovec *msg_req_data;
|
||||
size_t msg_req_data_count;
|
||||
struct iovec *msg_resp_data;
|
||||
size_t msg_resp_data_count;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -32,8 +32,10 @@ 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 msg *req,
|
||||
struct msg *resp,
|
||||
const struct iovec *req_data,
|
||||
size_t req_data_count,
|
||||
struct iovec *resp_data,
|
||||
size_t resp_data_count,
|
||||
unsigned long *lock_flags);
|
||||
|
||||
DEFINE_OBJECT_LOCK_FUNCTION(port, p_base)
|
||||
|
||||
@@ -114,7 +114,7 @@ struct thread {
|
||||
virt_addr_t tr_cpu_user_sp, tr_cpu_kernel_sp;
|
||||
|
||||
struct runqueue *tr_rq;
|
||||
struct kmsg tr_msg;
|
||||
struct msg tr_msg;
|
||||
|
||||
struct queue_entry tr_parent_entry;
|
||||
struct queue_entry tr_rqentry;
|
||||
|
||||
@@ -2,16 +2,14 @@
|
||||
#define KERNEL_SYSCALL_H_
|
||||
|
||||
#include <kernel/handle.h>
|
||||
#include <kernel/sched.h>
|
||||
#include <kernel/vm-region.h>
|
||||
#include <kernel/vm.h>
|
||||
#include <mango/status.h>
|
||||
#include <mango/syscall.h>
|
||||
|
||||
#define validate_access(task, ptr, len, flags) \
|
||||
vm_region_validate_access( \
|
||||
task->t_address_space, \
|
||||
(virt_addr_t)ptr, \
|
||||
len, \
|
||||
flags | VM_PROT_USER)
|
||||
__validate_access(task, (const void *)ptr, len, flags)
|
||||
#define validate_access_r(task, ptr, len) \
|
||||
validate_access(task, ptr, len, VM_PROT_READ | VM_PROT_USER)
|
||||
#define validate_access_w(task, ptr, len) \
|
||||
@@ -23,6 +21,23 @@
|
||||
len, \
|
||||
VM_PROT_READ | VM_PROT_WRITE | VM_PROT_USER)
|
||||
|
||||
static inline bool __validate_access(
|
||||
struct task *task,
|
||||
const void *ptr,
|
||||
size_t len,
|
||||
vm_prot_t flags)
|
||||
{
|
||||
unsigned long irq_flags;
|
||||
vm_region_lock_irqsave(task->t_address_space, &irq_flags);
|
||||
bool result = vm_region_validate_access(
|
||||
task->t_address_space,
|
||||
(virt_addr_t)ptr,
|
||||
len,
|
||||
flags | VM_PROT_USER);
|
||||
vm_region_unlock_irqrestore(task->t_address_space, irq_flags);
|
||||
return result;
|
||||
}
|
||||
|
||||
extern kern_status_t sys_task_exit(int status);
|
||||
extern kern_status_t sys_task_self(kern_handle_t *out);
|
||||
extern kern_status_t sys_task_create(
|
||||
@@ -128,10 +143,7 @@ extern kern_status_t sys_kern_config_set(
|
||||
const void *ptr,
|
||||
size_t len);
|
||||
|
||||
extern kern_status_t sys_channel_create(
|
||||
unsigned int id,
|
||||
channel_flags_t flags,
|
||||
kern_handle_t *out);
|
||||
extern kern_status_t sys_channel_create(unsigned int id, kern_handle_t *out);
|
||||
extern kern_status_t sys_port_create(kern_handle_t *out);
|
||||
extern kern_status_t sys_port_connect(
|
||||
kern_handle_t port,
|
||||
@@ -141,22 +153,20 @@ extern kern_status_t sys_port_disconnect(kern_handle_t port);
|
||||
|
||||
extern kern_status_t sys_msg_send(
|
||||
kern_handle_t port,
|
||||
msg_flags_t flags,
|
||||
const struct msg *req,
|
||||
struct msg *resp);
|
||||
|
||||
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,
|
||||
msg_flags_t flags,
|
||||
msgid_t *out_id,
|
||||
struct msg *out_msg);
|
||||
|
||||
struct iovec *out_data,
|
||||
size_t out_data_count);
|
||||
extern kern_status_t sys_msg_reply(
|
||||
kern_handle_t channel,
|
||||
msg_flags_t flags,
|
||||
msgid_t id,
|
||||
const struct msg *reply);
|
||||
|
||||
const struct iovec *reply_data,
|
||||
size_t reply_data_count);
|
||||
extern kern_status_t sys_msg_read(
|
||||
kern_handle_t channel_handle,
|
||||
msgid_t id,
|
||||
@@ -164,25 +174,13 @@ extern kern_status_t sys_msg_read(
|
||||
const struct iovec *iov,
|
||||
size_t iov_count,
|
||||
size_t *nr_read);
|
||||
extern kern_status_t sys_msg_read_handles(
|
||||
kern_handle_t channel,
|
||||
msgid_t id,
|
||||
size_t offset,
|
||||
struct handle_list *out,
|
||||
size_t nr_out);
|
||||
|
||||
extern kern_status_t sys_msg_write(
|
||||
kern_handle_t channel,
|
||||
msgid_t id,
|
||||
size_t offset,
|
||||
const struct iovec *in,
|
||||
size_t nr_in);
|
||||
extern kern_status_t sys_msg_write_handles(
|
||||
kern_handle_t channel,
|
||||
msgid_t id,
|
||||
size_t offset,
|
||||
const struct handle_list *in,
|
||||
size_t nr_in);
|
||||
size_t nr_in,
|
||||
size_t *nr_written);
|
||||
|
||||
extern virt_addr_t syscall_get_function(unsigned int sysid);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user