kernel: convert k_msgq APIs to system calls
Signed-off-by: Andrew Boie <andrew.p.boie@intel.com>
diff --git a/kernel/msg_q.c b/kernel/msg_q.c
index 7e58dd3..dda1c0f 100644
--- a/kernel/msg_q.c
+++ b/kernel/msg_q.c
@@ -19,6 +19,7 @@
#include <wait_q.h>
#include <misc/dlist.h>
#include <init.h>
+#include <syscall_handler.h>
extern struct k_msgq _k_msgq_list_start[];
extern struct k_msgq _k_msgq_list_end[];
@@ -46,8 +47,8 @@
#endif /* CONFIG_OBJECT_TRACING */
-void k_msgq_init(struct k_msgq *q, char *buffer,
- size_t msg_size, u32_t max_msgs)
+void _impl_k_msgq_init(struct k_msgq *q, char *buffer,
+ size_t msg_size, u32_t max_msgs)
{
q->msg_size = msg_size;
q->max_msgs = max_msgs;
@@ -62,7 +63,22 @@
_k_object_init(q);
}
-int k_msgq_put(struct k_msgq *q, void *data, s32_t timeout)
+#ifdef CONFIG_USERSPACE
+u32_t _handler_k_msgq_init(u32_t q, u32_t buffer, u32_t msg_size,
+ u32_t max_msgs, u32_t arg5, u32_t arg6, void *ssf)
+{
+ _SYSCALL_ARG4;
+
+ _SYSCALL_IS_OBJ(q, K_OBJ_MSGQ, 1, ssf);
+ _SYSCALL_MEMORY(buffer, msg_size * max_msgs, 1, ssf);
+
+ _impl_k_msgq_init((struct k_msgq *)q, (char *)buffer, msg_size,
+ max_msgs);
+ return 0;
+}
+#endif
+
+int _impl_k_msgq_put(struct k_msgq *q, void *data, s32_t timeout)
{
__ASSERT(!_is_in_isr() || timeout == K_NO_WAIT, "");
@@ -110,7 +126,21 @@
return result;
}
-int k_msgq_get(struct k_msgq *q, void *data, s32_t timeout)
+#ifdef CONFIG_USERSPACE
+u32_t _handler_k_msgq_put(u32_t msgq_p, u32_t data, u32_t timeout,
+ u32_t arg4, u32_t arg5, u32_t arg6, void *ssf)
+{
+ struct k_msgq *q = (struct k_msgq *)msgq_p;
+ _SYSCALL_ARG3;
+
+ _SYSCALL_IS_OBJ(q, K_OBJ_MSGQ, 0, ssf);
+ _SYSCALL_MEMORY(data, q->msg_size, 0, ssf);
+
+ return _impl_k_msgq_put(q, (void *)data, timeout);
+}
+#endif
+
+int _impl_k_msgq_get(struct k_msgq *q, void *data, s32_t timeout)
{
__ASSERT(!_is_in_isr() || timeout == K_NO_WAIT, "");
@@ -164,7 +194,21 @@
return result;
}
-void k_msgq_purge(struct k_msgq *q)
+#ifdef CONFIG_USERSPACE
+u32_t _handler_k_msgq_get(u32_t msgq_p, u32_t data, u32_t timeout,
+ u32_t arg4, u32_t arg5, u32_t arg6, void *ssf)
+{
+ struct k_msgq *q = (struct k_msgq *)msgq_p;
+ _SYSCALL_ARG3;
+
+ _SYSCALL_IS_OBJ(q, K_OBJ_MSGQ, 0, ssf);
+ _SYSCALL_MEMORY(data, q->msg_size, 1, ssf);
+
+ return _impl_k_msgq_get(q, (void *)data, timeout);
+}
+#endif
+
+void _impl_k_msgq_purge(struct k_msgq *q)
{
unsigned int key = irq_lock();
struct k_thread *pending_thread;
@@ -181,3 +225,36 @@
_reschedule_threads(key);
}
+
+#ifdef CONFIG_USERSPACE
+u32_t _handler_k_msgq_purge(u32_t q, u32_t arg2, u32_t arg3,
+ u32_t arg4, u32_t arg5, u32_t arg6, void *ssf)
+{
+ _SYSCALL_ARG1;
+
+ _SYSCALL_IS_OBJ(q, K_OBJ_MSGQ, 0, ssf);
+
+ _impl_k_msgq_purge((struct k_msgq *)q);
+ return 0;
+}
+
+u32_t _handler_k_msgq_num_free_get(u32_t q, u32_t arg2, u32_t arg3, u32_t arg4,
+ u32_t arg5, u32_t arg6, void *ssf)
+{
+ _SYSCALL_ARG1;
+
+ _SYSCALL_IS_OBJ(q, K_OBJ_MSGQ, 0, ssf);
+
+ return _impl_k_msgq_num_free_get((struct k_msgq *)q);
+}
+
+u32_t _handler_k_msgq_num_used_get(u32_t q, u32_t arg2, u32_t arg3, u32_t arg4,
+ u32_t arg5, u32_t arg6, void *ssf)
+{
+ _SYSCALL_ARG1;
+
+ _SYSCALL_IS_OBJ(q, K_OBJ_MSGQ, 0, ssf);
+
+ return _impl_k_msgq_num_used_get((struct k_msgq *)q);
+}
+#endif /* CONFIG_USERSPACE */