From 82edb6e80670bda8c5aa762e5389b990fed69d2e Mon Sep 17 00:00:00 2001 From: Andrew Boie Date: Mon, 2 Oct 2017 10:53:06 -0700 Subject: [PATCH] kernel: convert k_msgq APIs to system calls Signed-off-by: Andrew Boie --- include/kernel.h | 18 ++++++---- kernel/msg_q.c | 87 +++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 93 insertions(+), 12 deletions(-) diff --git a/include/kernel.h b/include/kernel.h index 64c4fda244f..786fd81ed04 100644 --- a/include/kernel.h +++ b/include/kernel.h @@ -2862,8 +2862,8 @@ struct k_msgq { * * @return N/A */ -extern void k_msgq_init(struct k_msgq *q, char *buffer, - size_t msg_size, u32_t max_msgs); +__syscall void k_msgq_init(struct k_msgq *q, char *buffer, + size_t msg_size, u32_t max_msgs); /** * @brief Send a message to a message queue. @@ -2881,7 +2881,7 @@ extern void k_msgq_init(struct k_msgq *q, char *buffer, * @retval -ENOMSG Returned without waiting or queue purged. * @retval -EAGAIN Waiting period timed out. */ -extern int k_msgq_put(struct k_msgq *q, void *data, s32_t timeout); +__syscall int k_msgq_put(struct k_msgq *q, void *data, s32_t timeout); /** * @brief Receive a message from a message queue. @@ -2900,7 +2900,7 @@ extern int k_msgq_put(struct k_msgq *q, void *data, s32_t timeout); * @retval -ENOMSG Returned without waiting. * @retval -EAGAIN Waiting period timed out. */ -extern int k_msgq_get(struct k_msgq *q, void *data, s32_t timeout); +__syscall int k_msgq_get(struct k_msgq *q, void *data, s32_t timeout); /** * @brief Purge a message queue. @@ -2913,7 +2913,7 @@ extern int k_msgq_get(struct k_msgq *q, void *data, s32_t timeout); * * @return N/A */ -extern void k_msgq_purge(struct k_msgq *q); +__syscall void k_msgq_purge(struct k_msgq *q); /** * @brief Get the amount of free space in a message queue. @@ -2925,7 +2925,9 @@ extern void k_msgq_purge(struct k_msgq *q); * * @return Number of unused ring buffer entries. */ -static inline u32_t k_msgq_num_free_get(struct k_msgq *q) +__syscall u32_t k_msgq_num_free_get(struct k_msgq *q); + +static inline u32_t _impl_k_msgq_num_free_get(struct k_msgq *q) { return q->max_msgs - q->used_msgs; } @@ -2939,7 +2941,9 @@ static inline u32_t k_msgq_num_free_get(struct k_msgq *q) * * @return Number of messages. */ -static inline u32_t k_msgq_num_used_get(struct k_msgq *q) +__syscall u32_t k_msgq_num_used_get(struct k_msgq *q); + +static inline u32_t _impl_k_msgq_num_used_get(struct k_msgq *q) { return q->used_msgs; } diff --git a/kernel/msg_q.c b/kernel/msg_q.c index 7e58dd31407..dda1c0f38d9 100644 --- a/kernel/msg_q.c +++ b/kernel/msg_q.c @@ -19,6 +19,7 @@ #include #include #include +#include extern struct k_msgq _k_msgq_list_start[]; extern struct k_msgq _k_msgq_list_end[]; @@ -46,8 +47,8 @@ SYS_INIT(init_msgq_module, PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_OBJECTS); #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 @@ void k_msgq_init(struct k_msgq *q, char *buffer, _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 @@ int k_msgq_put(struct k_msgq *q, void *data, s32_t timeout) 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 @@ int k_msgq_get(struct k_msgq *q, void *data, s32_t timeout) 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 @@ void k_msgq_purge(struct k_msgq *q) _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 */