|
|
|
@ -16,6 +16,13 @@ UTASK_ARCH_SPECIFIC_DEFS
|
|
|
|
|
|
|
|
|
|
static void _init_stack(utask_t * task);
|
|
|
|
|
|
|
|
|
|
static const uint8_t _canary[4] = {
|
|
|
|
|
(UTASK_STACK_CANARY) & 0xFF,
|
|
|
|
|
(UTASK_STACK_CANARY >> 8) & 0xFF,
|
|
|
|
|
(UTASK_STACK_CANARY >> 16) & 0xFF,
|
|
|
|
|
(UTASK_STACK_CANARY >> 24) & 0xFF,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
void utask_add(utask_t * task, uintptr_t arg)
|
|
|
|
|
{
|
|
|
|
|
task->_next = task_list;
|
|
|
|
@ -43,7 +50,10 @@ void utask_run(void)
|
|
|
|
|
utask_start(task);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (*task->stack_btm != UTASK_STACK_CANARY)
|
|
|
|
|
if (task->stack[0] != _canary[0]
|
|
|
|
|
|| task->stack[1] != _canary[1]
|
|
|
|
|
|| task->stack[2] != _canary[2]
|
|
|
|
|
|| task->stack[3] != _canary[3])
|
|
|
|
|
utask_stack_overflow_cb(task);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -74,21 +84,23 @@ void utask_sleep_cb(void)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
size_t utask_stack_free_words(utask_t * task)
|
|
|
|
|
size_t utask_stack_free_bytes(utask_t * task)
|
|
|
|
|
{
|
|
|
|
|
for (uintptr_t * i = task->stack_btm; i < task->stack_top; i++)
|
|
|
|
|
for (size_t i = 0; i < task->stack_size; i++)
|
|
|
|
|
{
|
|
|
|
|
if (*i != UTASK_STACK_CANARY)
|
|
|
|
|
return i - task->stack_btm;
|
|
|
|
|
if (task->stack[i] != _canary[i & 3])
|
|
|
|
|
return i;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return task->stack_top - task->stack_btm;
|
|
|
|
|
return task->stack_size;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void _init_stack(utask_t * task)
|
|
|
|
|
{
|
|
|
|
|
for (uintptr_t * i = task->stack_btm; i < task->stack_top; i++)
|
|
|
|
|
task->stack_size = utask_fixup_stack_len(task->stack_size);
|
|
|
|
|
|
|
|
|
|
for (size_t i = 0; i < task->stack_size; i++)
|
|
|
|
|
{
|
|
|
|
|
*i = UTASK_STACK_CANARY;
|
|
|
|
|
task->stack[i] = _canary[i & 3];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|