From 4c5942fb082811f136322ec26de615cdb7e17580 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Thu, 16 Jul 2020 10:23:34 -0700 Subject: [PATCH] Add support for TLS if needed Define USE_TLS if you want TLS support from altos. Signed-off-by: Keith Packard --- src/avr/ao_arch.h | 3 +-- src/kernel/ao_task.c | 25 ++++++++++++++++++++++++- src/lpc/ao_arch_funcs.h | 3 +-- src/stm/ao_arch_funcs.h | 3 +-- src/stm32f4/ao_arch_funcs.h | 3 +-- src/stmf0/ao_arch_funcs.h | 3 +-- 6 files changed, 29 insertions(+), 11 deletions(-) diff --git a/src/avr/ao_arch.h b/src/avr/ao_arch.h index d3454f91..a8fa8583 100644 --- a/src/avr/ao_arch.h +++ b/src/avr/ao_arch.h @@ -78,9 +78,8 @@ extern uint8_t ao_cpu_sleep_disable; #define ao_arch_task_globals uint8_t ao_cpu_sleep_disable; -#define ao_arch_init_stack(task, start) \ +#define ao_arch_init_stack(task, sp, start) \ do { \ - uint8_t *sp = task->stack8 + AO_STACK_SIZE - 1; \ uint16_t a = (uint16_t) start; \ int i; \ \ diff --git a/src/kernel/ao_task.c b/src/kernel/ao_task.c index 0bc85d40..15cd2a55 100644 --- a/src/kernel/ao_task.c +++ b/src/kernel/ao_task.c @@ -24,6 +24,7 @@ #if HAS_STACK_GUARD #include #endif +#include #define DEBUG 0 @@ -289,6 +290,21 @@ ao_task_validate(void) #endif /* HAS_TASK_QUEUE */ +static inline void * +ao_stack_top(struct ao_task *task) +{ + uint8_t *top = &task->stack8[AO_STACK_SIZE]; + + /* Subtract off the TLS space, but keep the resulting + * stack 8-byte aligned + */ +#if USE_TLS + return top - ((_tls_size() + 7) & ~3); +#else + return top; +#endif +} + void ao_add_task(struct ao_task * task, void (*task_func)(void), const char *name) { @@ -310,7 +326,11 @@ ao_add_task(struct ao_task * task, void (*task_func)(void), const char *name) * Construct a stack frame so that it will 'return' * to the start of the task */ - ao_arch_init_stack(task, task_func); + uint32_t *sp = ao_stack_top(task); +#if USE_TLS + _init_tls(sp); +#endif + ao_arch_init_stack(task, sp, task_func); ao_arch_critical( #if HAS_TASK_QUEUE ao_task_init_queue(task); @@ -413,6 +433,9 @@ ao_yield(void) ao_arch_naked_define #endif #if AO_CHECK_STACK in_yield = 0; +#endif +#if USE_TLS + _set_tls(ao_stack_top(ao_cur_task)); #endif ao_arch_restore_stack(); } diff --git a/src/lpc/ao_arch_funcs.h b/src/lpc/ao_arch_funcs.h index 1368f7e5..e0280e76 100644 --- a/src/lpc/ao_arch_funcs.h +++ b/src/lpc/ao_arch_funcs.h @@ -107,9 +107,8 @@ ao_arch_memory_barrier(void) { #if HAS_TASK static inline void -ao_arch_init_stack(struct ao_task *task, void *start) +ao_arch_init_stack(struct ao_task *task, uint32_t *sp, void *start) { - uint32_t *sp = &task->stack32[AO_STACK_SIZE >> 2]; uint32_t a = (uint32_t) start; int i; diff --git a/src/stm/ao_arch_funcs.h b/src/stm/ao_arch_funcs.h index ad46ef32..5c8d990b 100644 --- a/src/stm/ao_arch_funcs.h +++ b/src/stm/ao_arch_funcs.h @@ -473,9 +473,8 @@ ao_arch_irq_check(void) { #if HAS_TASK static inline void -ao_arch_init_stack(struct ao_task *task, void *start) +ao_arch_init_stack(struct ao_task *task, uint32_t *sp, void *start) { - uint32_t *sp = &task->stack32[AO_STACK_SIZE>>2]; uint32_t a = (uint32_t) start; int i; diff --git a/src/stm32f4/ao_arch_funcs.h b/src/stm32f4/ao_arch_funcs.h index 6fa65497..74f4021b 100644 --- a/src/stm32f4/ao_arch_funcs.h +++ b/src/stm32f4/ao_arch_funcs.h @@ -82,9 +82,8 @@ ao_arch_irq_check(void) { #if HAS_TASK static inline void -ao_arch_init_stack(struct ao_task *task, void *start) +ao_arch_init_stack(struct ao_task *task, uint32_t *sp, void *start) { - uint32_t *sp = &task->stack32[AO_STACK_SIZE>>2]; uint32_t a = (uint32_t) start; int i; diff --git a/src/stmf0/ao_arch_funcs.h b/src/stmf0/ao_arch_funcs.h index 591ca8a0..190f9d17 100644 --- a/src/stmf0/ao_arch_funcs.h +++ b/src/stmf0/ao_arch_funcs.h @@ -387,9 +387,8 @@ ao_arch_memory_barrier(void) { #if HAS_TASK static inline void -ao_arch_init_stack(struct ao_task *task, void *start) +ao_arch_init_stack(struct ao_task *task, uint32_t *sp, void *start) { - uint32_t *sp = &task->stack32[AO_STACK_SIZE >> 2]; uint32_t a = (uint32_t) start; int i; -- 2.30.2