task: Add callback system This patch adds the host callback API to the task library. Signed-off-by: Yuji Mano <yuji.mano@am.sony.com> Acked-by: Kazunori Asayama <asayama@sm.sony.co.jp>
diff --git a/task/include/common/mars/task_types.h b/task/include/common/mars/task_types.h index 8c67ef3..fe72057 100644 --- a/task/include/common/mars/task_types.h +++ b/task/include/common/mars/task_types.h
@@ -103,4 +103,13 @@ } type; }; +/** + * \ingroup group_mars_task + * \brief MARS task host callback function + * + * This is the type definition of the host callback function. + */ +typedef int (*mars_task_host_callback)(struct mars_task_args *in, + struct mars_task_args *out); + #endif
diff --git a/task/include/host/mars/task.h b/task/include/host/mars/task.h index 2ad55a7..8ebecb5 100644 --- a/task/include/host/mars/task.h +++ b/task/include/host/mars/task.h
@@ -47,6 +47,7 @@ #include <stdint.h> #include <mars/base.h> +#include <mars/callback_types.h> #include <mars/context.h> #include <mars/error.h> #include <mars/task_barrier.h>
diff --git a/task/include/mpu/mars/task.h b/task/include/mpu/mars/task.h index ef9e0cc..9212c29 100644 --- a/task/include/mpu/mars/task.h +++ b/task/include/mpu/mars/task.h
@@ -46,6 +46,7 @@ #include <stdint.h> +#include <mars/callback_types.h> #include <mars/error.h> #include <mars/task_barrier.h> #include <mars/task_event_flag.h> @@ -231,6 +232,20 @@ /** * \ingroup group_mars_task + * \brief <b>[MPU]</b> Calls the specified host callback. + * + * \param[in] callback_ea - ea of host callback + * \param[in] in - pointer to args to pass to host callback + * \param[out] out - pointer to args returned by host callback + * \return + * MARS_SUCCESS - host callback successful + * \n MARS_ERROR_FORMAT - no context save area specified + */ +int mars_task_call_host(uint64_t callback_ea, struct mars_callback_args *in, + struct mars_callback_args *out); + +/** + * \ingroup group_mars_task * \brief <b>[host/MPU]</b> Gets tick counter value. * * \note Counter's frequency depends on runtime environment.
diff --git a/task/src/mpu/lib/task.c b/task/src/mpu/lib/task.c index 9ced30f..608f073 100644 --- a/task/src/mpu/lib/task.c +++ b/task/src/mpu/lib/task.c
@@ -160,6 +160,22 @@ return MARS_SUCCESS; } +int mars_task_call_host(uint64_t callback_ea, struct mars_callback_args *in, + struct mars_callback_args *out) +{ + struct mars_task_context *task; + + /* get task context */ + task = mars_task_module_get_task(); + + /* make sure task context has a context save area */ + if (!task->context_save_area_ea) + return MARS_ERROR_FORMAT; + + return mars_task_module_call_host(callback_ea, in, out, + mars_task_module_get_heap()); +} + uint32_t mars_task_get_ticks(void) { return mars_task_module_get_ticks();
diff --git a/task/src/mpu/module/task_module.c b/task/src/mpu/module/task_module.c index 31ed1f4..9f7c678 100644 --- a/task/src/mpu/module/task_module.c +++ b/task/src/mpu/module/task_module.c
@@ -232,6 +232,22 @@ return mars_module_workload_signal_reset(); } +static int task_call_host(uint64_t callback_ea, struct mars_callback_args *in, + struct mars_callback_args *out, void *task_heap) +{ + int ret; + + ret = mars_module_host_callback_set(callback_ea, in); + if (ret != MARS_SUCCESS) + return ret; + + task_save(task_heap, 1); + + mars_module_workload_signal_reset(); + + return mars_module_host_callback_reset(out); +} + static struct mars_task_module_syscalls task_module_syscalls = { get_ticks, @@ -248,6 +264,7 @@ task_signal_send, task_signal_wait, task_signal_try_wait, + task_call_host, mars_module_mutex_lock_get, mars_module_mutex_unlock_put,
diff --git a/task/src/mpu/module/task_module.h b/task/src/mpu/module/task_module.h index 8c2b081..fe7a199 100644 --- a/task/src/mpu/module/task_module.h +++ b/task/src/mpu/module/task_module.h
@@ -41,6 +41,7 @@ #include <stdint.h> #include <unistd.h> +#include "mars/callback_types.h" #include "mars/mutex_types.h" #include "mars/task_types.h" @@ -67,6 +68,9 @@ int (*signal_send)(uint16_t workload_id); int (*signal_wait)(void *heap); int (*signal_try_wait)(void); + int (*call_host)(uint64_t callback_ea, + struct mars_callback_args *in, + struct mars_callback_args *out, void *heap); int (*mutex_lock_get)(uint64_t mutex_ea, struct mars_mutex *mutex); @@ -159,6 +163,15 @@ return (*mars_task_module_syscalls->signal_try_wait)(); } +static inline int mars_task_module_call_host(uint64_t callback_ea, + struct mars_callback_args *in, + struct mars_callback_args *out, + void *task_heap) +{ + return (*mars_task_module_syscalls->call_host)(callback_ea, in, out, + task_heap); +} + static inline int mars_mutex_lock_get(uint64_t mutex_ea, struct mars_mutex *mutex) {