X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=src%2Fkernel%2Fao_task.c;fp=src%2Fkernel%2Fao_task.c;h=048f5e67c6e39b58c4c0d5c633a9d77028297c10;hp=b50454167b67d70fdcea806f75ac3a21afb74b9d;hb=9ce63bf0ae9c4d0f5ae20f42684c9eba7c9d42fc;hpb=598a504f9a59612f785f1444c2bf6f453911f9f3 diff --git a/src/kernel/ao_task.c b/src/kernel/ao_task.c index b5045416..048f5e67 100644 --- a/src/kernel/ao_task.c +++ b/src/kernel/ao_task.c @@ -307,6 +307,8 @@ ao_stack_top(struct ao_task *task) #endif } +#define AO_STACK_CANARY_VALUE 0xbaadf00dU + void ao_add_task(struct ao_task * task, void (*task_func)(void), const char *name) { @@ -324,6 +326,10 @@ ao_add_task(struct ao_task * task, void (*task_func)(void), const char *name) task->task_id = task_id; task->name = name; task->wchan = NULL; +#ifdef AO_STACK_CANARY + task->bottom_canary = AO_STACK_CANARY_VALUE; + task->top_canary = AO_STACK_CANARY_VALUE; +#endif /* * Construct a stack frame so that it will 'return' * to the start of the task @@ -341,6 +347,19 @@ ao_add_task(struct ao_task * task, void (*task_func)(void), const char *name) ); } +#ifdef AO_STACK_CANARY +static void +ao_check_stack_canary(void) +{ + if (ao_cur_task->bottom_canary != AO_STACK_CANARY_VALUE) + ao_panic(AO_PANIC_STACK); + if (ao_cur_task->top_canary != AO_STACK_CANARY_VALUE) + ao_panic(AO_PANIC_STACK); +} +#else +#define ao_check_stack_canary() +#endif + uint8_t ao_task_minimize_latency; /* Task switching function. */ @@ -356,6 +375,7 @@ ao_yield(void) ao_cur_task->max_run = run; ++ao_cur_task->yields; #endif + ao_check_stack_canary(); ao_arch_save_regs(); ao_arch_save_stack(); } @@ -398,6 +418,7 @@ ao_yield(void) #if USE_TLS _set_tls(ao_stack_top(ao_cur_task)); #endif + ao_check_stack_canary(); ao_arch_restore_stack(); }