[Cbe-oss-dev] [PATCH 08/10 v2]MARS: Fix error handling
Yuji Mano
yuji.mano at am.sony.com
Fri Oct 3 08:48:33 EST 2008
This removes the mars_debug.h and mars_timer.h headers and removes usage of all
debug macros.
The error handling is fixed to not use any macros.
Signed-off-by: Yuji Mano <yuji.mano at am.sony.com>
---
v2:
- fix not properly unlocking mutex on error conditions
- fix careless copy/paste of mis-ordered goto and setting return value
- minor cosmetic cleanups
include/common/mars/mars_debug.h | 295 ---------------------------
include/common/mars/mars_task_types.h | 4
include/host/mars/mars_timer.h | 121 -----------
include/mpu/mars/mars_dma.h | 98 +++------
include/mpu/mars/mars_kernel.h | 2
include/mpu/mars/mars_timer.h | 123 -----------
src/host/lib/Makefile.am | 2
src/host/lib/mars_context.c | 154 ++++++++------
src/host/lib/mars_mutex.c | 24 +-
src/host/lib/mars_task.c | 166 +++++++++------
src/host/lib/mars_task_barrier.c | 23 +-
src/host/lib/mars_task_event_flag.c | 86 +++++---
src/host/lib/mars_task_queue.c | 89 +++++---
src/host/lib/mars_task_semaphore.c | 22 +-
src/host/lib/mars_task_signal.c | 19 +
src/host/lib/mars_workload_queue.c | 348 +++++++++++++++++++++------------
src/mpu/kernel/mars_kernel.c | 8
src/mpu/kernel/mars_kernel_scheduler.c | 32 +--
src/mpu/kernel/mars_kernel_task.c | 26 --
src/mpu/kernel/mars_kernel_workload.c | 176 ++++++++++------
src/mpu/lib/Makefile.am | 3
src/mpu/lib/mars_mutex.c | 36 +--
src/mpu/lib/mars_task.c | 39 ++-
src/mpu/lib/mars_task_barrier.c | 66 +++---
src/mpu/lib/mars_task_event_flag.c | 92 ++++----
src/mpu/lib/mars_task_queue.c | 112 ++++++----
src/mpu/lib/mars_task_semaphore.c | 32 +--
src/mpu/lib/mars_task_signal.c | 10
28 files changed, 981 insertions(+), 1227 deletions(-)
--- a/include/common/mars/mars_debug.h
+++ /dev/null
@@ -1,295 +0,0 @@
-/*
- * Copyright 2008 Sony Corporation of America
- *
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this Library and associated documentation files (the
- * "Library"), to deal in the Library without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Library, and to
- * permit persons to whom the Library is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Library.
- *
- * If you modify the Library, you may copy and distribute your modified
- * version of the Library in object code or as an executable provided
- * that you also do one of the following:
- *
- * Accompany the modified version of the Library with the complete
- * corresponding machine-readable source code for the modified version
- * of the Library; or,
- *
- * Accompany the modified version of the Library with a written offer
- * for a complete machine-readable copy of the corresponding source
- * code of the modified version of the Library.
- *
- *
- * THE LIBRARY IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * LIBRARY OR THE USE OR OTHER DEALINGS IN THE LIBRARY.
- */
-
-#ifndef MARS_DEBUG_H
-#define MARS_DEBUG_H
-
-/*
- * \brief MARS Debug Macros
- */
-
-#include <stdio.h>
-
-#define MARS_DEBUG_ENABLE_PRINT 0
-#define MARS_DEBUG_ENABLE_ASSERTS 0
-#define MARS_DEBUG_ENABLE_VERBOSE 0
-#define MARS_DEBUG_ENABLE_TIMER 0
-#define MARS_DEBUG_ENABLE_DMA_ASSERTS 0
-#define MARS_DEBUG_ENABLE_DMA_VERBOSE 0
-
-#if __SPU__
-#define __CONTEXT__ "MPU"
-#define __BREAKPOINT__ __asm__ volatile ("stopd 0,1,1")
-#else
-#define __CONTEXT__ "HOST"
-#define __BREAKPOINT__ __asm__ volatile ("tw 31,1,1")
-#endif
-
-#define __PRINT__(msg, ...) {\
- fprintf(stdout, "MARS("__CONTEXT__"): "msg, ##__VA_ARGS__);\
- fflush(stdout);\
-}
-
-#define MARS_PRINTF(msg, ...) {\
- __PRINT__("%s: "msg, __PRETTY_FUNCTION__, ##__VA_ARGS__);\
-}
-
-#if MARS_DEBUG_ENABLE_PRINT
-#if __SPU__
-#define MARS_PRINT(msg, ...) {\
- __PRINT__("KERNEL(%d): "msg, kernel_params.id, ##__VA_ARGS__);\
-}
-#else
-#define MARS_PRINT(msg, ...) {\
- __PRINT__(msg, ##__VA_ARGS__);\
-}
-#endif
-
-#define MARS_PRINT_16BYTE_ADDR(addr) {\
- int i;\
- printf("reg(%p) = 0x", (addr));\
- for (i = 0; i < 16; i++) {\
- printf("%02x", ((char *)(addr))[i]);\
- }\
- printf("\n");\
-}
-
-#define MARS_PRINT_REG(num) {\
- register volatile vector unsigned int *reg asm(#num);\
- MARS_PRINT_16BYTE_ADDR(reg);\
-}
-
-#define MARS_PRINT_STACK(stack_top, stack_pointer) {\
- char *sp = (char *)(stack_top);\
- while (sp >= (char *)(stack_pointer)) {\
- printf("[%p] ",sp);\
- int i;\
- for (i = 0; i < 4; i++)\
- printf("%02x",sp[i]);\
- printf("%s\n",sp==(char *)(stack_pointer)?" <-- $sp":"");\
- sp-=16;\
- } \
-}
-#else
-#define MARS_PRINT(msg, ...)
-#define MARS_PRINT_16BYTE_ADDR(addr)
-#define MARS_PRINT_REG(num)
-#define MARS_PRINT_STACK(stack_top, stack_pointer)
-#endif
-
-#if MARS_DEBUG_ENABLE_ASSERTS
-
-#define MARS_BREAK() {\
- __PRINT__("%s[line %d]:%s():BREAK\n",\
- __FILE__, __LINE__, __PRETTY_FUNCTION__);\
- __BREAKPOINT__;\
-}
-
-#define MARS_ASSERT(exp) {\
- if(!(exp)) {\
- __PRINT__("%s(line %d):%s() - ASSERT("#exp") FAILED\n",\
- __FILE__, __LINE__, __PRETTY_FUNCTION__);\
- __BREAKPOINT__;\
- }\
-}
-
-#define MARS_CHECK(exp) {\
- MARS_ASSERT(exp);\
- if(!(exp)) return;\
-}
-
-#define MARS_CHECK_RET(exp, ret) {\
- MARS_ASSERT(exp);\
- if(!(exp)) return ret;\
-}
-
-#define MARS_CHECK_CLEANUP(exp, clean) {\
- MARS_ASSERT(exp);\
- if(!(exp)) {\
- clean;\
- return;\
- }\
-}
-
-#define MARS_CHECK_CLEANUP_RET(exp, clean, ret) {\
- MARS_ASSERT(exp);\
- if(!(exp)) {\
- clean;\
- return ret;\
- }\
-}
-
-#else
-#define MARS_BREAK()
-#define MARS_ASSERT(exp)
-#define MARS_CHECK(exp) {if(!(exp))return;}
-#define MARS_CHECK_RET(exp, ret) {if(!(exp))return ret;}
-#define MARS_CHECK_CLEANUP(exp, clean) {if(!(exp)){clean;return;}}
-#define MARS_CHECK_CLEANUP_RET(exp, clean, ret) {if(!(exp)){clean;return ret;}}
-#endif
-
-#if MARS_DEBUG_ENABLE_VERBOSE
-
-#define MARS_PRINT_TASK_CONTEXT(task_context) {\
- __PRINT__("===\n");\
- __PRINT__("- Task Context (%p)\n", (task_context));\
- __PRINT__("- exec: %#llx\n", (task_context)->exec);\
- __PRINT__("- exec_size: %d bytes\n", (task_context)->exec_size);\
- __PRINT__("- bss_size: %d bytes\n", (task_context)->bss_size);\
- __PRINT__("- vaddr: %#x\n", (task_context)->vaddr);\
- __PRINT__("- entry: %#x\n", (task_context)->entry);\
- __PRINT__("- stack: %#x\n", (task_context)->stack);\
- __PRINT__("===\n");\
-}
-
-#define MARS_PRINT_WORKLOAD_QUEUE_HEADER(queue_header) {\
- __PRINT__("===\n");\
- __PRINT__("- Workload Queue Header (%p)\n", (queue_header));\
- __PRINT__("- queue_ea: %#llx\n",(queue_header)->queue_ea);\
- __PRINT__("- context_ea: %#llx\n",(queue_header)->context_ea);\
- __PRINT__("- flag: %#x\n",(queue_header)->flag);\
- __PRINT__("- count: %d\n",(queue_header)->count);\
- unsigned int i;\
- __PRINT__("- state: ");\
- for (i = 0; i < MARS_WORKLOAD_MAX; i++)\
- fprintf(stdout, "%d,", (queue_header)->state[i]);\
- fprintf(stdout, "\n");\
- __PRINT__("- priority: ");\
- for (i = 0; i < MARS_WORKLOAD_MAX; i++)\
- fprintf(stdout, "%d,", (queue_header)->priority[i]);\
- fprintf(stdout, "\n");\
- __PRINT__("- wait_count: ");\
- for (i = 0; i < MARS_WORKLOAD_MAX; i++)\
- fprintf(stdout, "%d,", (queue_header)->wait_count[i]);\
- fprintf(stdout, "\n");\
- __PRINT__("===\n");\
-}
-
-#define MARS_PRINT_KERNEL_PARAMS(kernel_params) {\
- __PRINT__("===\n");\
- __PRINT__("- Kernel Params (%p)\n", (kernel_params));\
- __PRINT__("- workload_queue_ea: %#llx\n",\
- (kernel_params)->workload_queue_ea);\
- __PRINT__("===\n");\
-}
-
-#define MARS_PRINT_SPE_PROGRAM_HANDLE(spe_program_handle) {\
- __PRINT__("===\n");\
- __PRINT__("- SPE Program Handle (%p)\n", (spe_program_handle));\
- __PRINT__("- handle_size: %d\n", (spe_program_handle)->handle_size);\
- __PRINT__("- elf_image: %p\n", (spe_program_handle)->elf_image);\
- __PRINT__("- toe_shadow: %p\n", (spe_program_handle)->toe_shadow);\
- __PRINT__("===\n");\
-}
-
-#define MARS_PRINT_ELF(elf) {\
- Elf32_Shdr *shdr = (Elf32_Shdr *)((char *)(elf) + ehdr->e_shoff);\
- char *str_table = (elf) + shdr[ehdr->e_shstrndx].sh_offset;\
- unsigned int i;\
- __PRINT__("===\n");\
- __PRINT__("- ELF Header (%p)\n", ehdr);\
- __PRINT__("- e_type: %#x\n", ehdr->e_type);\
- __PRINT__("- e_machine: %#x\n", ehdr->e_machine);\
- __PRINT__("- e_version: %#x\n", ehdr->e_version);\
- __PRINT__("- e_entry: %#x\n", ehdr->e_entry);\
- __PRINT__("- e_phoff: %#x\n", ehdr->e_phoff);\
- __PRINT__("- e_shoff: %#x\n", ehdr->e_shoff);\
- __PRINT__("- e_flags: %#x\n", ehdr->e_flags);\
- __PRINT__("- e_ehsize: %#x\n", ehdr->e_ehsize);\
- __PRINT__("- e_phentsize: %#x\n", ehdr->e_phentsize);\
- __PRINT__("- e_phnum: %#x\n", ehdr->e_phnum);\
- __PRINT__("- e_shentsize: %#x\n", ehdr->e_shentsize);\
- __PRINT__("- e_shnum: %#x\n", ehdr->e_shnum);\
- __PRINT__("- e_shstrndx: %#x\n", ehdr->e_shstrndx);\
- for (i = 0; i < ehdr->e_phnum; i++) {\
- __PRINT__("- ELF Program Header %d\n", i);\
- __PRINT__("- p_type: %#x\n", phdr[i].p_type);\
- __PRINT__("- p_offset: %#x\n", phdr[i].p_offset);\
- __PRINT__("- p_vaddr: %#x\n", phdr[i].p_vaddr);\
- __PRINT__("- p_paddr: %#x\n", phdr[i].p_paddr);\
- __PRINT__("- p_filesz: %d bytes\n", phdr[i].p_filesz);\
- __PRINT__("- p_memsz: %d bytes\n", phdr[i].p_memsz);\
- __PRINT__("- p_flags: %#x\n", phdr[i].p_flags);\
- __PRINT__("- p_align: %#x\n", phdr[i].p_align);\
- }\
- Elf32_Shdr *sh;\
- for (sh = shdr; sh < &shdr[ehdr->e_shnum]; ++sh) {\
- __PRINT__("- ELF Section Header %d\n", i);\
- __PRINT__("- sh_name: %s\n", str_table+sh->sh_name);\
- }\
- for (i = 0; i < ehdr->e_shnum; i++) {\
- __PRINT__("- ELF Section Header %d\n", i);\
- __PRINT__("- sh_name: %s\n", str_table+shdr[i].sh_name);\
- __PRINT__("- sh_type: %#x\n", shdr[i].sh_type);\
- __PRINT__("- sh_flags: %#x\n", shdr[i].sh_flags);\
- __PRINT__("- sh_addr: %#x\n", shdr[i].sh_addr);\
- __PRINT__("- sh_offset: %#x\n", shdr[i].sh_offset);\
- __PRINT__("- sh_size: %d bytes\n", shdr[i].sh_size);\
- __PRINT__("- sh_link: %#x\n", shdr[i].sh_link);\
- __PRINT__("- sh_info: %#x\n", shdr[i].sh_info);\
- __PRINT__("- sh_addralign: %#x\n", shdr[i].sh_addralign);\
- __PRINT__("- sh_entsize: %d bytes\n", shdr[i].sh_entsize);\
- }\
- __PRINT__("===\n");\
-}
-
-#else
-#define MARS_PRINT_TASK_CONTEXT(task_context)
-#define MARS_PRINT_WORKLOAD_CONTEXT(workload_context)
-#define MARS_PRINT_WORKLOAD_QUEUE_HEADER(queue_header)
-#define MARS_PRINT_KERNEL_PARAMS(kernel_params)
-#define MARS_PRINT_SPE_PROGRAM_HANDLE(spe_program_handle)
-#define MARS_PRINT_ELF(elf)
-#endif
-
-#if MARS_DEBUG_ENABLE_TIMER
-#define MARS_TIMER_START(tag)\
- {\
- struct mars_timer tag ## _timer;\
- mars_timer_start(&tag ## _timer);
-
-#define MARS_TIMER_STOP(tag)\
- mars_timer_stop(&tag ## _timer);\
- __PRINT__("KERNEL(%d): " #tag " - %.0f us\n",\
- kernel_params.id, tag ## _timer.us);\
- }
-#else
-#define MARS_TIMER_START(id)
-#define MARS_TIMER_STOP(id)
-#endif
-
-#endif
--- a/include/common/mars/mars_task_types.h
+++ b/include/common/mars/mars_task_types.h
@@ -99,7 +99,7 @@
* \ingroup group_mars_task
* \brief Max length of task name
*/
-#define MARS_TASK_NAME_LEN_MAX 22
+#define MARS_TASK_NAME_LEN_MAX 21
/**
* \ingroup group_mars_task
@@ -144,7 +144,7 @@ struct mars_task_args {
struct mars_task_id {
uint64_t mars_context_ea;
uint16_t workload_id;
- uint8_t name[MARS_TASK_NAME_LEN_MAX];
+ uint8_t name[MARS_TASK_NAME_LEN_MAX + 1];
} __attribute__((aligned(MARS_TASK_ID_ALIGN)));
struct mars_task_context {
--- a/include/host/mars/mars_timer.h
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright 2008 Sony Corporation of America
- *
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this Library and associated documentation files (the
- * "Library"), to deal in the Library without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Library, and to
- * permit persons to whom the Library is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Library.
- *
- * If you modify the Library, you may copy and distribute your modified
- * version of the Library in object code or as an executable provided
- * that you also do one of the following:
- *
- * Accompany the modified version of the Library with the complete
- * corresponding machine-readable source code for the modified version
- * of the Library; or,
- *
- * Accompany the modified version of the Library with a written offer
- * for a complete machine-readable copy of the corresponding source
- * code of the modified version of the Library.
- *
- *
- * THE LIBRARY IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * LIBRARY OR THE USE OR OTHER DEALINGS IN THE LIBRARY.
- */
-
-#ifndef MARS_TIMER_H
-#define MARS_TIMER_H
-
-/*
- * \ingroup group_mars_timer
- * \brief [host] MARS Timer API
- */
-
-#include <sys/time.h>
-#include "mars/mars_debug.h"
-
-/*
- * \ingroup group_mars_timer
- * \brief MARS timer structure
- *
- * This structure is used for storing timer information.
- * When passed into \ref mars_timer_start() and \ref mars_timer_stop(),
- * the us, ms, and s members will hold the time elapsed between the start
- * and stop calls in microseconds, milliseconds, and seconds, respectively.
- * \note This structure should not be directly modified by the user.
- */
-struct mars_timer {
- float us; /**< microseconds elapsed */
- float ms; /**< milliseconds elapsed */
- float s; /**< seconds elapsed */
-
- unsigned long long start; /**< internal - start time */
- unsigned long long end; /**< internal - stop time */
-};
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-/*
- * \ingroup group_mars_timer
- * \brief Starts the timer
- *
- * \param[in] timer - pointer to the timer instance
- *
- * This should be called in pair with \ref mars_timer_stop.
- * After the timer is stopped, the us, ms, and s members of the timer instance
- * will hold the time elapsed between the start and stop calls in microseconds,
- * milliseconds, and seconds, respectively.
- */
-static inline void mars_timer_start(struct mars_timer *timer)
-{
- MARS_CHECK(timer);
-
- struct timeval tv;
- gettimeofday(&tv, NULL);
- timer->start = tv.tv_sec * 1000000 + tv.tv_usec;
- timer->end = timer->start;
-
- timer->us = 0;
- timer->ms = 0;
- timer->s = 0;
-}
-
-/*
- * \ingroup group_mars_timer
- * \brief Stops the timer
- *
- * \param[in,out] timer - pointer to the timer instance
- *
- * This should be called after a previous call to \ref mars_timer_start.
- * After the timer is stopped, the us, ms, and s members of the timer instance
- * will hold the time elapsed between the start and stop calls in microseconds,
- * milliseconds, and seconds, respectively.
- */
-static inline void mars_timer_stop(struct mars_timer *timer)
-{
- MARS_CHECK(timer);
-
- struct timeval tv;
- gettimeofday(&tv, NULL);
- timer->end = tv.tv_sec * 1000000 + tv.tv_usec;
-
- timer->us = (float)(timer->end - timer->start);
- timer->ms = timer->us * 1.0e-3;
- timer->s = timer->us * 1.0e-6;
-}
-
-#endif
--- a/include/mpu/mars/mars_dma.h
+++ b/include/mpu/mars/mars_dma.h
@@ -44,8 +44,8 @@
* \brief [MPU] MARS DMA API
*/
+#include <assert.h>
#include <spu_mfcio.h>
-#include "mars/mars_debug.h"
#define MARS_DMA_TAG 31 /* dma tag reserved for MARS */
#define MARS_DMA_TAG_MAX 31 /* dma tag 0~31 */
@@ -113,12 +113,8 @@ static inline void _mars_dma_large_put(c
*/
static inline void mars_dma_wait(uint32_t tag)
{
-#if MARS_DEBUG_ENABLE_DMA_VERBOSE
- MARS_PRINTF("tag=%d\n", tag);
-#endif
-#if MARS_DEBUG_ENABLE_DMA_ASSERTS
- MARS_ASSERT(tag <= MARS_DMA_TAG_MAX);
-#endif
+ assert(tag <= MARS_DMA_TAG_MAX);
+
mfc_write_tag_mask(1 << tag);
mfc_write_tag_update_all();
mfc_read_tag_status();
@@ -149,16 +145,12 @@ static inline void mars_dma_wait(uint32_
static inline void mars_dma_get(void *ls, uint64_t ea,
uint32_t size, uint32_t tag)
{
-#if MARS_DEBUG_ENABLE_DMA_VERBOSE
- MARS_PRINTF("ls=%p ea=%#llx size=%d tag=%d\n", ls, ea, size, tag);
-#endif
-#if MARS_DEBUG_ENABLE_DMA_ASSERTS
- MARS_ASSERT(((uintptr_t)ls & MARS_DMA_ALIGN_MASK) == 0);
- MARS_ASSERT(((uintptr_t)ea & MARS_DMA_ALIGN_MASK) == 0);
- MARS_ASSERT((size & MARS_DMA_SIZE_MASK) == 0);
- MARS_ASSERT(size && size <= MARS_DMA_SIZE_MAX);
- MARS_ASSERT(tag <= MARS_DMA_TAG_MAX);
-#endif
+ assert(((uintptr_t)ls & MARS_DMA_ALIGN_MASK) == 0);
+ assert(((uintptr_t)ea & MARS_DMA_ALIGN_MASK) == 0);
+ assert((size & MARS_DMA_SIZE_MASK) == 0);
+ assert(size && size <= MARS_DMA_SIZE_MAX);
+ assert(tag <= MARS_DMA_TAG_MAX);
+
mfc_get((volatile void *)ls, ea, size, tag, 0, 0);
}
@@ -208,16 +200,12 @@ static inline void mars_dma_get_and_wait
static inline void mars_dma_put(const void *ls, uint64_t ea,
uint32_t size, uint32_t tag)
{
-#if MARS_DEBUG_ENABLE_DMA_VERBOSE
- MARS_PRINTF("ls=%p ea=%#llx size=%d tag=%d\n", ls, ea, size, tag);
-#endif
-#if MARS_DEBUG_ENABLE_DMA_ASSERTS
- MARS_ASSERT(((uintptr_t)ls & MARS_DMA_ALIGN_MASK) == 0);
- MARS_ASSERT(((uintptr_t)ea & MARS_DMA_ALIGN_MASK) == 0);
- MARS_ASSERT((size & MARS_DMA_SIZE_MASK) == 0);
- MARS_ASSERT(size && size <= MARS_DMA_SIZE_MAX);
- MARS_ASSERT(tag <= MARS_DMA_TAG_MAX);
-#endif
+ assert(((uintptr_t)ls & MARS_DMA_ALIGN_MASK) == 0);
+ assert(((uintptr_t)ea & MARS_DMA_ALIGN_MASK) == 0);
+ assert((size & MARS_DMA_SIZE_MASK) == 0);
+ assert(size && size <= MARS_DMA_SIZE_MAX);
+ assert(tag <= MARS_DMA_TAG_MAX);
+
spu_dsync();
mfc_put((volatile void *)ls, ea, size, tag, 0, 0);
}
@@ -267,15 +255,11 @@ static inline void mars_dma_put_and_wait
static inline void mars_dma_small_get(void *ls, uint64_t ea,
uint32_t size, uint32_t tag)
{
-#if MARS_DEBUG_ENABLE_DMA_VERBOSE
- MARS_PRINTF("ls=%p ea=%#llx size=%d tag=%d\n", ls, ea, size, tag);
-#endif
-#if MARS_DEBUG_ENABLE_DMA_ASSERTS
- MARS_ASSERT(((uintptr_t)ls & MARS_DMA_ALIGN_MASK) == 0);
- MARS_ASSERT(((uintptr_t)ea & MARS_DMA_ALIGN_MASK) == 0);
- MARS_ASSERT(size == 1 || size == 2 || size == 4 || size == 8);
- MARS_ASSERT(tag <= MARS_DMA_TAG_MAX);
-#endif
+ assert(((uintptr_t)ls & MARS_DMA_ALIGN_MASK) == 0);
+ assert(((uintptr_t)ea & MARS_DMA_ALIGN_MASK) == 0);
+ assert(size == 1 || size == 2 || size == 4 || size == 8);
+ assert(tag <= MARS_DMA_TAG_MAX);
+
mfc_get(ls, ea, size, tag, 0, 0);
}
@@ -324,15 +308,11 @@ static inline void mars_dma_small_get_an
static inline void mars_dma_small_put(const void *ls, uint64_t ea,
uint32_t size, uint32_t tag)
{
-#if MARS_DEBUG_ENABLE_DMA_VERBOSE
- MARS_PRINTF("ls=%p ea=%#llx size=%d tag=%d\n", ls, ea, size, tag);
-#endif
-#if MARS_DEBUG_ENABLE_DMA_ASSERTS
- MARS_ASSERT(((uintptr_t)ls & MARS_DMA_ALIGN_MASK) == 0);
- MARS_ASSERT(((uintptr_t)ea & MARS_DMA_ALIGN_MASK) == 0);
- MARS_ASSERT(size == 1 || size == 2 || size == 4 || size == 8);
- MARS_ASSERT(tag <= MARS_DMA_TAG_MAX);
-#endif
+ assert(((uintptr_t)ls & MARS_DMA_ALIGN_MASK) == 0);
+ assert(((uintptr_t)ea & MARS_DMA_ALIGN_MASK) == 0);
+ assert(size == 1 || size == 2 || size == 4 || size == 8);
+ assert(tag <= MARS_DMA_TAG_MAX);
+
spu_dsync();
mfc_put((volatile void *)ls, ea, size, tag, 0, 0);
}
@@ -383,15 +363,11 @@ static inline void mars_dma_small_put_an
static inline void mars_dma_large_get(void *ls, uint64_t ea,
uint32_t size, uint32_t tag)
{
-#if MARS_DEBUG_ENABLE_DMA_VERBOSE
- MARS_PRINTF("ls=%p ea=%#llx size=%d tag=%d\n", ls, ea, size, tag);
-#endif
-#if MARS_DEBUG_ENABLE_DMA_ASSERTS
- MARS_ASSERT(((uintptr_t)ls & MARS_DMA_ALIGN_MASK) == 0);
- MARS_ASSERT(((uintptr_t)ea & MARS_DMA_ALIGN_MASK) == 0);
- MARS_ASSERT(size);
- MARS_ASSERT(tag <= MARS_DMA_TAG_MAX);
-#endif
+ assert(((uintptr_t)ls & MARS_DMA_ALIGN_MASK) == 0);
+ assert(((uintptr_t)ea & MARS_DMA_ALIGN_MASK) == 0);
+ assert(size);
+ assert(tag <= MARS_DMA_TAG_MAX);
+
_mars_dma_large_get(ls, ea, size, tag);
}
@@ -441,15 +417,11 @@ static inline void mars_dma_large_get_an
static inline void mars_dma_large_put(const void *ls, uint64_t ea,
uint32_t size, uint32_t tag)
{
-#if MARS_DEBUG_ENABLE_DMA_VERBOSE
- MARS_PRINTF("ls=%p ea=%#llx size=%d tag=%d\n", ls, ea, size, tag);
-#endif
-#if MARS_DEBUG_ENABLE_DMA_ASSERTS
- MARS_ASSERT(((uintptr_t)ls & MARS_DMA_ALIGN_MASK) == 0);
- MARS_ASSERT(((uintptr_t)ea & MARS_DMA_ALIGN_MASK) == 0);
- MARS_ASSERT(size);
- MARS_ASSERT(tag <= MARS_DMA_TAG_MAX);
-#endif
+ assert(((uintptr_t)ls & MARS_DMA_ALIGN_MASK) == 0);
+ assert(((uintptr_t)ea & MARS_DMA_ALIGN_MASK) == 0);
+ assert(size);
+ assert(tag <= MARS_DMA_TAG_MAX);
+
_mars_dma_large_put(ls, ea, size, tag);
}
--- a/include/mpu/mars/mars_kernel.h
+++ b/include/mpu/mars/mars_kernel.h
@@ -39,10 +39,10 @@
#define MARS_KERNEL_H
#include <stdint.h>
+#include <stddef.h>
#include "mars/mars_dma.h"
#include "mars/mars_mutex.h"
-#include "mars/mars_timer.h"
#include "mars/mars_error.h"
#include "mars/mars_kernel_types.h"
#include "mars/mars_workload_types.h"
--- a/include/mpu/mars/mars_timer.h
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright 2008 Sony Corporation of America
- *
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this Library and associated documentation files (the
- * "Library"), to deal in the Library without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Library, and to
- * permit persons to whom the Library is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Library.
- *
- * If you modify the Library, you may copy and distribute your modified
- * version of the Library in object code or as an executable provided
- * that you also do one of the following:
- *
- * Accompany the modified version of the Library with the complete
- * corresponding machine-readable source code for the modified version
- * of the Library; or,
- *
- * Accompany the modified version of the Library with a written offer
- * for a complete machine-readable copy of the corresponding source
- * code of the modified version of the Library.
- *
- *
- * THE LIBRARY IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * LIBRARY OR THE USE OR OTHER DEALINGS IN THE LIBRARY.
- */
-
-#ifndef MARS_TIMER_H
-#define MARS_TIMER_H
-
-/*
- * \ingroup group_mars_timer
- * \brief MARS Timer API [MPU]
- */
-
-#include <spu_intrinsics.h>
-#include "mars/mars_debug.h"
-
-/*
- * \ingroup group_mars_timer
- * \brief MARS timer structure
- *
- * This structure is used for storing timer information.
- * When passed into \ref mars_timer_start() and \ref mars_timer_stop(),
- * the us, ms, and s members will hold the time elapsed between the start
- * and stop calls in microseconds, milliseconds, and seconds, respectively.
- * \note This structure should not be directly modified by the user.
- */
-struct mars_timer {
- float us; /**< microseconds elapsed */
- float ms; /**< milliseconds elapsed */
- float s; /**< seconds elapsed */
-
- unsigned int start; /**< internal - start time */
- unsigned int end; /**< internal - stop time */
-};
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-static const unsigned int mars_timebase = 79800000;
-
-/*
- * \ingroup group_mars_timer
- * \brief Starts the timer
- *
- * This should be called in pair with \ref mars_timer_stop.
- * After the timer is stopped, the us, ms, and s members of the timer instance
- * will hold the time elapsed between the start and stop calls in microseconds,
- * milliseconds, and seconds, respectively.
- *
- * \param[in] timer - pointer to the timer instance
- */
-static inline void mars_timer_start(struct mars_timer *timer)
-{
- MARS_CHECK(timer);
-
- spu_writech(SPU_WrDec, 0xffffffff);
- timer->start = spu_readch(SPU_RdDec);
-
- timer->us = 0;
- timer->ms = 0;
- timer->s = 0;
-}
-
-/*
- * \ingroup group_mars_timer
- * \brief [MPU] Stops the timer
- *
- * This should be called after a previous call to \ref mars_timer_start.
- * After the timer is stopped, the us, ms, and s members of the timer instance
- * will hold the time elapsed between the start and stop calls in microseconds,
- * milliseconds, and seconds, respectively.
- *
- * \param[in,out] timer - pointer to the timer instance
- */
-static inline void mars_timer_stop(struct mars_timer *timer)
-{
- MARS_CHECK(timer);
-
- timer->end = spu_readch(SPU_RdDec);
-
- timer->s = (float)(timer->start - timer->end) / mars_timebase;
- timer->ms = timer->s * 1.0e3;
- timer->us = timer->s * 1.0e6;
-}
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
--- a/src/host/lib/Makefile.am
+++ b/src/host/lib/Makefile.am
@@ -77,9 +77,7 @@ pkginclude_HEADERS = \
$(srcdir)/../../../include/host/mars/mars_task_signal.h
EXTRA_DIST += \
- $(srcdir)/../../../include/host/mars/mars_timer.h \
$(srcdir)/../../../include/host/mars/mars_workload_queue.h \
- $(srcdir)/../../../include/common/mars/mars_debug.h \
$(srcdir)/../../../include/common/mars/mars_kernel_types.h \
$(srcdir)/../../../include/common/mars/mars_workload_types.h
--- a/src/host/lib/mars_context.c
+++ b/src/host/lib/mars_context.c
@@ -44,7 +44,6 @@
#include "mars/mars_workload_queue.h"
#include "mars/mars_kernel_types.h"
#include "mars/mars_error.h"
-#include "mars/mars_debug.h"
extern struct spe_program_handle mars_kernel_entry;
static struct mars_context *mars_shared_context;
@@ -52,32 +51,36 @@ static pthread_mutex_t mars_mutex = PTHR
static void *mpu_context_thread(void *arg)
{
- MARS_ASSERT(arg);
-
int ret;
unsigned int entry = SPE_DEFAULT_ENTRY;
struct mars_kernel_params *params = (struct mars_kernel_params *)arg;
struct spe_context *spe;
spe = spe_context_create(0, NULL);
- MARS_CHECK_RET(spe, (void *)MARS_ERROR_INTERNAL);
+ if (!spe)
+ return (void *)MARS_ERROR_INTERNAL;
ret = spe_program_load(spe, &mars_kernel_entry);
- MARS_CHECK_RET(!ret, (void *)MARS_ERROR_INTERNAL);
+ if (ret) {
+ spe_context_destroy(spe);
+ return (void *)MARS_ERROR_INTERNAL;
+ }
ret = spe_context_run(spe, &entry, 0, params, NULL, NULL);
- MARS_CHECK_RET(!ret, (void *)MARS_ERROR_INTERNAL);
+ if (ret) {
+ spe_context_destroy(spe);
+ return (void *)MARS_ERROR_INTERNAL;
+ }
ret = spe_context_destroy(spe);
- MARS_CHECK_RET(!ret, (void *)MARS_ERROR_INTERNAL);
+ if (ret)
+ return (void *)MARS_ERROR_INTERNAL;
return (void *)MARS_SUCCESS;
}
static int mpu_contexts_create(struct mars_context *mars, uint32_t num_mpus)
{
- MARS_ASSERT(mars);
-
int ret;
unsigned int i;
@@ -87,13 +90,14 @@ static int mpu_contexts_create(struct ma
params->id = i;
params->mars_context_ea =
- mars_ptr_to_ea(mars);
+ mars_ptr_to_ea(mars);
params->workload_queue_ea =
- mars_ptr_to_ea(mars->workload_queue);
+ mars_ptr_to_ea(mars->workload_queue);
ret = pthread_create(&mars->mpu_context_threads[i], NULL,
- mpu_context_thread, params);
- MARS_CHECK_RET(!ret, MARS_ERROR_INTERNAL);
+ mpu_context_thread, params);
+ if (ret)
+ return MARS_ERROR_INTERNAL;
mars->mpu_context_count++;
}
@@ -103,20 +107,20 @@ static int mpu_contexts_create(struct ma
static int mpu_contexts_destroy(struct mars_context *mars)
{
- MARS_ASSERT(mars);
-
int ret;
void *p_ret;
unsigned int i;
/* shutdown the workload queue so mpu context threads exit */
ret = workload_queue_exit(mars->workload_queue);
- MARS_CHECK_RET(ret == MARS_SUCCESS, ret);
+ if (ret != MARS_SUCCESS)
+ return ret;
/* join all mpu context threads */
for (i = 0; i < mars->mpu_context_count; i++) {
ret = pthread_join(mars->mpu_context_threads[i], &p_ret);
- MARS_CHECK_RET(!ret && !p_ret, MARS_ERROR_INTERNAL);
+ if (ret || p_ret)
+ return MARS_ERROR_INTERNAL;
}
return MARS_SUCCESS;
@@ -125,32 +129,34 @@ static int mpu_contexts_destroy(struct m
int mars_context_create(struct mars_context **mars_ret, uint32_t num_mpus,
uint8_t shared)
{
- MARS_CHECK_RET(mars_ret, MARS_ERROR_NULL);
-
- MARS_PRINT("Created MARS Context (%p)\n", mars);
-
int ret;
int num_mpus_max;
- struct mars_context *mars;
+ struct mars_context *mars = NULL;
- /* check max available mpus */
- num_mpus_max = spe_cpu_info_get(SPE_COUNT_PHYSICAL_SPES, -1);
- MARS_CHECK_RET(num_mpus_max > 0, MARS_ERROR_INTERNAL);
- MARS_CHECK_RET(num_mpus_max >= (int)num_mpus, MARS_ERROR_PARAMS);
+ /* check function params */
+ if (!mars_ret)
+ return MARS_ERROR_NULL;
- /* num mpus specified is default max */
+ /* check number of mpus to use */
+ num_mpus_max = spe_cpu_info_get(SPE_COUNT_PHYSICAL_SPES, -1);
+ if (num_mpus_max <= 0)
+ return MARS_ERROR_INTERNAL;
+ if (num_mpus_max < (int)num_mpus)
+ return MARS_ERROR_PARAMS;
if (!num_mpus)
num_mpus = num_mpus_max;
/* lock mutex */
ret = pthread_mutex_lock(&mars_mutex);
- MARS_CHECK_RET(ret == 0, MARS_ERROR_INTERNAL);
+ if (ret)
+ return MARS_ERROR_INTERNAL;
/* shared context requested */
if (shared && mars_shared_context) {
/* create any extra mpu contexts necessary */
ret = mpu_contexts_create(mars_shared_context, num_mpus);
- MARS_CHECK_RET(ret == MARS_SUCCESS, ret);
+ if (ret != MARS_SUCCESS)
+ goto error;
/* increment shared context reference count */
mars_shared_context->reference_count++;
@@ -158,18 +164,15 @@ int mars_context_create(struct mars_cont
/* return the shared context */
*mars_ret = mars_shared_context;
- /* unlock mutex */
- ret = pthread_mutex_unlock(&mars_mutex);
- MARS_CHECK_RET(ret == 0, MARS_ERROR_INTERNAL);
-
- return MARS_SUCCESS;
+ goto done;
}
/* allocate */
mars = malloc(sizeof(struct mars_context));
- MARS_CHECK_CLEANUP_RET(mars,
- pthread_mutex_unlock(&mars_mutex),
- MARS_ERROR_MEMORY);
+ if (!mars) {
+ ret = MARS_ERROR_MEMORY;
+ goto error;
+ }
/* zero context */
memset(mars, 0, sizeof(struct mars_context));
@@ -181,32 +184,28 @@ int mars_context_create(struct mars_cont
mars->kernel_params = (struct mars_kernel_params *)
memalign(MARS_KERNEL_PARAMS_ALIGN,
sizeof(struct mars_kernel_params) * num_mpus_max);
- MARS_CHECK_CLEANUP_RET(mars->kernel_params,
- pthread_mutex_unlock(&mars_mutex);
- mars_context_destroy(mars),
- MARS_ERROR_MEMORY);
+ if (!mars->kernel_params) {
+ ret = MARS_ERROR_MEMORY;
+ goto error_malloc_kernel_params;
+ }
/* allocate mpu context thread array */
mars->mpu_context_threads = (pthread_t *)
malloc(sizeof(pthread_t) * num_mpus_max);
- MARS_CHECK_CLEANUP_RET(mars->mpu_context_threads,
- pthread_mutex_unlock(&mars_mutex);
- mars_context_destroy(mars),
- MARS_ERROR_MEMORY);
+ if (!mars->mpu_context_threads) {
+ ret = MARS_ERROR_MEMORY;
+ goto error_malloc_mpu_context_threads;
+ }
/* create workload queue */
ret = workload_queue_create(&mars->workload_queue);
- MARS_CHECK_CLEANUP_RET(ret == MARS_SUCCESS,
- pthread_mutex_unlock(&mars_mutex);
- mars_context_destroy(mars),
- ret);
+ if (ret != MARS_SUCCESS)
+ goto error_workload_queue_create;
/* create mpu contexts */
ret = mpu_contexts_create(mars, num_mpus);
- MARS_CHECK_CLEANUP_RET(ret == MARS_SUCCESS,
- pthread_mutex_unlock(&mars_mutex);
- mars_context_destroy(mars),
- ret);
+ if (ret != MARS_SUCCESS)
+ goto error_mpu_contexts_create;
/* set the shared context pointer */
if (shared)
@@ -215,40 +214,64 @@ int mars_context_create(struct mars_cont
/* return mars context pointer */
*mars_ret = mars;
+done:
/* unlock mutex */
ret = pthread_mutex_unlock(&mars_mutex);
- MARS_CHECK_RET(ret == 0, MARS_ERROR_INTERNAL);
+ if (ret) {
+ ret = MARS_ERROR_INTERNAL;
+ goto error_pthread_mutex_unlock;
+ }
return MARS_SUCCESS;
+
+error_pthread_mutex_unlock:
+ mpu_contexts_destroy(mars);
+error_mpu_contexts_create:
+ workload_queue_destroy(mars->workload_queue);
+error_workload_queue_create:
+ free(mars->mpu_context_threads);
+error_malloc_mpu_context_threads:
+ free(mars->kernel_params);
+error_malloc_kernel_params:
+ free(mars);
+error:
+ pthread_mutex_unlock(&mars_mutex);
+
+ return ret;
}
int mars_context_destroy(struct mars_context *mars)
{
- MARS_CHECK_RET(mars, MARS_ERROR_NULL);
-
int ret;
+ /* check function params */
+ if (!mars)
+ return MARS_ERROR_NULL;
+
/* lock mutex */
ret = pthread_mutex_lock(&mars_mutex);
- MARS_CHECK_RET(ret == 0, MARS_ERROR_INTERNAL);
+ if (ret)
+ return MARS_ERROR_INTERNAL;
/* decrement reference count */
mars->reference_count--;
/* reference count is not 0 so return */
if (mars->reference_count)
- return MARS_SUCCESS;
+ goto done;
/* destroy mpu contexts */
if (mars->mpu_context_count) {
ret = mpu_contexts_destroy(mars);
- MARS_CHECK_RET(ret == MARS_SUCCESS, ret);
+ if (ret != MARS_SUCCESS)
+ goto error;
}
/* destroy workload queue */
if (mars->workload_queue) {
ret = workload_queue_destroy(mars->workload_queue);
- MARS_CHECK_RET(ret == MARS_SUCCESS, ret);
+ if (ret != MARS_SUCCESS)
+ goto error;
}
/* free allocated memory */
@@ -260,11 +283,16 @@ int mars_context_destroy(struct mars_con
if (mars == mars_shared_context)
mars_shared_context = NULL;
+done:
/* unlock mutex */
ret = pthread_mutex_unlock(&mars_mutex);
- MARS_CHECK_RET(ret == 0, MARS_ERROR_INTERNAL);
-
- MARS_PRINT("Destroyed MARS Context (%p)\n", mars);
+ if (ret)
+ return MARS_ERROR_INTERNAL;
return MARS_SUCCESS;
+
+error:
+ pthread_mutex_unlock(&mars_mutex);
+
+ return ret;
}
--- a/src/host/lib/mars_mutex.c
+++ b/src/host/lib/mars_mutex.c
@@ -40,17 +40,18 @@
#include "mars/mars_mutex.h"
#include "mars/mars_error.h"
-#include "mars/mars_debug.h"
int mars_mutex_create(struct mars_mutex **mutex_ret)
{
- MARS_CHECK_RET(mutex_ret, MARS_ERROR_NULL);
-
struct mars_mutex *mutex;
+ if (!mutex_ret)
+ return MARS_ERROR_NULL;
+
mutex = (struct mars_mutex *)
memalign(MARS_MUTEX_ALIGN, sizeof(struct mars_mutex));
- MARS_CHECK_RET(mutex, MARS_ERROR_MEMORY);
+ if (!mutex)
+ return MARS_ERROR_MEMORY;
mutex->lock = MARS_MUTEX_UNLOCKED;
__lwsync();
@@ -62,7 +63,8 @@ int mars_mutex_create(struct mars_mutex
int mars_mutex_destroy(struct mars_mutex *mutex)
{
- MARS_CHECK_RET(mutex, MARS_ERROR_NULL);
+ if (!mutex)
+ return MARS_ERROR_NULL;
free(mutex);
@@ -71,7 +73,8 @@ int mars_mutex_destroy(struct mars_mutex
int mars_mutex_reset(struct mars_mutex *mutex)
{
- MARS_CHECK_RET(mutex, MARS_ERROR_NULL);
+ if (!mutex)
+ return MARS_ERROR_NULL;
mutex->lock = MARS_MUTEX_UNLOCKED;
__lwsync();
@@ -81,7 +84,8 @@ int mars_mutex_reset(struct mars_mutex *
int mars_mutex_lock(struct mars_mutex *mutex)
{
- MARS_CHECK_RET(mutex, MARS_ERROR_NULL);
+ if (!mutex)
+ return MARS_ERROR_NULL;
do {
do {
@@ -95,8 +99,10 @@ int mars_mutex_lock(struct mars_mutex *m
int mars_mutex_unlock(struct mars_mutex *mutex)
{
- MARS_CHECK_RET(mutex, MARS_ERROR_NULL);
- MARS_CHECK_RET(mutex->lock == MARS_MUTEX_LOCKED, MARS_ERROR_STATE);
+ if (!mutex)
+ return MARS_ERROR_NULL;
+ if (mutex->lock != MARS_MUTEX_LOCKED)
+ return MARS_ERROR_STATE;
__lwsync();
mutex->lock = MARS_MUTEX_UNLOCKED;
--- a/src/host/lib/mars_task.c
+++ b/src/host/lib/mars_task.c
@@ -43,38 +43,45 @@
#include "mars/mars_workload_queue.h"
#include "mars/mars_context.h"
#include "mars/mars_error.h"
-#include "mars/mars_debug.h"
int mars_task_create(struct mars_context *mars,
struct mars_task_id *id_ret,
- const char *name,
- const void *elf_image,
+ const char *name, const void *elf_image,
uint32_t context_save_size)
{
- MARS_CHECK_RET(mars, MARS_ERROR_NULL);
- MARS_CHECK_RET(id_ret, MARS_ERROR_NULL);
- MARS_CHECK_RET(elf_image, MARS_ERROR_NULL);
- MARS_CHECK_RET(!name || strlen(name) < MARS_TASK_NAME_LEN_MAX,
- MARS_ERROR_PARAMS);
- MARS_CHECK_RET(context_save_size <= MARS_TASK_CONTEXT_SAVE_SIZE_MAX,
- MARS_ERROR_PARAMS);
-
int ret;
uint16_t workload_id;
struct mars_task_context *task;
struct mars_workload_context *workload;
- Elf32_Ehdr *ehdr = (Elf32_Ehdr *)elf_image;
- Elf32_Phdr *phdr = (Elf32_Phdr *)((void *)ehdr + ehdr->e_phoff);
+ Elf32_Ehdr *ehdr;
+ Elf32_Phdr *phdr;
- //MARS_CHECK_RET(ehdr->e_phnum == 1, MARS_ERROR_FORMAT);
- MARS_CHECK_RET(phdr->p_type == PT_LOAD, MARS_ERROR_FORMAT);
- MARS_CHECK_RET(phdr->p_vaddr == MARS_TASK_ELF_VADDR,
- MARS_ERROR_FORMAT);
+ /* check function params */
+ if (!mars)
+ return MARS_ERROR_NULL;
+ if (!id_ret)
+ return MARS_ERROR_NULL;
+ if (!elf_image)
+ return MARS_ERROR_NULL;
+ if (name && strlen(name) > MARS_TASK_NAME_LEN_MAX)
+ return MARS_ERROR_PARAMS;
+ if (context_save_size > MARS_TASK_CONTEXT_SAVE_SIZE_MAX)
+ return MARS_ERROR_PARAMS;
+
+ /* process elf header information */
+ ehdr = (Elf32_Ehdr *)elf_image;
+ phdr = (Elf32_Phdr *)((void *)ehdr + ehdr->e_phoff);
+
+ if (phdr->p_type != PT_LOAD)
+ return MARS_ERROR_FORMAT;
+ if (phdr->p_vaddr != MARS_TASK_ELF_VADDR)
+ return MARS_ERROR_FORMAT;
/* begin process to add the task to the workload queue */
ret = workload_queue_add_begin(mars->workload_queue, &workload_id,
- MARS_WORKLOAD_TYPE_TASK, &workload);
- MARS_CHECK_RET(ret == MARS_SUCCESS, ret);
+ MARS_WORKLOAD_TYPE_TASK, &workload);
+ if (ret != MARS_SUCCESS)
+ return ret;
/* cast workload context to task context */
task = (struct mars_task_context *)workload;
@@ -97,11 +104,11 @@ int mars_task_create(struct mars_context
task->context_save_size = context_save_size;
task->context_save_ea = mars_ptr_to_ea(memalign(
MARS_TASK_CONTEXT_SAVE_ALIGN, task->context_save_size));
-
- MARS_CHECK_CLEANUP_RET(task->context_save_ea,
+ if (!task->context_save_ea) {
workload_queue_add_cancel(mars->workload_queue,
- workload_id),
- MARS_ERROR_MEMORY);
+ workload_id);
+ return MARS_ERROR_MEMORY;
+ }
} else {
task->context_save_size = 0;
task->context_save_ea = 0;
@@ -109,35 +116,42 @@ int mars_task_create(struct mars_context
/* end process to add the task to the workload queue */
ret = workload_queue_add_end(mars->workload_queue, workload_id);
- MARS_CHECK_CLEANUP_RET(ret == MARS_SUCCESS,
- workload_queue_add_cancel(mars->workload_queue,
- workload_id),
- ret);
+ if (ret != MARS_SUCCESS) {
+ workload_queue_add_cancel(mars->workload_queue, workload_id);
+ if (context_save_size)
+ free(mars_ea_to_ptr(task->context_save_ea));
+ return ret;
+ }
/* return id to caller */
*id_ret = task->id;
- MARS_PRINT("Initialize Task Context %d\n", workload_id);
- MARS_PRINT_TASK_CONTEXT(&task);
-
return MARS_SUCCESS;
}
int mars_task_destroy(struct mars_task_id *id)
{
- MARS_CHECK_RET(id, MARS_ERROR_NULL);
- MARS_CHECK_RET(id->mars_context_ea, MARS_ERROR_PARAMS);
- MARS_CHECK_RET(id->workload_id < MARS_WORKLOAD_MAX, MARS_ERROR_PARAMS);
-
int ret;
+ struct mars_context *mars;
struct mars_task_context *task;
struct mars_workload_context *workload;
- struct mars_context *mars = mars_ea_to_ptr(id->mars_context_ea);
+
+ /* check function params */
+ if (!id)
+ return MARS_ERROR_NULL;
+ if (!id->mars_context_ea)
+ return MARS_ERROR_PARAMS;
+ if (!id->workload_id >= MARS_WORKLOAD_MAX)
+ return MARS_ERROR_PARAMS;
+
+ /* get mars context pointer from task id */
+ mars = mars_ea_to_ptr(id->mars_context_ea);
/* begin process to remove the task from the workload queue */
ret = workload_queue_remove_begin(mars->workload_queue,
- id->workload_id, &workload);
- MARS_CHECK_RET(ret == MARS_SUCCESS, ret);
+ id->workload_id, &workload);
+ if (ret != MARS_SUCCESS)
+ return ret;
/* cast workload context to task context */
task = (struct mars_task_context *)workload;
@@ -148,9 +162,8 @@ int mars_task_destroy(struct mars_task_i
/* end process to remove the task from the workload queue */
ret = workload_queue_remove_end(mars->workload_queue, id->workload_id);
- MARS_CHECK_RET(ret == MARS_SUCCESS, ret);
-
- MARS_PRINT("Finalize Task Context %d\n", id->workload_id);
+ if (ret != MARS_SUCCESS)
+ return ret;
return MARS_SUCCESS;
}
@@ -158,19 +171,27 @@ int mars_task_destroy(struct mars_task_i
int mars_task_schedule(struct mars_task_id *id, struct mars_task_args *args,
uint8_t priority)
{
- MARS_CHECK_RET(id, MARS_ERROR_NULL);
- MARS_CHECK_RET(id->mars_context_ea, MARS_ERROR_PARAMS);
- MARS_CHECK_RET(id->workload_id < MARS_WORKLOAD_MAX, MARS_ERROR_PARAMS);
-
int ret;
+ struct mars_context *mars;
struct mars_task_context *task;
struct mars_workload_context *workload;
- struct mars_context *mars = mars_ea_to_ptr(id->mars_context_ea);
+
+ /* check function params */
+ if (!id)
+ return MARS_ERROR_NULL;
+ if (!id->mars_context_ea)
+ return MARS_ERROR_PARAMS;
+ if (!id->workload_id >= MARS_WORKLOAD_MAX)
+ return MARS_ERROR_PARAMS;
+
+ /* get mars context pointer from task id */
+ mars = mars_ea_to_ptr(id->mars_context_ea);
/* begin process to schedule the workload in the workload queue */
ret = workload_queue_schedule_begin(mars->workload_queue,
- id->workload_id, priority, &workload);
- MARS_CHECK_RET(ret == MARS_SUCCESS, ret);
+ id->workload_id, priority, &workload);
+ if (ret != MARS_SUCCESS)
+ return ret;
/* cast workload context to task context */
task = (struct mars_task_context *)workload;
@@ -182,29 +203,36 @@ int mars_task_schedule(struct mars_task_
/* end process to schedule the workload in the workload queue */
ret = workload_queue_schedule_end(mars->workload_queue,
- id->workload_id);
- MARS_CHECK_RET(ret == MARS_SUCCESS, ret);
-
- MARS_PRINT("Schedule Task Context %d\n", id->workload_id);
+ id->workload_id);
+ if (ret != MARS_SUCCESS)
+ return ret;
return MARS_SUCCESS;
}
int mars_task_wait(struct mars_task_id *id, int32_t *exit_code)
{
- MARS_CHECK_RET(id, MARS_ERROR_NULL);
- MARS_CHECK_RET(id->mars_context_ea, MARS_ERROR_PARAMS);
- MARS_CHECK_RET(id->workload_id < MARS_WORKLOAD_MAX, MARS_ERROR_PARAMS);
-
int ret;
+ struct mars_context *mars;
struct mars_task_context *task;
struct mars_workload_context *workload;
- struct mars_context *mars = mars_ea_to_ptr(id->mars_context_ea);
+
+ /* check function params */
+ if (!id)
+ return MARS_ERROR_NULL;
+ if (!id->mars_context_ea)
+ return MARS_ERROR_PARAMS;
+ if (!id->workload_id >= MARS_WORKLOAD_MAX)
+ return MARS_ERROR_PARAMS;
+
+ /* get mars context pointer from task id */
+ mars = mars_ea_to_ptr(id->mars_context_ea);
/* blocking wait for workload completion */
ret = workload_queue_wait(mars->workload_queue, id->workload_id,
- &workload);
- MARS_CHECK_RET(ret == MARS_SUCCESS, ret);
+ &workload);
+ if (ret != MARS_SUCCESS)
+ return ret;
/* cast workload context to task context */
task = (struct mars_task_context *)workload;
@@ -218,19 +246,27 @@ int mars_task_wait(struct mars_task_id *
int mars_task_try_wait(struct mars_task_id *id, int32_t *exit_code)
{
- MARS_CHECK_RET(id, MARS_ERROR_NULL);
- MARS_CHECK_RET(id->mars_context_ea, MARS_ERROR_PARAMS);
- MARS_CHECK_RET(id->workload_id < MARS_WORKLOAD_MAX, MARS_ERROR_PARAMS);
-
int ret;
+ struct mars_context *mars;
struct mars_task_context *task;
struct mars_workload_context *workload;
- struct mars_context *mars = mars_ea_to_ptr(id->mars_context_ea);
+
+ /* check function params */
+ if (!id)
+ return MARS_ERROR_NULL;
+ if (!id->mars_context_ea)
+ return MARS_ERROR_PARAMS;
+ if (!id->workload_id >= MARS_WORKLOAD_MAX)
+ return MARS_ERROR_PARAMS;
+
+ /* get mars context pointer from task id */
+ mars = mars_ea_to_ptr(id->mars_context_ea);
/* non-blocking wait for workload completion */
ret = workload_queue_try_wait(mars->workload_queue, id->workload_id,
- &workload);
- MARS_CHECK_RET(ret == MARS_SUCCESS, ret);
+ &workload);
+ if (ret != MARS_SUCCESS)
+ return ret;
/* cast workload context to task context */
task = (struct mars_task_context *)workload;
--- a/src/host/lib/mars_task_barrier.c
+++ b/src/host/lib/mars_task_barrier.c
@@ -41,24 +41,30 @@
#include "mars/mars_context.h"
#include "mars/mars_mutex.h"
#include "mars/mars_error.h"
-#include "mars/mars_debug.h"
int mars_task_barrier_create(struct mars_context *mars,
struct mars_task_barrier **barrier_ret,
uint32_t total)
{
- MARS_CHECK_RET(mars, MARS_ERROR_NULL);
- MARS_CHECK_RET(barrier_ret, MARS_ERROR_NULL);
- MARS_CHECK_RET(total <= MARS_TASK_BARRIER_WAIT_MAX, MARS_ERROR_PARAMS);
-
struct mars_task_barrier *barrier;
+ /* check function params */
+ if (!mars)
+ return MARS_ERROR_NULL;
+ if (!barrier_ret)
+ return MARS_ERROR_NULL;
+ if (total > MARS_TASK_BARRIER_WAIT_MAX)
+ return MARS_ERROR_PARAMS;
+
+ /* allocate barrier instance */
barrier = (struct mars_task_barrier *)
memalign(MARS_TASK_BARRIER_ALIGN, MARS_TASK_BARRIER_SIZE);
- MARS_CHECK_RET(barrier, MARS_ERROR_MEMORY);
+ if (!barrier)
+ return MARS_ERROR_MEMORY;
mars_mutex_reset((struct mars_mutex *)barrier);
+ /* initialize barrier instance */
barrier->mars_context_ea = mars_ptr_to_ea(mars);
barrier->total = total;
barrier->notified_count = 0;
@@ -66,6 +72,7 @@ int mars_task_barrier_create(struct mars
barrier->notify_wait_count = 0;
barrier->wait_count = 0;
+ /* return barrier instance pointer */
*barrier_ret = barrier;
return MARS_SUCCESS;
@@ -73,7 +80,9 @@ int mars_task_barrier_create(struct mars
int mars_task_barrier_destroy(struct mars_task_barrier *barrier)
{
- MARS_CHECK_RET(barrier, MARS_ERROR_NULL);
+ /* check function params */
+ if (!barrier)
+ return MARS_ERROR_NULL;
free(barrier);
--- a/src/host/lib/mars_task_event_flag.c
+++ b/src/host/lib/mars_task_event_flag.c
@@ -44,37 +44,43 @@
#include "mars/mars_context.h"
#include "mars/mars_mutex.h"
#include "mars/mars_error.h"
-#include "mars/mars_debug.h"
int mars_task_event_flag_create(struct mars_context *mars,
struct mars_task_event_flag **event_flag_ret,
uint8_t direction,
uint8_t clear_mode)
{
- MARS_CHECK_RET(mars, MARS_ERROR_NULL);
- MARS_CHECK_RET(event_flag_ret, MARS_ERROR_NULL);
- MARS_CHECK_RET(direction == MARS_TASK_EVENT_FLAG_HOST_TO_MPU ||
- direction == MARS_TASK_EVENT_FLAG_MPU_TO_HOST ||
- direction == MARS_TASK_EVENT_FLAG_MPU_TO_MPU,
- MARS_ERROR_PARAMS);
- MARS_CHECK_RET(clear_mode == MARS_TASK_EVENT_FLAG_CLEAR_AUTO ||
- clear_mode == MARS_TASK_EVENT_FLAG_CLEAR_MANUAL,
- MARS_ERROR_PARAMS);
-
struct mars_task_event_flag *event_flag;
+ /* check function params */
+ if (!mars)
+ return MARS_ERROR_NULL;
+ if (!event_flag_ret)
+ return MARS_ERROR_NULL;
+ if (direction != MARS_TASK_EVENT_FLAG_HOST_TO_MPU &&
+ direction != MARS_TASK_EVENT_FLAG_MPU_TO_HOST &&
+ direction != MARS_TASK_EVENT_FLAG_MPU_TO_MPU)
+ return MARS_ERROR_PARAMS;
+ if (clear_mode != MARS_TASK_EVENT_FLAG_CLEAR_AUTO &&
+ clear_mode != MARS_TASK_EVENT_FLAG_CLEAR_MANUAL)
+ return MARS_ERROR_PARAMS;
+
+ /* allocate event flag instance */
event_flag = (struct mars_task_event_flag *)
memalign(MARS_TASK_EVENT_FLAG_ALIGN, MARS_TASK_EVENT_FLAG_SIZE);
- MARS_CHECK_RET(event_flag, MARS_ERROR_MEMORY);
+ if (!event_flag)
+ return MARS_ERROR_MEMORY;
mars_mutex_reset((struct mars_mutex *)event_flag);
+ /* intialize event flag instance */
event_flag->mars_context_ea = mars_ptr_to_ea(mars);
event_flag->bits = 0;
event_flag->direction = direction;
event_flag->clear_mode = clear_mode;
event_flag->wait_count = 0;
+ /* return event flag instance pointer */
*event_flag_ret = event_flag;
return MARS_SUCCESS;
@@ -82,7 +88,9 @@ int mars_task_event_flag_create(struct m
int mars_task_event_flag_destroy(struct mars_task_event_flag *event_flag)
{
- MARS_CHECK_RET(event_flag, MARS_ERROR_NULL);
+ /* check function params */
+ if (!event_flag)
+ return MARS_ERROR_NULL;
free(event_flag);
@@ -92,7 +100,8 @@ int mars_task_event_flag_destroy(struct
int mars_task_event_flag_clear(struct mars_task_event_flag *event_flag,
uint32_t bits)
{
- MARS_CHECK_RET(event_flag, MARS_ERROR_NULL);
+ if (!event_flag)
+ return MARS_ERROR_NULL;
mars_mutex_lock((struct mars_mutex *)event_flag);
@@ -107,17 +116,23 @@ int mars_task_event_flag_clear(struct ma
int mars_task_event_flag_set(struct mars_task_event_flag *event_flag,
uint32_t bits)
{
- MARS_CHECK_RET(event_flag, MARS_ERROR_NULL);
- MARS_CHECK_RET(event_flag->mars_context_ea, MARS_ERROR_NULL);
- MARS_CHECK_RET(event_flag->direction ==
- MARS_TASK_EVENT_FLAG_HOST_TO_MPU, MARS_ERROR_STATE);
-
int ret;
int i;
- struct mars_context *mars = mars_ea_to_ptr(event_flag->mars_context_ea);
+ struct mars_context *mars;
+
+ /* check function params */
+ if (!event_flag)
+ return MARS_ERROR_NULL;
+ if (!event_flag->mars_context_ea)
+ return MARS_ERROR_NULL;
+ if (event_flag->direction != MARS_TASK_EVENT_FLAG_HOST_TO_MPU)
+ return MARS_ERROR_STATE;
mars_mutex_lock((struct mars_mutex *)event_flag);
+ /* get mars context pointer */
+ mars = mars_ea_to_ptr(event_flag->mars_context_ea);
+
/* set the necessary bits */
event_flag->bits |= bits;
@@ -142,7 +157,8 @@ int mars_task_event_flag_set(struct mars
/* signal the task to go to ready state */
ret = workload_queue_signal_send(mars->workload_queue,
event_flag->wait_id[i]);
- MARS_CHECK_RET(ret == MARS_SUCCESS, ret);
+ if (ret != MARS_SUCCESS)
+ return ret;
/* flush id from wait list */
event_flag->wait_count--;
@@ -167,12 +183,14 @@ int mars_task_event_flag_wait(struct mar
uint32_t mask, uint8_t mask_mode,
uint32_t *bits)
{
- MARS_CHECK_RET(event_flag, MARS_ERROR_NULL);
- MARS_CHECK_RET(event_flag->direction ==
- MARS_TASK_EVENT_FLAG_MPU_TO_HOST, MARS_ERROR_STATE);
- MARS_CHECK_RET(mask_mode == MARS_TASK_EVENT_FLAG_MASK_OR ||
- mask_mode == MARS_TASK_EVENT_FLAG_MASK_AND,
- MARS_ERROR_PARAMS);
+ /* check function params */
+ if (!event_flag)
+ return MARS_ERROR_NULL;
+ if (event_flag->direction != MARS_TASK_EVENT_FLAG_MPU_TO_HOST)
+ return MARS_ERROR_STATE;
+ if (mask_mode != MARS_TASK_EVENT_FLAG_MASK_OR &&
+ mask_mode != MARS_TASK_EVENT_FLAG_MASK_AND)
+ return MARS_ERROR_PARAMS;
mars_mutex_lock((struct mars_mutex *)event_flag);
@@ -213,12 +231,14 @@ int mars_task_event_flag_try_wait(struct
uint32_t mask, uint8_t mask_mode,
uint32_t *bits)
{
- MARS_CHECK_RET(event_flag, MARS_ERROR_NULL);
- MARS_CHECK_RET(event_flag->direction ==
- MARS_TASK_EVENT_FLAG_MPU_TO_HOST, MARS_ERROR_STATE);
- MARS_CHECK_RET(mask_mode == MARS_TASK_EVENT_FLAG_MASK_OR ||
- mask_mode == MARS_TASK_EVENT_FLAG_MASK_AND,
- MARS_ERROR_PARAMS);
+ /* check function params */
+ if (!event_flag)
+ return MARS_ERROR_NULL;
+ if (event_flag->direction != MARS_TASK_EVENT_FLAG_MPU_TO_HOST)
+ return MARS_ERROR_STATE;
+ if (mask_mode != MARS_TASK_EVENT_FLAG_MASK_OR &&
+ mask_mode != MARS_TASK_EVENT_FLAG_MASK_AND)
+ return MARS_ERROR_PARAMS;
mars_mutex_lock((struct mars_mutex *)event_flag);
--- a/src/host/lib/mars_task_queue.c
+++ b/src/host/lib/mars_task_queue.c
@@ -44,7 +44,6 @@
#include "mars/mars_context.h"
#include "mars/mars_mutex.h"
#include "mars/mars_error.h"
-#include "mars/mars_debug.h"
int mars_task_queue_create(struct mars_context *mars,
struct mars_task_queue **queue_ret,
@@ -52,28 +51,37 @@ int mars_task_queue_create(struct mars_c
uint32_t depth,
uint8_t direction)
{
- MARS_CHECK_RET(mars, MARS_ERROR_NULL);
- MARS_CHECK_RET(queue_ret, MARS_ERROR_NULL);
- MARS_CHECK_RET((size & MARS_TASK_QUEUE_ENTRY_SIZE_MASK) == 0 &&
- size <= MARS_TASK_QUEUE_ENTRY_SIZE_MAX,
- MARS_ERROR_PARAMS);
- MARS_CHECK_RET(direction == MARS_TASK_QUEUE_HOST_TO_MPU ||
- direction == MARS_TASK_QUEUE_MPU_TO_HOST ||
- direction == MARS_TASK_QUEUE_MPU_TO_MPU,
- MARS_ERROR_PARAMS);
-
struct mars_task_queue *queue;
void *buffer;
+ /* check function params */
+ if (!mars)
+ return MARS_ERROR_NULL;
+ if (!queue_ret)
+ return MARS_ERROR_NULL;
+ if (size & MARS_TASK_QUEUE_ENTRY_SIZE_MASK)
+ return MARS_ERROR_PARAMS;
+ if (size > MARS_TASK_QUEUE_ENTRY_SIZE_MAX)
+ return MARS_ERROR_PARAMS;
+ if (direction != MARS_TASK_QUEUE_HOST_TO_MPU &&
+ direction != MARS_TASK_QUEUE_MPU_TO_HOST &&
+ direction != MARS_TASK_QUEUE_MPU_TO_MPU)
+ return MARS_ERROR_PARAMS;
+
+ /* allocate queue instance */
queue = (struct mars_task_queue *)
memalign(MARS_TASK_QUEUE_ALIGN, MARS_TASK_QUEUE_SIZE);
- MARS_CHECK_RET(queue, MARS_ERROR_MEMORY);
+ if (!queue)
+ return MARS_ERROR_MEMORY;
+ /* allocate queue buffer instance */
buffer = memalign(MARS_TASK_QUEUE_BUFFER_ALIGN, size * depth);
- MARS_CHECK_CLEANUP_RET(buffer, free(queue), MARS_ERROR_MEMORY);
+ if (!buffer)
+ return MARS_ERROR_MEMORY;
mars_mutex_reset((struct mars_mutex *)queue);
+ /* initialize queue instance */
queue->mars_context_ea = mars_ptr_to_ea(mars);
queue->buffer_ea = mars_ptr_to_ea(buffer);
queue->push_ea = mars_ptr_to_ea(buffer);
@@ -85,6 +93,7 @@ int mars_task_queue_create(struct mars_c
queue->push_wait_count = 0;
queue->pop_wait_count = 0;
+ /* return queue instance pointer */
*queue_ret = queue;
return MARS_SUCCESS;
@@ -92,7 +101,9 @@ int mars_task_queue_create(struct mars_c
int mars_task_queue_destroy(struct mars_task_queue *queue)
{
- MARS_CHECK_RET(queue, MARS_ERROR_NULL);
+ /* check function params */
+ if (!queue)
+ return MARS_ERROR_NULL;
free(queue);
@@ -101,10 +112,13 @@ int mars_task_queue_destroy(struct mars_
int mars_task_queue_count(struct mars_task_queue *queue, uint32_t *count)
{
- MARS_CHECK_RET(queue, MARS_ERROR_NULL);
- MARS_CHECK_RET(count, MARS_ERROR_NULL);
- MARS_CHECK_RET(((uintptr_t)queue & MARS_TASK_QUEUE_ALIGN_MASK) == 0,
- MARS_ERROR_ALIGN);
+ /* check function params */
+ if (!queue)
+ return MARS_ERROR_NULL;
+ if (!count)
+ return MARS_ERROR_NULL;
+ if ((uintptr_t)queue & MARS_TASK_QUEUE_ALIGN_MASK)
+ return MARS_ERROR_ALIGN;
mars_mutex_lock((struct mars_mutex *)queue);
@@ -118,15 +132,20 @@ int mars_task_queue_count(struct mars_ta
int mars_task_queue_clear(struct mars_task_queue *queue)
{
- MARS_CHECK_RET(queue, MARS_ERROR_NULL);
- MARS_CHECK_RET(((uintptr_t)queue & MARS_TASK_QUEUE_ALIGN_MASK) == 0,
- MARS_ERROR_ALIGN);
-
int i;
- struct mars_context *mars = mars_ea_to_ptr(queue->mars_context_ea);
+ struct mars_context *mars;
+
+ /* check function params */
+ if (!queue)
+ return MARS_ERROR_NULL;
+ if ((uintptr_t)queue & MARS_TASK_QUEUE_ALIGN_MASK)
+ return MARS_ERROR_ALIGN;
mars_mutex_lock((struct mars_mutex *)queue);
+ /* get mars context pointer */
+ mars = mars_ea_to_ptr(queue->mars_context_ea);
+
/* signal all waiting tasks that queue is ready for push */
for (i = 0; i < queue->push_wait_count; i++)
workload_queue_signal_send(
@@ -174,11 +193,13 @@ static void push_update(struct mars_task
static int push(struct mars_task_queue *queue, const void *data, int try)
{
- MARS_CHECK_RET(queue, MARS_ERROR_NULL);
- MARS_CHECK_RET(((uintptr_t)queue & MARS_TASK_QUEUE_ALIGN_MASK) == 0,
- MARS_ERROR_ALIGN);
- MARS_CHECK_RET(queue->direction == MARS_TASK_QUEUE_HOST_TO_MPU,
- MARS_ERROR_STATE);
+ /* check function params */
+ if (!queue)
+ return MARS_ERROR_NULL;
+ if ((uintptr_t)queue & MARS_TASK_QUEUE_ALIGN_MASK)
+ return MARS_ERROR_ALIGN;
+ if (queue->direction != MARS_TASK_QUEUE_HOST_TO_MPU)
+ return MARS_ERROR_STATE;
mars_mutex_lock((struct mars_mutex *)queue);
@@ -246,11 +267,13 @@ static void pop_update(struct mars_task_
static int pop(struct mars_task_queue *queue, void *data, int peek, int try)
{
- MARS_CHECK_RET(queue, MARS_ERROR_NULL);
- MARS_CHECK_RET(((uintptr_t)queue & MARS_TASK_QUEUE_ALIGN_MASK) == 0,
- MARS_ERROR_ALIGN);
- MARS_CHECK_RET(queue->direction == MARS_TASK_QUEUE_MPU_TO_HOST,
- MARS_ERROR_STATE);
+ /* check function params */
+ if (!queue)
+ return MARS_ERROR_NULL;
+ if ((uintptr_t)queue & MARS_TASK_QUEUE_ALIGN_MASK)
+ return MARS_ERROR_ALIGN;
+ if (queue->direction != MARS_TASK_QUEUE_MPU_TO_HOST)
+ return MARS_ERROR_STATE;
mars_mutex_lock((struct mars_mutex *)queue);
--- a/src/host/lib/mars_task_semaphore.c
+++ b/src/host/lib/mars_task_semaphore.c
@@ -42,29 +42,33 @@
#include "mars/mars_context.h"
#include "mars/mars_mutex.h"
#include "mars/mars_error.h"
-#include "mars/mars_debug.h"
int mars_task_semaphore_create(struct mars_context *mars,
struct mars_task_semaphore **semaphore_ret,
int32_t count)
{
- MARS_CHECK_RET(mars, MARS_ERROR_NULL);
- MARS_CHECK_RET(semaphore_ret, MARS_ERROR_NULL);
- MARS_CHECK_RET(abs(count) < MARS_TASK_SEMAPHORE_WAIT_MAX,
- MARS_ERROR_PARAMS);
-
struct mars_task_semaphore *semaphore;
+ /* check function params */
+ if (!mars)
+ return MARS_ERROR_NULL;
+ if (!semaphore_ret)
+ return MARS_ERROR_NULL;
+
+ /* allocate semaphore instance */
semaphore = (struct mars_task_semaphore *)
memalign(MARS_TASK_SEMAPHORE_ALIGN, MARS_TASK_SEMAPHORE_SIZE);
- MARS_CHECK_RET(semaphore, MARS_ERROR_MEMORY);
+ if (!semaphore)
+ return MARS_ERROR_MEMORY;
mars_mutex_reset((struct mars_mutex *)semaphore);
+ /* initialize semaphore instance */
semaphore->mars_context_ea = mars_ptr_to_ea(mars);
semaphore->count = count;
semaphore->wait_count = 0;
+ /* return semaphore instance */
*semaphore_ret = semaphore;
return MARS_SUCCESS;
@@ -72,7 +76,9 @@ int mars_task_semaphore_create(struct ma
int mars_task_semaphore_destroy(struct mars_task_semaphore *semaphore)
{
- MARS_CHECK_RET(semaphore, MARS_ERROR_NULL);
+ /* check function params */
+ if (!semaphore)
+ return MARS_ERROR_NULL;
free(semaphore);
--- a/src/host/lib/mars_task_signal.c
+++ b/src/host/lib/mars_task_signal.c
@@ -39,18 +39,25 @@
#include "mars/mars_workload_queue.h"
#include "mars/mars_context.h"
#include "mars/mars_error.h"
-#include "mars/mars_debug.h"
int mars_task_signal_send(struct mars_task_id *id)
{
- MARS_CHECK_RET(id, MARS_ERROR_NULL);
- MARS_CHECK_RET(id->mars_context_ea, MARS_ERROR_PARAMS);
-
int ret;
- struct mars_context *mars = mars_ea_to_ptr(id->mars_context_ea);
+ struct mars_context *mars;
+
+ /* check function params */
+ if (!id)
+ return MARS_ERROR_NULL;
+
+ /* get mars context pointer */
+ mars = mars_ea_to_ptr(id->mars_context_ea);
+ if (!mars)
+ return MARS_ERROR_PARAMS;
+ /* send signal to workload */
ret = workload_queue_signal_send(mars->workload_queue, id->workload_id);
- MARS_CHECK_RET(ret == MARS_SUCCESS, ret);
+ if (ret != MARS_SUCCESS)
+ return ret;
return MARS_SUCCESS;
}
--- a/src/host/lib/mars_workload_queue.c
+++ b/src/host/lib/mars_workload_queue.c
@@ -45,21 +45,22 @@
#include "mars/mars_context.h"
#include "mars/mars_mutex.h"
#include "mars/mars_error.h"
-#include "mars/mars_debug.h"
int workload_queue_create(struct mars_workload_queue **queue_ret)
{
- MARS_CHECK_RET(queue_ret, MARS_ERROR_NULL);
-
int block;
int index;
-
struct mars_workload_queue *queue;
- /* allocate */
+ /* check function params */
+ if (!queue_ret)
+ return MARS_ERROR_NULL;
+
+ /* allocate workload instance */
queue = (struct mars_workload_queue *)memalign(
MARS_WORKLOAD_QUEUE_ALIGN, sizeof(struct mars_workload_queue));
- MARS_CHECK_RET(queue, MARS_ERROR_MEMORY);
+ if (!queue)
+ return MARS_ERROR_MEMORY;
/* initialize workload queue header */
queue->header.flag = MARS_WORKLOAD_QUEUE_FLAG_NONE;
@@ -88,6 +89,7 @@ int workload_queue_create(struct mars_wo
}
}
+ /* return workload queue instance */
*queue_ret = queue;
return MARS_SUCCESS;
@@ -95,13 +97,14 @@ int workload_queue_create(struct mars_wo
int workload_queue_destroy(struct mars_workload_queue *queue)
{
- MARS_CHECK_RET(queue, MARS_ERROR_NULL);
-
int block;
int index;
-
uint16_t id = 0;
+ /* check function params */
+ if (!queue)
+ return MARS_ERROR_NULL;
+
/* check for any tasks left in workload queue */
while (id < MARS_WORKLOAD_MAX) {
block = id / MARS_WORKLOAD_PER_BLOCK;
@@ -115,9 +118,10 @@ int workload_queue_destroy(struct mars_w
}
/* found some task left in workload queue */
- MARS_CHECK_RET(id < MARS_WORKLOAD_MAX, MARS_ERROR_STATE);
+ if (id >= MARS_WORKLOAD_MAX)
+ return MARS_ERROR_STATE;
- /* free allocated memory */
+ /* free workload queue instance */
free(queue);
return MARS_SUCCESS;
@@ -125,7 +129,9 @@ int workload_queue_destroy(struct mars_w
int workload_queue_exit(struct mars_workload_queue *queue)
{
- MARS_CHECK_RET(queue, MARS_ERROR_NULL);
+ /* check function params */
+ if (!queue)
+ return MARS_ERROR_NULL;
queue->header.flag = MARS_WORKLOAD_QUEUE_FLAG_EXIT;
@@ -136,19 +142,26 @@ int workload_queue_add_begin(struct mars
uint8_t type,
struct mars_workload_context **workload)
{
- MARS_CHECK_RET(queue, MARS_ERROR_NULL);
- MARS_CHECK_RET(id, MARS_ERROR_NULL);
- MARS_CHECK_RET(type == MARS_WORKLOAD_TYPE_TASK, MARS_ERROR_PARAMS);
-
int block = 0;
int index = 0;
+ uint64_t *bits;
- uint64_t *bits = &queue->block[block].bits[index];
-
- *id = 0;
+ /* check function params */
+ if (!queue)
+ return MARS_ERROR_NULL;
+ if (!id)
+ return MARS_ERROR_NULL;
+ if (type != MARS_WORKLOAD_TYPE_TASK)
+ return MARS_ERROR_PARAMS;
mars_mutex_lock((struct mars_mutex *)&queue->block[block]);
+ /* get bits from workload queue block */
+ bits = &queue->block[block].bits[index];
+
+ /* initialize return id to 0 */
+ *id = 0;
+
while (MARS_BITS_GET(bits, STATE) != MARS_WORKLOAD_STATE_NONE) {
(*id)++;
index++;
@@ -167,10 +180,11 @@ int workload_queue_add_begin(struct mars
bits = &queue->block[block].bits[index];
}
- MARS_CHECK_CLEANUP_RET(
- MARS_BITS_GET(bits, STATE) == MARS_WORKLOAD_STATE_NONE,
- mars_mutex_unlock((struct mars_mutex *)&queue->block[block]),
- MARS_ERROR_STATE);
+ /* check for valid state */
+ if (MARS_BITS_GET(bits, STATE) != MARS_WORKLOAD_STATE_NONE) {
+ mars_mutex_unlock((struct mars_mutex *)&queue->block[block]);
+ return MARS_ERROR_STATE;
+ }
/* set type and set state to adding */
MARS_BITS_SET(bits, TYPE, type);
@@ -187,20 +201,30 @@ int workload_queue_add_begin(struct mars
int workload_queue_add_end(struct mars_workload_queue *queue, uint16_t id)
{
- MARS_CHECK_RET(queue, MARS_ERROR_NULL);
- MARS_CHECK_RET(id < MARS_WORKLOAD_MAX, MARS_ERROR_PARAMS);
-
- int block = id / MARS_WORKLOAD_PER_BLOCK;
- int index = id % MARS_WORKLOAD_PER_BLOCK;
+ int block;
+ int index;
+ uint64_t *bits;
- uint64_t *bits = &queue->block[block].bits[index];
+ /* check function params */
+ if (!queue)
+ return MARS_ERROR_NULL;
+ if (id >= MARS_WORKLOAD_MAX)
+ return MARS_ERROR_PARAMS;
+
+ /* calculate block/index from id */
+ block = id / MARS_WORKLOAD_PER_BLOCK;
+ index = id % MARS_WORKLOAD_PER_BLOCK;
mars_mutex_lock((struct mars_mutex *)&queue->block[block]);
- MARS_CHECK_CLEANUP_RET(
- MARS_BITS_GET(bits, STATE) == MARS_WORKLOAD_STATE_ADDING,
- mars_mutex_unlock((struct mars_mutex *)&queue->block[block]),
- MARS_ERROR_STATE);
+ /* get bits from workload queue block */
+ bits = &queue->block[block].bits[index];
+
+ /* check for valid state */
+ if (MARS_BITS_GET(bits, STATE) != MARS_WORKLOAD_STATE_ADDING) {
+ mars_mutex_unlock((struct mars_mutex *)&queue->block[block]);
+ return MARS_ERROR_STATE;
+ }
/* reset workload queue bits and set state to finished state */
MARS_BITS_SET(bits, STATE, MARS_WORKLOAD_STATE_FINISHED);
@@ -212,19 +236,27 @@ int workload_queue_add_end(struct mars_w
int workload_queue_add_cancel(struct mars_workload_queue *queue, uint16_t id)
{
- MARS_CHECK_RET(queue, MARS_ERROR_NULL);
- MARS_CHECK_RET(id < MARS_WORKLOAD_MAX, MARS_ERROR_PARAMS);
+ int block;
+ int index;
- int block = id / MARS_WORKLOAD_PER_BLOCK;
- int index = id % MARS_WORKLOAD_PER_BLOCK;
+ /* check function params */
+ if (!queue)
+ return MARS_ERROR_NULL;
+ if (id >= MARS_WORKLOAD_MAX)
+ return MARS_ERROR_PARAMS;
+
+ /* calculate block/index from id */
+ block = id / MARS_WORKLOAD_PER_BLOCK;
+ index = id % MARS_WORKLOAD_PER_BLOCK;
mars_mutex_lock((struct mars_mutex *)&queue->block[block]);
- MARS_CHECK_CLEANUP_RET(
- MARS_BITS_GET(&queue->block[block].bits[index], STATE) ==
- MARS_WORKLOAD_STATE_ADDING,
- mars_mutex_unlock((struct mars_mutex *)&queue->block[block]),
- MARS_ERROR_STATE);
+ /* check for valid state */
+ if (MARS_BITS_GET(&queue->block[block].bits[index], STATE) !=
+ MARS_WORKLOAD_STATE_ADDING) {
+ mars_mutex_unlock((struct mars_mutex *)&queue->block[block]);
+ return MARS_ERROR_STATE;
+ }
/* set state back to none state */
MARS_BITS_SET(&queue->block[block].bits[index], STATE,
@@ -238,19 +270,27 @@ int workload_queue_add_cancel(struct mar
int workload_queue_remove_begin(struct mars_workload_queue *queue, uint16_t id,
struct mars_workload_context **workload)
{
- MARS_CHECK_RET(queue, MARS_ERROR_NULL);
- MARS_CHECK_RET(id < MARS_WORKLOAD_MAX, MARS_ERROR_PARAMS);
+ int block;
+ int index;
- int block = id / MARS_WORKLOAD_PER_BLOCK;
- int index = id % MARS_WORKLOAD_PER_BLOCK;
+ /* check function params */
+ if (!queue)
+ return MARS_ERROR_NULL;
+ if (id >= MARS_WORKLOAD_MAX)
+ return MARS_ERROR_PARAMS;
+
+ /* calculate block/index from id */
+ block = id / MARS_WORKLOAD_PER_BLOCK;
+ index = id % MARS_WORKLOAD_PER_BLOCK;
mars_mutex_lock((struct mars_mutex *)&queue->block[block]);
- MARS_CHECK_CLEANUP_RET(
- MARS_BITS_GET(&queue->block[block].bits[index], STATE) ==
- MARS_WORKLOAD_STATE_FINISHED,
- mars_mutex_unlock((struct mars_mutex *)&queue->block[block]),
- MARS_ERROR_STATE);
+ /* check for valid state */
+ if (MARS_BITS_GET(&queue->block[block].bits[index], STATE) !=
+ MARS_WORKLOAD_STATE_FINISHED) {
+ mars_mutex_unlock((struct mars_mutex *)&queue->block[block]);
+ return MARS_ERROR_STATE;
+ }
/* set state to removing */
MARS_BITS_SET(&queue->block[block].bits[index], STATE,
@@ -267,19 +307,27 @@ int workload_queue_remove_begin(struct m
int workload_queue_remove_end(struct mars_workload_queue *queue, uint16_t id)
{
- MARS_CHECK_RET(queue, MARS_ERROR_NULL);
- MARS_CHECK_RET(id < MARS_WORKLOAD_MAX, MARS_ERROR_PARAMS);
+ int block;
+ int index;
- int block = id / MARS_WORKLOAD_PER_BLOCK;
- int index = id % MARS_WORKLOAD_PER_BLOCK;
+ /* check function params */
+ if (!queue)
+ return MARS_ERROR_NULL;
+ if (id >= MARS_WORKLOAD_MAX)
+ return MARS_ERROR_PARAMS;
+
+ /* calculate block/index from id */
+ block = id / MARS_WORKLOAD_PER_BLOCK;
+ index = id % MARS_WORKLOAD_PER_BLOCK;
mars_mutex_lock((struct mars_mutex *)&queue->block[block]);
- MARS_CHECK_CLEANUP_RET(
- MARS_BITS_GET(&queue->block[block].bits[index], STATE) ==
- MARS_WORKLOAD_STATE_REMOVING,
- mars_mutex_unlock((struct mars_mutex *)&queue->block[block]),
- MARS_ERROR_STATE);
+ /* check for valid state */
+ if (MARS_BITS_GET(&queue->block[block].bits[index], STATE) !=
+ MARS_WORKLOAD_STATE_REMOVING) {
+ mars_mutex_unlock((struct mars_mutex *)&queue->block[block]);
+ return MARS_ERROR_STATE;
+ }
/* set state to none */
MARS_BITS_SET(&queue->block[block].bits[index], TYPE,
@@ -292,19 +340,27 @@ int workload_queue_remove_end(struct mar
int workload_queue_remove_cancel(struct mars_workload_queue *queue, uint16_t id)
{
- MARS_CHECK_RET(queue, MARS_ERROR_NULL);
- MARS_CHECK_RET(id < MARS_WORKLOAD_MAX, MARS_ERROR_PARAMS);
+ int block;
+ int index;
- int block = id / MARS_WORKLOAD_PER_BLOCK;
- int index = id % MARS_WORKLOAD_PER_BLOCK;
+ /* check function params */
+ if (!queue)
+ return MARS_ERROR_NULL;
+ if (id >= MARS_WORKLOAD_MAX)
+ return MARS_ERROR_PARAMS;
+
+ /* calculate block/index from id */
+ block = id / MARS_WORKLOAD_PER_BLOCK;
+ index = id % MARS_WORKLOAD_PER_BLOCK;
mars_mutex_lock((struct mars_mutex *)&queue->block[block]);
- MARS_CHECK_CLEANUP_RET(
- MARS_BITS_GET(&queue->block[block].bits[index], STATE) ==
- MARS_WORKLOAD_STATE_REMOVING,
- mars_mutex_unlock((struct mars_mutex *)&queue->block[block]),
- MARS_ERROR_STATE);
+ /* check for valid state */
+ if (MARS_BITS_GET(&queue->block[block].bits[index], STATE) !=
+ MARS_WORKLOAD_STATE_REMOVING) {
+ mars_mutex_unlock((struct mars_mutex *)&queue->block[block]);
+ return MARS_ERROR_STATE;
+ }
/* set state back to finished */
MARS_BITS_SET(&queue->block[block].bits[index], TYPE,
@@ -319,19 +375,27 @@ int workload_queue_schedule_begin(struct
uint16_t id, uint8_t priority,
struct mars_workload_context **workload)
{
- MARS_CHECK_RET(queue, MARS_ERROR_NULL);
- MARS_CHECK_RET(id < MARS_WORKLOAD_MAX, MARS_ERROR_PARAMS);
+ int block;
+ int index;
- int block = id / MARS_WORKLOAD_PER_BLOCK;
- int index = id % MARS_WORKLOAD_PER_BLOCK;
+ /* check function params */
+ if (!queue)
+ return MARS_ERROR_NULL;
+ if (id >= MARS_WORKLOAD_MAX)
+ return MARS_ERROR_PARAMS;
+
+ /* calculate block/index from id */
+ block = id / MARS_WORKLOAD_PER_BLOCK;
+ index = id % MARS_WORKLOAD_PER_BLOCK;
mars_mutex_lock((struct mars_mutex *)&queue->block[block]);
- MARS_CHECK_CLEANUP_RET(
- MARS_BITS_GET(&queue->block[block].bits[index], STATE) ==
- MARS_WORKLOAD_STATE_FINISHED,
- mars_mutex_unlock((struct mars_mutex *)&queue->block[block]),
- MARS_ERROR_STATE);
+ /* check for valid state */
+ if (MARS_BITS_GET(&queue->block[block].bits[index], STATE) !=
+ MARS_WORKLOAD_STATE_FINISHED) {
+ mars_mutex_unlock((struct mars_mutex *)&queue->block[block]);
+ return MARS_ERROR_STATE;
+ }
/* reset workload queue bits and set state to scheduling */
MARS_BITS_SET(&queue->block[block].bits[index], STATE,
@@ -356,19 +420,27 @@ int workload_queue_schedule_begin(struct
int workload_queue_schedule_end(struct mars_workload_queue *queue, uint16_t id)
{
- MARS_CHECK_RET(queue, MARS_ERROR_NULL);
- MARS_CHECK_RET(id < MARS_WORKLOAD_MAX, MARS_ERROR_PARAMS);
+ int block;
+ int index;
- int block = id / MARS_WORKLOAD_PER_BLOCK;
- int index = id % MARS_WORKLOAD_PER_BLOCK;
+ /* check function params */
+ if (!queue)
+ return MARS_ERROR_NULL;
+ if (id >= MARS_WORKLOAD_MAX)
+ return MARS_ERROR_PARAMS;
+
+ /* calculate block/index from id */
+ block = id / MARS_WORKLOAD_PER_BLOCK;
+ index = id % MARS_WORKLOAD_PER_BLOCK;
mars_mutex_lock((struct mars_mutex *)&queue->block[block]);
- MARS_CHECK_CLEANUP_RET(
- MARS_BITS_GET(&queue->block[block].bits[index], STATE) ==
- MARS_WORKLOAD_STATE_SCHEDULING,
- mars_mutex_unlock((struct mars_mutex *)&queue->block[block]),
- MARS_ERROR_STATE);
+ /* check for valid state */
+ if (MARS_BITS_GET(&queue->block[block].bits[index], STATE) !=
+ MARS_WORKLOAD_STATE_SCHEDULING) {
+ mars_mutex_unlock((struct mars_mutex *)&queue->block[block]);
+ return MARS_ERROR_STATE;
+ }
/* set state to ready */
MARS_BITS_SET(&queue->block[block].bits[index], STATE,
@@ -382,19 +454,27 @@ int workload_queue_schedule_end(struct m
int workload_queue_schedule_cancel(struct mars_workload_queue *queue,
uint16_t id)
{
- MARS_CHECK_RET(queue, MARS_ERROR_NULL);
- MARS_CHECK_RET(id < MARS_WORKLOAD_MAX, MARS_ERROR_PARAMS);
+ int block;
+ int index;
- int block = id / MARS_WORKLOAD_PER_BLOCK;
- int index = id % MARS_WORKLOAD_PER_BLOCK;
+ /* check function params */
+ if (!queue)
+ return MARS_ERROR_NULL;
+ if (id >= MARS_WORKLOAD_MAX)
+ return MARS_ERROR_PARAMS;
+
+ /* calculate block/index from id */
+ block = id / MARS_WORKLOAD_PER_BLOCK;
+ index = id % MARS_WORKLOAD_PER_BLOCK;
mars_mutex_lock((struct mars_mutex *)&queue->block[block]);
- MARS_CHECK_CLEANUP_RET(
- MARS_BITS_GET(&queue->block[block].bits[index], STATE) ==
- MARS_WORKLOAD_STATE_SCHEDULING,
- mars_mutex_unlock((struct mars_mutex *)&queue->block[block]),
- MARS_ERROR_STATE);
+ /* check for valid state */
+ if (MARS_BITS_GET(&queue->block[block].bits[index], STATE) !=
+ MARS_WORKLOAD_STATE_SCHEDULING) {
+ mars_mutex_unlock((struct mars_mutex *)&queue->block[block]);
+ return MARS_ERROR_STATE;
+ }
/* set state back to finished */
MARS_BITS_SET(&queue->block[block].bits[index], STATE,
@@ -408,18 +488,25 @@ int workload_queue_schedule_cancel(struc
int workload_queue_wait(struct mars_workload_queue *queue, uint16_t id,
struct mars_workload_context **workload)
{
- MARS_CHECK_RET(queue, MARS_ERROR_NULL);
- MARS_CHECK_RET(id < MARS_WORKLOAD_MAX, MARS_ERROR_PARAMS);
+ int block;
+ int index;
- int block = id / MARS_WORKLOAD_PER_BLOCK;
- int index = id % MARS_WORKLOAD_PER_BLOCK;
+ /* check function params */
+ if (!queue)
+ return MARS_ERROR_NULL;
+ if (id >= MARS_WORKLOAD_MAX)
+ return MARS_ERROR_PARAMS;
+
+ /* calculate block/index from id */
+ block = id / MARS_WORKLOAD_PER_BLOCK;
+ index = id % MARS_WORKLOAD_PER_BLOCK;
+ /* loop until workload state is finished */
while (MARS_BITS_GET(&queue->block[block].bits[index], STATE) !=
MARS_WORKLOAD_STATE_FINISHED) {
- MARS_CHECK_RET(
- MARS_BITS_GET(&queue->block[block].bits[index], STATE)
- != MARS_WORKLOAD_STATE_NONE,
- MARS_ERROR_STATE);
+ if (MARS_BITS_GET(&queue->block[block].bits[index], STATE) ==
+ MARS_WORKLOAD_STATE_NONE)
+ return MARS_ERROR_STATE;
sched_yield();
}
@@ -433,17 +520,25 @@ int workload_queue_wait(struct mars_work
int workload_queue_try_wait(struct mars_workload_queue *queue, uint16_t id,
struct mars_workload_context **workload)
{
- MARS_CHECK_RET(queue, MARS_ERROR_NULL);
- MARS_CHECK_RET(id < MARS_WORKLOAD_MAX, MARS_ERROR_PARAMS);
-
- int block = id / MARS_WORKLOAD_PER_BLOCK;
- int index = id % MARS_WORKLOAD_PER_BLOCK;
+ int block;
+ int index;
- MARS_CHECK_RET(
- MARS_BITS_GET(&queue->block[block].bits[index], STATE) !=
- MARS_WORKLOAD_STATE_NONE,
- MARS_ERROR_STATE);
+ /* check function params */
+ if (!queue)
+ return MARS_ERROR_NULL;
+ if (id >= MARS_WORKLOAD_MAX)
+ return MARS_ERROR_PARAMS;
+
+ /* calculate block/index from id */
+ block = id / MARS_WORKLOAD_PER_BLOCK;
+ index = id % MARS_WORKLOAD_PER_BLOCK;
+
+ /* check for valid state */
+ if (MARS_BITS_GET(&queue->block[block].bits[index], STATE) ==
+ MARS_WORKLOAD_STATE_NONE)
+ return MARS_ERROR_STATE;
+ /* check if workload is finished */
if (MARS_BITS_GET(&queue->block[block].bits[index], STATE) !=
MARS_WORKLOAD_STATE_FINISHED)
return MARS_ERROR_BUSY;
@@ -457,20 +552,29 @@ int workload_queue_try_wait(struct mars_
int workload_queue_signal_send(struct mars_workload_queue *queue, uint16_t id)
{
- MARS_CHECK_RET(queue, MARS_ERROR_NULL);
- MARS_CHECK_RET(id < MARS_WORKLOAD_MAX, MARS_ERROR_PARAMS);
+ int block;
+ int index;
- int block = id / MARS_WORKLOAD_PER_BLOCK;
- int index = id % MARS_WORKLOAD_PER_BLOCK;
+ /* check function params */
+ if (!queue)
+ return MARS_ERROR_NULL;
+ if (id >= MARS_WORKLOAD_MAX)
+ return MARS_ERROR_PARAMS;
+
+ /* calculate block/index from id */
+ block = id / MARS_WORKLOAD_PER_BLOCK;
+ index = id % MARS_WORKLOAD_PER_BLOCK;
mars_mutex_lock((struct mars_mutex *)&queue->block[block]);
- MARS_CHECK_CLEANUP_RET(
- MARS_BITS_GET(&queue->block[block].bits[index], STATE) !=
- MARS_WORKLOAD_STATE_NONE,
- mars_mutex_unlock((struct mars_mutex *)&queue->block[block]),
- MARS_ERROR_STATE);
+ /* check for valid state */
+ if (MARS_BITS_GET(&queue->block[block].bits[index], STATE) ==
+ MARS_WORKLOAD_STATE_NONE) {
+ mars_mutex_unlock((struct mars_mutex *)&queue->block[block]);
+ return MARS_ERROR_STATE;
+ }
+ /* set signal bit on */
MARS_BITS_SET(&queue->block[block].bits[index], SIGNAL,
MARS_WORKLOAD_SIGNAL_ON);
--- a/src/mpu/kernel/mars_kernel.c
+++ b/src/mpu/kernel/mars_kernel.c
@@ -40,7 +40,6 @@
#include "mars/mars_kernel.h"
#include "mars/mars_dma.h"
#include "mars/mars_error.h"
-#include "mars/mars_debug.h"
struct mars_kernel_params kernel_params;
@@ -53,10 +52,7 @@ int main(unsigned long long mpu_context_
syscall_setup();
mars_dma_get_and_wait(&kernel_params, kernel_params_ea,
- sizeof(struct mars_kernel_params), MARS_DMA_TAG);
-
- MARS_PRINT_KERNEL_PARAMS(&kernel_params);
- MARS_PRINT("Kernel Started\n");
+ sizeof(struct mars_kernel_params), MARS_DMA_TAG);
while (!exit_flag) {
int status = scheduler();
@@ -72,7 +68,5 @@ int main(unsigned long long mpu_context_
}
}
- MARS_PRINT("Kernel Finished\n");
-
return MARS_SUCCESS;
}
--- a/src/mpu/kernel/mars_kernel_scheduler.c
+++ b/src/mpu/kernel/mars_kernel_scheduler.c
@@ -54,11 +54,11 @@ void release_workload(void);
static inline void get_block(int block, struct mars_workload_queue_block *dst)
{
mars_dma_get_and_wait(dst,
- queue_header.queue_ea +
- offsetof(struct mars_workload_queue, block) +
- sizeof(struct mars_workload_queue_block) * block,
- sizeof(struct mars_workload_queue_block),
- MARS_DMA_TAG);
+ queue_header.queue_ea +
+ offsetof(struct mars_workload_queue, block) +
+ sizeof(struct mars_workload_queue_block) * block,
+ sizeof(struct mars_workload_queue_block),
+ MARS_DMA_TAG);
}
static int search_block(int block)
@@ -147,8 +147,8 @@ static int reserve_block(int block)
{
int index;
uint64_t block_ea = queue_header.queue_ea +
- offsetof(struct mars_workload_queue, block) +
- sizeof(struct mars_workload_queue_block) * block;
+ offsetof(struct mars_workload_queue, block) +
+ sizeof(struct mars_workload_queue_block) * block;
mars_mutex_lock_get(block_ea, (struct mars_mutex *)&queue_block);
@@ -172,8 +172,8 @@ static int reserve_block(int block)
static void release_block(int block, int index)
{
uint64_t block_ea = queue_header.queue_ea +
- offsetof(struct mars_workload_queue, block) +
- sizeof(struct mars_workload_queue_block) * block;
+ offsetof(struct mars_workload_queue, block) +
+ sizeof(struct mars_workload_queue_block) * block;
mars_mutex_lock_get(block_ea, (struct mars_mutex *)&queue_block);
@@ -203,11 +203,11 @@ int reserve_workload(void)
workload_index = MARS_WORKLOAD_PER_BLOCK * block + index;
workload_type = MARS_BITS_GET(&queue_block.bits[index], TYPE);
workload_ea = queue_header.context_ea +
- workload_index * sizeof(struct mars_workload_context);
+ workload_index * sizeof(struct mars_workload_context);
/* dma the workload context code into LS from main memory */
mars_dma_get_and_wait(&workload, workload_ea,
- sizeof(struct mars_workload_context), MARS_DMA_TAG);
+ sizeof(struct mars_workload_context), MARS_DMA_TAG);
return MARS_WORKLOAD_RESERVED;
}
@@ -218,7 +218,7 @@ void release_workload(void)
int index = workload_index % MARS_WORKLOAD_PER_BLOCK;
mars_dma_put_and_wait(&workload, workload_ea,
- sizeof(struct mars_workload_context), MARS_DMA_TAG);
+ sizeof(struct mars_workload_context), MARS_DMA_TAG);
/* release block reservation */
release_block(block, index);
@@ -230,10 +230,10 @@ int scheduler(void)
/* dma in queue header */
mars_dma_get_and_wait(&queue_header,
- kernel_params.workload_queue_ea +
- offsetof(struct mars_workload_queue, header),
- sizeof(struct mars_workload_queue_header),
- MARS_DMA_TAG);
+ kernel_params.workload_queue_ea +
+ offsetof(struct mars_workload_queue, header),
+ sizeof(struct mars_workload_queue_header),
+ MARS_DMA_TAG);
/* return exit status if exit flag is set from host */
if (queue_header.flag == MARS_WORKLOAD_QUEUE_FLAG_EXIT)
--- a/src/mpu/kernel/mars_kernel_task.c
+++ b/src/mpu/kernel/mars_kernel_task.c
@@ -42,14 +42,10 @@ extern void *workload_stack;
void task_exec(struct mars_task_context *task)
{
- MARS_ASSERT(task);
-
if (!task->stack) {
/* dma the exec code into mpu storage from host storage */
mars_dma_large_get_and_wait((void *)task->vaddr,
- task->exec_ea,
- task->exec_size,
- MARS_DMA_TAG);
+ task->exec_ea, task->exec_size, MARS_DMA_TAG);
/* 0 the bss section */
memset((void *)task->vaddr + task->exec_size, 0,
@@ -65,46 +61,30 @@ void task_exec(struct mars_task_context
void task_exit(struct mars_task_context *task)
{
(void)task;
-
- MARS_ASSERT(task);
}
void task_yield(struct mars_task_context *task)
{
- MARS_ASSERT(task);
- MARS_ASSERT(task->context_save_ea);
- MARS_ASSERT(task->context_save_size);
-
/* save workload stack pointer */
task->stack = (uint32_t)workload_stack;
/* dma context into context save area in host storage */
mars_dma_large_put_and_wait((void *)task->vaddr,
- task->context_save_ea,
- task->context_save_size,
- MARS_DMA_TAG);
+ task->context_save_ea, task->context_save_size, MARS_DMA_TAG);
}
void task_resume(struct mars_task_context *task)
{
- MARS_ASSERT(task);
- MARS_ASSERT(task->context_save_ea);
- MARS_ASSERT(task->context_save_size);
-
/* restore workload stack pointer */
workload_stack = (void *)task->stack;
/* dma context to mpu storage from context save area in host storage */
mars_dma_large_get_and_wait((void *)task->vaddr,
- task->context_save_ea,
- task->context_save_size,
- MARS_DMA_TAG);
+ task->context_save_ea, task->context_save_size, MARS_DMA_TAG);
}
void task_schedule(struct mars_task_context *task, struct mars_task_args *args)
{
- MARS_ASSERT(task);
-
/* initialize task specific context variables */
task->stack = 0;
if (args)
--- a/src/mpu/kernel/mars_kernel_workload.c
+++ b/src/mpu/kernel/mars_kernel_workload.c
@@ -62,24 +62,25 @@ struct mars_workload_context *workload_g
struct mars_workload_context *workload_get_by_id(uint16_t workload_id)
{
- MARS_CHECK_RET(workload_id < MARS_WORKLOAD_MAX, NULL);
-
static struct mars_workload_context requested_workload;
uint64_t requested_workload_ea;
+ /* check function params */
+ if (workload_id >= MARS_WORKLOAD_MAX)
+ return NULL;
+
/* workload id is same as current workload so return local copy */
if (workload_id == workload_index)
return &workload;
/* get ea of workload to get */
requested_workload_ea = queue_header.context_ea +
- workload_id * sizeof(struct mars_workload_context);
+ workload_id * sizeof(struct mars_workload_context);
/* dma the workload context code into LS from main memory */
mars_dma_get_and_wait((void *)&requested_workload,
- requested_workload_ea,
- sizeof(struct mars_workload_context),
- MARS_DMA_TAG);
+ requested_workload_ea, sizeof(struct mars_workload_context),
+ MARS_DMA_TAG);
return &requested_workload;
}
@@ -146,19 +147,27 @@ void workload_resume(void)
int workload_schedule(uint16_t workload_id, void *args, uint8_t priority)
{
- MARS_CHECK_RET(workload_id < MARS_WORKLOAD_MAX, MARS_ERROR_PARAMS);
- MARS_CHECK_RET(workload_id != workload_index, MARS_ERROR_PARAMS);
-
struct mars_workload_context schedule_workload;
uint8_t schedule_workload_type;
uint64_t schedule_workload_ea;
+ uint64_t block_ea;
+ int block;
+ int index;
+
+ /* check function params */
+ if (workload_id >= MARS_WORKLOAD_MAX)
+ return MARS_ERROR_PARAMS;
+ if (workload_id == workload_index)
+ return MARS_ERROR_PARAMS;
- int block = workload_id / MARS_WORKLOAD_PER_BLOCK;
- int index = workload_id % MARS_WORKLOAD_PER_BLOCK;
-
- uint64_t block_ea = queue_header.queue_ea +
- offsetof(struct mars_workload_queue, block) +
- sizeof(struct mars_workload_queue_block) * block;
+ /* calculate block/index from id */
+ block = workload_id / MARS_WORKLOAD_PER_BLOCK;
+ index = workload_id % MARS_WORKLOAD_PER_BLOCK;
+
+ /* calculate block ea */
+ block_ea = queue_header.queue_ea +
+ offsetof(struct mars_workload_queue, block) +
+ sizeof(struct mars_workload_queue_block) * block;
mars_mutex_lock_get(block_ea, (struct mars_mutex *)&queue_block);
@@ -173,28 +182,27 @@ int workload_schedule(uint16_t workload_
/* get information of workload to schedule */
schedule_workload_type = MARS_BITS_GET(&queue_block.bits[index], TYPE);
schedule_workload_ea = queue_header.context_ea +
- workload_id * sizeof(struct mars_workload_context);
+ workload_id * sizeof(struct mars_workload_context);
/* dma the workload context code into LS from main memory */
mars_dma_get_and_wait((void *)&schedule_workload,
- schedule_workload_ea,
- sizeof(struct mars_workload_context),
- MARS_DMA_TAG);
+ schedule_workload_ea, sizeof(struct mars_workload_context),
+ MARS_DMA_TAG);
/* workload type specific handling */
switch (schedule_workload_type) {
case MARS_WORKLOAD_TYPE_TASK:
task_schedule((struct mars_task_context *)&schedule_workload,
- (struct mars_task_args *)args);
+ (struct mars_task_args *)args);
break;
}
/* dma the workload context code into main memory from LS */
mars_dma_put_and_wait((void *)&schedule_workload,
- schedule_workload_ea,
- sizeof(struct mars_workload_context),
- MARS_DMA_TAG);
+ schedule_workload_ea, sizeof(struct mars_workload_context),
+ MARS_DMA_TAG);
+ /* initialize queue block bits */
MARS_BITS_SET(&queue_block.bits[index], STATE,
MARS_WORKLOAD_STATE_READY);
MARS_BITS_SET(&queue_block.bits[index], PRIORITY,
@@ -213,15 +221,24 @@ int workload_schedule(uint16_t workload_
int workload_wait(uint16_t workload_id)
{
- MARS_CHECK_RET(workload_id < MARS_WORKLOAD_MAX, MARS_ERROR_PARAMS);
- MARS_CHECK_RET(workload_id != workload_index, MARS_ERROR_PARAMS);
-
- int block = workload_index / MARS_WORKLOAD_PER_BLOCK;
- int index = workload_index % MARS_WORKLOAD_PER_BLOCK;
+ uint64_t block_ea;
+ int block;
+ int index;
+
+ /* check function params */
+ if (workload_id >= MARS_WORKLOAD_MAX)
+ return MARS_ERROR_PARAMS;
+ if (workload_id == workload_index)
+ return MARS_ERROR_PARAMS;
- uint64_t block_ea = queue_header.queue_ea +
- offsetof(struct mars_workload_queue, block) +
- sizeof(struct mars_workload_queue_block) * block;
+ /* calculate block/index from id */
+ block = workload_index / MARS_WORKLOAD_PER_BLOCK;
+ index = workload_index % MARS_WORKLOAD_PER_BLOCK;
+
+ /* calculate block ea */
+ block_ea = queue_header.queue_ea +
+ offsetof(struct mars_workload_queue, block) +
+ sizeof(struct mars_workload_queue_block) * block;
mars_mutex_lock_get(block_ea, (struct mars_mutex *)&queue_block);
@@ -243,27 +260,38 @@ int workload_wait(uint16_t workload_id)
int workload_try_wait(uint16_t workload_id)
{
- MARS_CHECK_RET(workload_id < MARS_WORKLOAD_MAX, MARS_ERROR_PARAMS);
- MARS_CHECK_RET(workload_id != workload_index, MARS_ERROR_PARAMS);
-
- int block = workload_id / MARS_WORKLOAD_PER_BLOCK;
- int index = workload_id % MARS_WORKLOAD_PER_BLOCK;
+ uint64_t block_ea;
+ int block;
+ int index;
+
+ /* check function params */
+ if (workload_id >= MARS_WORKLOAD_MAX)
+ return MARS_ERROR_PARAMS;
+ if (workload_id == workload_index)
+ return MARS_ERROR_PARAMS;
- uint64_t block_ea = queue_header.queue_ea +
- offsetof(struct mars_workload_queue, block) +
- sizeof(struct mars_workload_queue_block) * block;
+ /* calculate block/index from id */
+ block = workload_id / MARS_WORKLOAD_PER_BLOCK;
+ index = workload_id % MARS_WORKLOAD_PER_BLOCK;
+
+ /* calculate block ea */
+ block_ea = queue_header.queue_ea +
+ offsetof(struct mars_workload_queue, block) +
+ sizeof(struct mars_workload_queue_block) * block;
mars_mutex_lock_get(block_ea, (struct mars_mutex *)&queue_block);
- MARS_CHECK_CLEANUP_RET(
- MARS_BITS_GET(&queue_block.bits[index], STATE) !=
- MARS_WORKLOAD_STATE_NONE,
+ /* check for valid state */
+ if (MARS_BITS_GET(&queue_block.bits[index], STATE) ==
+ MARS_WORKLOAD_STATE_NONE) {
mars_mutex_unlock_put(block_ea,
- (struct mars_mutex *)&queue_block),
- MARS_ERROR_STATE);
+ (struct mars_mutex *)&queue_block);
+ return MARS_ERROR_STATE;
+ }
mars_mutex_unlock_put(block_ea, (struct mars_mutex *)&queue_block);
+ /* check if workload is finished */
if (MARS_BITS_GET(&queue_block.bits[index], STATE) !=
MARS_WORKLOAD_STATE_FINISHED)
return MARS_ERROR_BUSY;
@@ -273,15 +301,24 @@ int workload_try_wait(uint16_t workload_
int workload_signal_send(uint16_t workload_id)
{
- MARS_CHECK_RET(workload_id < MARS_WORKLOAD_MAX, MARS_ERROR_PARAMS);
- MARS_CHECK_RET(workload_id != workload_index, MARS_ERROR_PARAMS);
-
- int block = workload_id / MARS_WORKLOAD_PER_BLOCK;
- int index = workload_id % MARS_WORKLOAD_PER_BLOCK;
+ uint64_t block_ea;
+ int block;
+ int index;
+
+ /* check function params */
+ if (workload_id >= MARS_WORKLOAD_MAX)
+ return MARS_ERROR_PARAMS;
+ if (workload_id == workload_index)
+ return MARS_ERROR_PARAMS;
- uint64_t block_ea = queue_header.queue_ea +
- offsetof(struct mars_workload_queue, block) +
- sizeof(struct mars_workload_queue_block) * block;
+ /* calculate block/index from id */
+ block = workload_id / MARS_WORKLOAD_PER_BLOCK;
+ index = workload_id % MARS_WORKLOAD_PER_BLOCK;
+
+ /* calculate block ea */
+ block_ea = queue_header.queue_ea +
+ offsetof(struct mars_workload_queue, block) +
+ sizeof(struct mars_workload_queue_block) * block;
mars_mutex_lock_get(block_ea, (struct mars_mutex *)&queue_block);
@@ -321,21 +358,34 @@ void workload_signal_wait(void)
int workload_signal_try_wait(void)
{
- int block = workload_index / MARS_WORKLOAD_PER_BLOCK;
- int index = workload_index % MARS_WORKLOAD_PER_BLOCK;
-
- uint64_t block_ea = queue_header.queue_ea +
- offsetof(struct mars_workload_queue, block) +
- sizeof(struct mars_workload_queue_block) * block;
+ uint64_t block_ea;
+ int block;
+ int index;
+
+ /* check function params */
+ if (workload_index >= MARS_WORKLOAD_MAX)
+ return MARS_ERROR_PARAMS;
+ if (workload_index == workload_index)
+ return MARS_ERROR_PARAMS;
+
+ /* calculate block/index from id */
+ block = workload_index / MARS_WORKLOAD_PER_BLOCK;
+ index = workload_index % MARS_WORKLOAD_PER_BLOCK;
+
+ /* calculate block ea */
+ block_ea = queue_header.queue_ea +
+ offsetof(struct mars_workload_queue, block) +
+ sizeof(struct mars_workload_queue_block) * block;
mars_mutex_lock_get(block_ea, (struct mars_mutex *)&queue_block);
- MARS_CHECK_CLEANUP_RET(
- MARS_BITS_GET(&queue_block.bits[index], STATE) !=
- MARS_WORKLOAD_STATE_NONE,
+ /* check for valid state */
+ if (MARS_BITS_GET(&queue_block.bits[index], STATE) ==
+ MARS_WORKLOAD_STATE_NONE) {
mars_mutex_unlock_put(block_ea,
- (struct mars_mutex *)&queue_block),
- MARS_ERROR_STATE);
+ (struct mars_mutex *)&queue_block);
+ return MARS_ERROR_STATE;
+ }
mars_mutex_unlock_put(block_ea, (struct mars_mutex *)&queue_block);
--- a/src/mpu/lib/Makefile.am
+++ b/src/mpu/lib/Makefile.am
@@ -72,8 +72,7 @@ pkginclude_HEADERS = \
$(srcdir)/../../../include/mpu/mars/mars_task_signal.h
EXTRA_DIST = \
- $(srcdir)/../../../include/mpu/mars/mars_dma.h \
- $(srcdir)/../../../include/mpu/mars/mars_timer.h
+ $(srcdir)/../../../include/mpu/mars/mars_dma.h
AM_CPPFLAGS = \
$(extra_cppflags) \
--- a/src/mpu/lib/mars_mutex.c
+++ b/src/mpu/lib/mars_mutex.c
@@ -40,7 +40,6 @@
#include "mars/mars_mutex.h"
#include "mars/mars_dma.h"
#include "mars/mars_error.h"
-#include "mars/mars_debug.h"
static struct mars_mutex mutex;
@@ -56,15 +55,18 @@ int mars_mutex_unlock(uint64_t mutex_ea)
int mars_mutex_lock_get(uint64_t mutex_ea, struct mars_mutex *mutex)
{
- MARS_CHECK_RET(mutex_ea, MARS_ERROR_NULL);
- MARS_CHECK_RET(mutex, MARS_ERROR_NULL);
- MARS_CHECK_RET((mutex_ea & MARS_MUTEX_ALIGN_MASK) == 0,
- MARS_ERROR_ALIGN);
- MARS_CHECK_RET(((uintptr_t)mutex & MARS_MUTEX_ALIGN_MASK) == 0,
- MARS_ERROR_ALIGN);
-
int status, mask;
+ /* check function params */
+ if (!mutex_ea)
+ return MARS_ERROR_NULL;
+ if (!mutex)
+ return MARS_ERROR_NULL;
+ if (mutex_ea & MARS_MUTEX_ALIGN_MASK)
+ return MARS_ERROR_ALIGN;
+ if ((uintptr_t)mutex & MARS_MUTEX_ALIGN_MASK)
+ return MARS_ERROR_ALIGN;
+
/* save event mask */
mask = spu_read_event_mask();
@@ -97,13 +99,17 @@ int mars_mutex_lock_get(uint64_t mutex_e
int mars_mutex_unlock_put(uint64_t mutex_ea, struct mars_mutex *mutex)
{
- MARS_CHECK_RET(mutex_ea, MARS_ERROR_NULL);
- MARS_CHECK_RET(mutex, MARS_ERROR_NULL);
- MARS_CHECK_RET((mutex_ea & MARS_MUTEX_ALIGN_MASK) == 0,
- MARS_ERROR_ALIGN);
- MARS_CHECK_RET(((uintptr_t)mutex & MARS_MUTEX_ALIGN_MASK) == 0,
- MARS_ERROR_ALIGN);
- MARS_CHECK_RET(mutex->lock == MARS_MUTEX_LOCKED, MARS_ERROR_STATE);
+ /* check function params */
+ if (!mutex_ea)
+ return MARS_ERROR_NULL;
+ if (!mutex)
+ return MARS_ERROR_NULL;
+ if (mutex_ea & MARS_MUTEX_ALIGN_MASK)
+ return MARS_ERROR_ALIGN;
+ if ((uintptr_t)mutex & MARS_MUTEX_ALIGN_MASK)
+ return MARS_ERROR_ALIGN;
+ if (mutex->lock != MARS_MUTEX_LOCKED)
+ return MARS_ERROR_STATE;
mutex->lock = MARS_MUTEX_UNLOCKED;
--- a/src/mpu/lib/mars_task.c
+++ b/src/mpu/lib/mars_task.c
@@ -39,7 +39,6 @@
#include "mars/mars_task_types.h"
#include "mars/mars_syscalls.h"
#include "mars/mars_error.h"
-#include "mars/mars_debug.h"
void mars_task_exit(int32_t exit_code)
{
@@ -57,11 +56,12 @@ int mars_task_yield(void)
{
struct mars_task_context *task;
+ /* get task context */
task = (struct mars_task_context *)mars_get_workload();
/* make sure task context has a context save area */
- MARS_CHECK_RET(task->context_save_size && task->context_save_ea,
- MARS_ERROR_FORMAT);
+ if (!task->context_save_size || !task->context_save_ea)
+ return MARS_ERROR_FORMAT;
mars_yield();
@@ -71,26 +71,32 @@ int mars_task_yield(void)
int mars_task_schedule(struct mars_task_id *id, struct mars_task_args *args,
uint8_t priority)
{
- MARS_CHECK_RET(id, MARS_ERROR_NULL);
+ /* check function params */
+ if (!id)
+ return MARS_ERROR_NULL;
return mars_schedule(id->workload_id, args, priority);
}
int mars_task_wait(struct mars_task_id *id, int32_t *exit_code)
{
- MARS_CHECK_RET(id, MARS_ERROR_NULL);
-
int ret;
struct mars_task_context *task;
+ /* check function params */
+ if (!id)
+ return MARS_ERROR_NULL;
+
+ /* get task context */
task = (struct mars_task_context *)mars_get_workload();
/* make sure task context has a context save area */
- MARS_CHECK_RET(task->context_save_size && task->context_save_ea,
- MARS_ERROR_FORMAT);
+ if (!task->context_save_size || !task->context_save_ea)
+ return MARS_ERROR_FORMAT;
ret = mars_wait(id->workload_id);
- MARS_CHECK_RET(ret == MARS_SUCCESS, ret);
+ if (ret != MARS_SUCCESS)
+ return ret;
mars_signal_wait();
@@ -98,7 +104,8 @@ int mars_task_wait(struct mars_task_id *
if (exit_code) {
task = (struct mars_task_context *)
mars_get_workload_by_id(id->workload_id);
- MARS_CHECK_RET(task, MARS_ERROR_INTERNAL);
+ if (!task)
+ return MARS_ERROR_INTERNAL;
*exit_code = task->exit_code;
}
@@ -108,19 +115,23 @@ int mars_task_wait(struct mars_task_id *
int mars_task_try_wait(struct mars_task_id *id, int32_t *exit_code)
{
- MARS_CHECK_RET(id, MARS_ERROR_NULL);
-
int ret;
struct mars_task_context *task;
+ /* check function params */
+ if (!id)
+ return MARS_ERROR_NULL;
+
ret = mars_try_wait(id->workload_id);
- MARS_CHECK_RET(ret == MARS_SUCCESS, ret);
+ if (ret != MARS_SUCCESS)
+ return ret;
/* exit code requested so get it from the task context and return it */
if (exit_code) {
task = (struct mars_task_context *)
mars_get_workload_by_id(id->workload_id);
- MARS_CHECK_RET(task, MARS_ERROR_INTERNAL);
+ if (!task)
+ return MARS_ERROR_INTERNAL;
*exit_code = task->exit_code;
}
--- a/src/mpu/lib/mars_task_barrier.c
+++ b/src/mpu/lib/mars_task_barrier.c
@@ -40,24 +40,26 @@
#include "mars/mars_syscalls.h"
#include "mars/mars_mutex.h"
#include "mars/mars_error.h"
-#include "mars/mars_debug.h"
static struct mars_task_barrier barrier;
int mars_task_barrier_notify(uint64_t barrier_ea)
{
- MARS_CHECK_RET(barrier_ea, MARS_ERROR_NULL);
- MARS_CHECK_RET((barrier_ea & MARS_TASK_BARRIER_ALIGN_MASK) == 0,
- MARS_ERROR_ALIGN);
-
int i;
struct mars_task_context *task;
+ /* check function params */
+ if (!barrier_ea)
+ return MARS_ERROR_NULL;
+ if (barrier_ea & MARS_TASK_BARRIER_ALIGN_MASK)
+ return MARS_ERROR_ALIGN;
+
+ /* get task context */
task = (struct mars_task_context *)mars_get_workload();
/* make sure task context has a context save area */
- MARS_CHECK_RET(task->context_save_size && task->context_save_ea,
- MARS_ERROR_FORMAT);
+ if (!task->context_save_size || !task->context_save_ea)
+ return MARS_ERROR_FORMAT;
mars_mutex_lock_get(barrier_ea, (struct mars_mutex *)&barrier);
@@ -69,7 +71,7 @@ int mars_task_barrier_notify(uint64_t ba
barrier.notify_wait_count++;
mars_mutex_unlock_put(barrier_ea,
- (struct mars_mutex *)&barrier);
+ (struct mars_mutex *)&barrier);
/* wait for signal */
mars_signal_wait();
@@ -95,18 +97,20 @@ int mars_task_barrier_notify(uint64_t ba
int mars_task_barrier_try_notify(uint64_t barrier_ea)
{
- MARS_CHECK_RET(barrier_ea, MARS_ERROR_NULL);
- MARS_CHECK_RET((barrier_ea & MARS_TASK_BARRIER_ALIGN_MASK) == 0,
- MARS_ERROR_ALIGN);
-
int i;
+ /* check function params */
+ if (!barrier_ea)
+ return MARS_ERROR_NULL;
+ if (barrier_ea & MARS_TASK_BARRIER_ALIGN_MASK)
+ return MARS_ERROR_ALIGN;
+
mars_mutex_lock_get(barrier_ea, (struct mars_mutex *)&barrier);
/* previous barrier wait not complete so return busy */
if (barrier.notified_count == barrier.total) {
mars_mutex_unlock_put(barrier_ea,
- (struct mars_mutex *)&barrier);
+ (struct mars_mutex *)&barrier);
return MARS_ERROR_BUSY;
}
@@ -128,26 +132,30 @@ int mars_task_barrier_try_notify(uint64_
int mars_task_barrier_wait(uint64_t barrier_ea)
{
- MARS_CHECK_RET(barrier_ea, MARS_ERROR_NULL);
- MARS_CHECK_RET((barrier_ea & MARS_TASK_BARRIER_ALIGN_MASK) == 0,
- MARS_ERROR_ALIGN);
-
int i;
struct mars_task_context *task;
+ /* check function params */
+ if (!barrier_ea)
+ return MARS_ERROR_NULL;
+ if (barrier_ea & MARS_TASK_BARRIER_ALIGN_MASK)
+ return MARS_ERROR_ALIGN;
+
+ /* get task context */
task = (struct mars_task_context *)mars_get_workload();
/* make sure task context has a context save area */
- MARS_CHECK_RET(task->context_save_size && task->context_save_ea,
- MARS_ERROR_FORMAT);
+ if (!task->context_save_size || !task->context_save_ea)
+ return MARS_ERROR_FORMAT;
mars_mutex_lock_get(barrier_ea, (struct mars_mutex *)&barrier);
/* check if barrier wait limit reached */
- MARS_CHECK_CLEANUP_RET(barrier.wait_count < barrier.total,
+ if (barrier.wait_count == barrier.total) {
mars_mutex_unlock_put(barrier_ea,
- (struct mars_mutex *)&barrier),
- MARS_ERROR_LIMIT);
+ (struct mars_mutex *)&barrier);
+ return MARS_ERROR_LIMIT;
+ }
/* not all tasks notified barrier so need to wait */
if (barrier.notified_count != barrier.total) {
@@ -156,7 +164,7 @@ int mars_task_barrier_wait(uint64_t barr
barrier.wait_count++;
mars_mutex_unlock_put(barrier_ea,
- (struct mars_mutex *)&barrier);
+ (struct mars_mutex *)&barrier);
/* wait for signal */
mars_signal_wait();
@@ -185,18 +193,20 @@ int mars_task_barrier_wait(uint64_t barr
int mars_task_barrier_try_wait(uint64_t barrier_ea)
{
- MARS_CHECK_RET(barrier_ea, MARS_ERROR_NULL);
- MARS_CHECK_RET((barrier_ea & MARS_TASK_BARRIER_ALIGN_MASK) == 0,
- MARS_ERROR_ALIGN);
-
int i;
+ /* check function params */
+ if (!barrier_ea)
+ return MARS_ERROR_NULL;
+ if (barrier_ea & MARS_TASK_BARRIER_ALIGN_MASK)
+ return MARS_ERROR_ALIGN;
+
mars_mutex_lock_get(barrier_ea, (struct mars_mutex *)&barrier);
/* not all tasks notified barrier so return busy */
if (barrier.notified_count != barrier.total) {
mars_mutex_unlock_put(barrier_ea,
- (struct mars_mutex *)&barrier);
+ (struct mars_mutex *)&barrier);
return MARS_ERROR_BUSY;
}
--- a/src/mpu/lib/mars_task_event_flag.c
+++ b/src/mpu/lib/mars_task_event_flag.c
@@ -42,15 +42,16 @@
#include "mars/mars_syscalls.h"
#include "mars/mars_mutex.h"
#include "mars/mars_error.h"
-#include "mars/mars_debug.h"
static struct mars_task_event_flag event_flag;
int mars_task_event_flag_clear(uint64_t event_flag_ea, uint32_t bits)
{
- MARS_CHECK_RET(event_flag_ea, MARS_ERROR_NULL);
- MARS_CHECK_RET((event_flag_ea & MARS_TASK_EVENT_FLAG_ALIGN_MASK) == 0,
- MARS_ERROR_ALIGN);
+ /* check function params */
+ if (!event_flag_ea)
+ return MARS_ERROR_NULL;
+ if (event_flag_ea & MARS_TASK_EVENT_FLAG_ALIGN_MASK)
+ return MARS_ERROR_ALIGN;
mars_mutex_lock_get(event_flag_ea, (struct mars_mutex *)&event_flag);
@@ -64,21 +65,23 @@ int mars_task_event_flag_clear(uint64_t
int mars_task_event_flag_set(uint64_t event_flag_ea, uint32_t bits)
{
- MARS_CHECK_RET(event_flag_ea, MARS_ERROR_NULL);
- MARS_CHECK_RET((event_flag_ea & MARS_TASK_EVENT_FLAG_ALIGN_MASK) == 0,
- MARS_ERROR_ALIGN);
-
int i;
+ /* check function params */
+ if (!event_flag_ea)
+ return MARS_ERROR_NULL;
+ if (event_flag_ea & MARS_TASK_EVENT_FLAG_ALIGN_MASK)
+ return MARS_ERROR_ALIGN;
+
mars_mutex_lock_get(event_flag_ea, (struct mars_mutex *)&event_flag);
/* check for valid direction */
- MARS_CHECK_CLEANUP_RET(
- event_flag.direction == MARS_TASK_EVENT_FLAG_MPU_TO_HOST ||
- event_flag.direction == MARS_TASK_EVENT_FLAG_MPU_TO_MPU,
+ if (event_flag.direction != MARS_TASK_EVENT_FLAG_MPU_TO_HOST &&
+ event_flag.direction != MARS_TASK_EVENT_FLAG_MPU_TO_MPU) {
mars_mutex_unlock_put(event_flag_ea,
- (struct mars_mutex *)&event_flag),
- MARS_ERROR_STATE);
+ (struct mars_mutex *)&event_flag);
+ return MARS_ERROR_STATE;
+ }
/* set the necessary bits */
event_flag.bits |= bits;
@@ -127,38 +130,41 @@ int mars_task_event_flag_wait(uint64_t e
uint32_t mask, uint8_t mask_mode,
uint32_t *bits)
{
- MARS_CHECK_RET(event_flag_ea, MARS_ERROR_NULL);
- MARS_CHECK_RET(mask_mode == MARS_TASK_EVENT_FLAG_MASK_OR ||
- mask_mode == MARS_TASK_EVENT_FLAG_MASK_AND,
- MARS_ERROR_PARAMS);
- MARS_CHECK_RET((event_flag_ea & MARS_TASK_EVENT_FLAG_ALIGN_MASK) == 0,
- MARS_ERROR_ALIGN);
-
int wait = 0;
struct mars_task_context *task;
+ /* check function params */
+ if (!event_flag_ea)
+ return MARS_ERROR_NULL;
+ if (event_flag_ea & MARS_TASK_EVENT_FLAG_ALIGN_MASK)
+ return MARS_ERROR_ALIGN;
+ if (mask_mode != MARS_TASK_EVENT_FLAG_MASK_OR &&
+ mask_mode != MARS_TASK_EVENT_FLAG_MASK_AND)
+ return MARS_ERROR_PARAMS;
+
+ /* get task context */
task = (struct mars_task_context *)mars_get_workload();
/* make sure task context has a context save area */
- MARS_CHECK_RET(task->context_save_size && task->context_save_ea,
- MARS_ERROR_FORMAT);
+ if (!task->context_save_size || !task->context_save_ea)
+ return MARS_ERROR_FORMAT;
mars_mutex_lock_get(event_flag_ea, (struct mars_mutex *)&event_flag);
/* check if event flag wait limit reached */
- MARS_CHECK_CLEANUP_RET(
- event_flag.wait_count < MARS_TASK_EVENT_FLAG_WAIT_MAX,
+ if (event_flag.wait_count == MARS_TASK_EVENT_FLAG_WAIT_MAX) {
mars_mutex_unlock_put(event_flag_ea,
- (struct mars_mutex *)&event_flag),
- MARS_ERROR_LIMIT);
+ (struct mars_mutex *)&event_flag);
+ return MARS_ERROR_LIMIT;
+ }
/* check for valid direction */
- MARS_CHECK_CLEANUP_RET(
- event_flag.direction == MARS_TASK_EVENT_FLAG_HOST_TO_MPU ||
- event_flag.direction == MARS_TASK_EVENT_FLAG_MPU_TO_MPU,
+ if (event_flag.direction != MARS_TASK_EVENT_FLAG_HOST_TO_MPU &&
+ event_flag.direction != MARS_TASK_EVENT_FLAG_MPU_TO_MPU) {
mars_mutex_unlock_put(event_flag_ea,
- (struct mars_mutex *)&event_flag),
- MARS_ERROR_STATE);
+ (struct mars_mutex *)&event_flag);
+ return MARS_ERROR_STATE;
+ }
/* check condition based on wait mode */
switch (mask_mode) {
@@ -209,22 +215,24 @@ int mars_task_event_flag_try_wait(uint64
uint32_t mask, uint8_t mask_mode,
uint32_t *bits)
{
- MARS_CHECK_RET(event_flag_ea, MARS_ERROR_NULL);
- MARS_CHECK_RET(mask_mode == MARS_TASK_EVENT_FLAG_MASK_OR ||
- mask_mode == MARS_TASK_EVENT_FLAG_MASK_AND,
- MARS_ERROR_PARAMS);
- MARS_CHECK_RET((event_flag_ea & MARS_TASK_EVENT_FLAG_ALIGN_MASK) == 0,
- MARS_ERROR_ALIGN);
+ /* check function params */
+ if (!event_flag_ea)
+ return MARS_ERROR_NULL;
+ if (event_flag_ea & MARS_TASK_EVENT_FLAG_ALIGN_MASK)
+ return MARS_ERROR_ALIGN;
+ if (mask_mode != MARS_TASK_EVENT_FLAG_MASK_OR &&
+ mask_mode != MARS_TASK_EVENT_FLAG_MASK_AND)
+ return MARS_ERROR_PARAMS;
mars_mutex_lock_get(event_flag_ea, (struct mars_mutex *)&event_flag);
/* check for valid direction */
- MARS_CHECK_CLEANUP_RET(
- event_flag.direction == MARS_TASK_EVENT_FLAG_HOST_TO_MPU ||
- event_flag.direction == MARS_TASK_EVENT_FLAG_MPU_TO_MPU,
+ if (event_flag.direction != MARS_TASK_EVENT_FLAG_HOST_TO_MPU &&
+ event_flag.direction != MARS_TASK_EVENT_FLAG_MPU_TO_MPU) {
mars_mutex_unlock_put(event_flag_ea,
- (struct mars_mutex *)&event_flag),
- MARS_ERROR_STATE);
+ (struct mars_mutex *)&event_flag);
+ return MARS_ERROR_STATE;
+ }
/* check condition based on wait mode */
switch (mask_mode) {
--- a/src/mpu/lib/mars_task_queue.c
+++ b/src/mpu/lib/mars_task_queue.c
@@ -43,16 +43,18 @@
#include "mars/mars_dma.h"
#include "mars/mars_mutex.h"
#include "mars/mars_error.h"
-#include "mars/mars_debug.h"
static struct mars_task_queue queue;
int mars_task_queue_count(uint64_t queue_ea, uint32_t *count)
{
- MARS_CHECK_RET(queue_ea, MARS_ERROR_NULL);
- MARS_CHECK_RET(count, MARS_ERROR_NULL);
- MARS_CHECK_RET((queue_ea & MARS_TASK_QUEUE_ALIGN_MASK) == 0,
- MARS_ERROR_ALIGN);
+ /* check function params */
+ if (!queue_ea)
+ return MARS_ERROR_NULL;
+ if (!count)
+ return MARS_ERROR_NULL;
+ if (queue_ea & MARS_TASK_QUEUE_ALIGN_MASK)
+ return MARS_ERROR_ALIGN;
mars_mutex_lock_get(queue_ea, (struct mars_mutex *)&queue);
@@ -66,12 +68,14 @@ int mars_task_queue_count(uint64_t queue
int mars_task_queue_clear(uint64_t queue_ea)
{
- MARS_CHECK_RET(queue_ea, MARS_ERROR_NULL);
- MARS_CHECK_RET((queue_ea & MARS_TASK_QUEUE_ALIGN_MASK) == 0,
- MARS_ERROR_ALIGN);
-
int i;
+ /* check function params */
+ if (!queue_ea)
+ return MARS_ERROR_NULL;
+ if (queue_ea & MARS_TASK_QUEUE_ALIGN_MASK)
+ return MARS_ERROR_ALIGN;
+
mars_mutex_lock_get(queue_ea, (struct mars_mutex *)&queue);
/* signal all waiting tasks that queue is ready for push */
@@ -118,21 +122,24 @@ static void push_update(void)
static int push(uint64_t queue_ea, const void *data,
int try, int begin, uint32_t tag)
{
- MARS_CHECK_RET(queue_ea, MARS_ERROR_NULL);
- MARS_CHECK_RET((queue_ea & MARS_TASK_QUEUE_ALIGN_MASK)
- == 0, MARS_ERROR_ALIGN);
- MARS_CHECK_RET(((uintptr_t)data & MARS_TASK_QUEUE_ENTRY_ALIGN_MASK)
- == 0, MARS_ERROR_ALIGN);
- MARS_CHECK_RET(tag <= MARS_DMA_TAG_MAX, MARS_ERROR_PARAMS);
+ /* check function params */
+ if (!queue_ea)
+ return MARS_ERROR_NULL;
+ if (queue_ea & MARS_TASK_QUEUE_ALIGN_MASK)
+ return MARS_ERROR_ALIGN;
+ if ((uintptr_t)data & MARS_TASK_QUEUE_ENTRY_ALIGN_MASK)
+ return MARS_ERROR_ALIGN;
+ if (tag > MARS_DMA_TAG_MAX)
+ return MARS_ERROR_PARAMS;
mars_mutex_lock_get(queue_ea, (struct mars_mutex *)&queue);
/* check for valid direction */
- MARS_CHECK_CLEANUP_RET(
- queue.direction == MARS_TASK_QUEUE_MPU_TO_HOST ||
- queue.direction == MARS_TASK_QUEUE_MPU_TO_MPU,
- mars_mutex_unlock_put(queue_ea, (struct mars_mutex *)&queue),
- MARS_ERROR_STATE);
+ if (queue.direction != MARS_TASK_QUEUE_MPU_TO_HOST &&
+ queue.direction != MARS_TASK_QUEUE_MPU_TO_MPU) {
+ mars_mutex_unlock_put(queue_ea, (struct mars_mutex *)&queue);
+ return MARS_ERROR_STATE;
+ }
/* queue is full so wait */
while (queue.count == queue.depth) {
@@ -194,10 +201,13 @@ int mars_task_queue_push_begin(uint64_t
int mars_task_queue_push_end(uint64_t queue_ea, uint32_t tag)
{
- MARS_CHECK_RET(queue_ea, MARS_ERROR_NULL);
- MARS_CHECK_RET((queue_ea & MARS_TASK_QUEUE_ALIGN_MASK)
- == 0, MARS_ERROR_ALIGN);
- MARS_CHECK_RET(tag <= MARS_DMA_TAG_MAX, MARS_ERROR_PARAMS);
+ /* check function params */
+ if (!queue_ea)
+ return MARS_ERROR_NULL;
+ if (queue_ea & MARS_TASK_QUEUE_ALIGN_MASK)
+ return MARS_ERROR_ALIGN;
+ if (tag > MARS_DMA_TAG_MAX)
+ return MARS_ERROR_PARAMS;
/* wait for dma completion */
mars_dma_wait(tag);
@@ -248,29 +258,33 @@ static void pop_update(void)
static int pop(uint64_t queue_ea, void *data,
int peek, int try, int begin, uint32_t tag)
{
- MARS_CHECK_RET(queue_ea, MARS_ERROR_NULL);
- MARS_CHECK_RET((queue_ea & MARS_TASK_QUEUE_ALIGN_MASK)
- == 0, MARS_ERROR_ALIGN);
- MARS_CHECK_RET(((uintptr_t)data & MARS_TASK_QUEUE_ENTRY_ALIGN_MASK)
- == 0, MARS_ERROR_ALIGN);
- MARS_CHECK_RET(tag <= MARS_DMA_TAG_MAX, MARS_ERROR_PARAMS);
-
struct mars_task_context *task;
+ /* check function params */
+ if (!queue_ea)
+ return MARS_ERROR_NULL;
+ if (queue_ea & MARS_TASK_QUEUE_ALIGN_MASK)
+ return MARS_ERROR_ALIGN;
+ if ((uintptr_t)data & MARS_TASK_QUEUE_ENTRY_ALIGN_MASK)
+ return MARS_ERROR_ALIGN;
+ if (tag > MARS_DMA_TAG_MAX)
+ return MARS_ERROR_PARAMS;
+
+ /* get task context */
task = (struct mars_task_context *)mars_get_workload();
/* make sure task context has a context save area */
- MARS_CHECK_RET(task->context_save_size && task->context_save_ea,
- MARS_ERROR_FORMAT);
+ if (!task->context_save_size || !task->context_save_ea)
+ return MARS_ERROR_FORMAT;
mars_mutex_lock_get(queue_ea, (struct mars_mutex *)&queue);
/* check for valid direction */
- MARS_CHECK_CLEANUP_RET(
- queue.direction == MARS_TASK_QUEUE_HOST_TO_MPU ||
- queue.direction == MARS_TASK_QUEUE_MPU_TO_MPU,
- mars_mutex_unlock_put(queue_ea, (struct mars_mutex *)&queue),
- MARS_ERROR_STATE);
+ if (queue.direction != MARS_TASK_QUEUE_HOST_TO_MPU &&
+ queue.direction != MARS_TASK_QUEUE_MPU_TO_MPU) {
+ mars_mutex_unlock_put(queue_ea, (struct mars_mutex *)&queue);
+ return MARS_ERROR_STATE;
+ }
/* queue is empty so wait */
while (!queue.count) {
@@ -332,10 +346,13 @@ int mars_task_queue_pop_begin(uint64_t q
int mars_task_queue_pop_end(uint64_t queue_ea, uint32_t tag)
{
- MARS_CHECK_RET(queue_ea, MARS_ERROR_NULL);
- MARS_CHECK_RET((queue_ea & MARS_TASK_QUEUE_ALIGN_MASK)
- == 0, MARS_ERROR_ALIGN);
- MARS_CHECK_RET(tag <= MARS_DMA_TAG_MAX, MARS_ERROR_PARAMS);
+ /* check function params */
+ if (!queue_ea)
+ return MARS_ERROR_NULL;
+ if (queue_ea & MARS_TASK_QUEUE_ALIGN_MASK)
+ return MARS_ERROR_ALIGN;
+ if (tag > MARS_DMA_TAG_MAX)
+ return MARS_ERROR_PARAMS;
/* wait for dma completion */
mars_dma_wait(tag);
@@ -370,10 +387,13 @@ int mars_task_queue_peek_begin(uint64_t
int mars_task_queue_peek_end(uint64_t queue_ea, uint32_t tag)
{
- MARS_CHECK_RET(queue_ea, MARS_ERROR_NULL);
- MARS_CHECK_RET((queue_ea & MARS_TASK_QUEUE_ALIGN_MASK)
- == 0, MARS_ERROR_ALIGN);
- MARS_CHECK_RET(tag <= MARS_DMA_TAG_MAX, MARS_ERROR_PARAMS);
+ /* check function params */
+ if (!queue_ea)
+ return MARS_ERROR_NULL;
+ if (queue_ea & MARS_TASK_QUEUE_ALIGN_MASK)
+ return MARS_ERROR_ALIGN;
+ if (tag > MARS_DMA_TAG_MAX)
+ return MARS_ERROR_PARAMS;
/* wait for dma completion */
mars_dma_wait(tag);
--- a/src/mpu/lib/mars_task_semaphore.c
+++ b/src/mpu/lib/mars_task_semaphore.c
@@ -43,32 +43,34 @@
#include "mars/mars_syscalls.h"
#include "mars/mars_mutex.h"
#include "mars/mars_error.h"
-#include "mars/mars_debug.h"
static struct mars_task_semaphore semaphore;
int mars_task_semaphore_acquire(uint64_t semaphore_ea)
{
- MARS_CHECK_RET(semaphore_ea, MARS_ERROR_NULL);
- MARS_CHECK_RET((semaphore_ea & MARS_TASK_SEMAPHORE_ALIGN_MASK) == 0,
- MARS_ERROR_ALIGN);
-
struct mars_task_context *task;
+ /* check function params */
+ if (!semaphore_ea)
+ return MARS_ERROR_NULL;
+ if (semaphore_ea & MARS_TASK_SEMAPHORE_ALIGN_MASK)
+ return MARS_ERROR_ALIGN;
+
+ /* get task context */
task = (struct mars_task_context *)mars_get_workload();
/* make sure task context has a context save area */
- MARS_CHECK_RET(task->context_save_size && task->context_save_ea,
- MARS_ERROR_FORMAT);
+ if (!task->context_save_size || !task->context_save_ea)
+ return MARS_ERROR_FORMAT;
mars_mutex_lock_get(semaphore_ea, (struct mars_mutex *)&semaphore);
/* check if semaphore wait limit reached */
- MARS_CHECK_CLEANUP_RET(
- semaphore.wait_count < MARS_TASK_SEMAPHORE_WAIT_MAX,
+ if (semaphore.wait_count == MARS_TASK_SEMAPHORE_WAIT_MAX) {
mars_mutex_unlock_put(semaphore_ea,
- (struct mars_mutex *)&semaphore),
- MARS_ERROR_LIMIT);
+ (struct mars_mutex *)&semaphore);
+ return MARS_ERROR_LIMIT;
+ }
if (semaphore.count <= 0) {
/* add id to wait list */
@@ -95,9 +97,11 @@ int mars_task_semaphore_acquire(uint64_t
int mars_task_semaphore_release(uint64_t semaphore_ea)
{
- MARS_CHECK_RET(semaphore_ea, MARS_ERROR_NULL);
- MARS_CHECK_RET((semaphore_ea & MARS_TASK_SEMAPHORE_ALIGN_MASK) == 0,
- MARS_ERROR_ALIGN);
+ /* check function params */
+ if (!semaphore_ea)
+ return MARS_ERROR_NULL;
+ if (semaphore_ea & MARS_TASK_SEMAPHORE_ALIGN_MASK)
+ return MARS_ERROR_ALIGN;
mars_mutex_lock_get(semaphore_ea, (struct mars_mutex *)&semaphore);
--- a/src/mpu/lib/mars_task_signal.c
+++ b/src/mpu/lib/mars_task_signal.c
@@ -39,11 +39,12 @@
#include "mars/mars_task_types.h"
#include "mars/mars_syscalls.h"
#include "mars/mars_error.h"
-#include "mars/mars_debug.h"
int mars_task_signal_send(struct mars_task_id *id)
{
- MARS_CHECK_RET(id, MARS_ERROR_NULL);
+ /* check function params */
+ if (!id)
+ return MARS_ERROR_NULL;
return mars_signal_send(id->workload_id);
}
@@ -52,11 +53,12 @@ int mars_task_signal_wait(void)
{
struct mars_task_context *task;
+ /* get task context */
task = (struct mars_task_context *)mars_get_workload();
/* make sure task context has a context save area */
- MARS_CHECK_RET(task->context_save_size && task->context_save_ea,
- MARS_ERROR_FORMAT);
+ if (!task->context_save_size || !task->context_save_ea)
+ return MARS_ERROR_FORMAT;
mars_signal_wait();
More information about the cbe-oss-dev
mailing list