Add support for TLS if needed
authorKeith Packard <keithp@keithp.com>
Thu, 16 Jul 2020 17:23:34 +0000 (10:23 -0700)
committerKeith Packard <keithp@keithp.com>
Thu, 16 Jul 2020 17:23:34 +0000 (10:23 -0700)
Define USE_TLS if you want TLS support from altos.

Signed-off-by: Keith Packard <keithp@keithp.com>
src/avr/ao_arch.h
src/kernel/ao_task.c
src/lpc/ao_arch_funcs.h
src/stm/ao_arch_funcs.h
src/stm32f4/ao_arch_funcs.h
src/stmf0/ao_arch_funcs.h

index d3454f917fc6f75aa32d5879d2d3d9a4cf821198..a8fa85836489513a00625fc3f194341644012c37 100644 (file)
@@ -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;                                      \
                                                                        \
index 0bc85d40aad2dc86c2df71ee884fb313733fbcb7..15cd2a556b68a5176732eaf3329e9eacf2490c83 100644 (file)
@@ -24,6 +24,7 @@
 #if HAS_STACK_GUARD
 #include <ao_mpu.h>
 #endif
+#include <picotls.h>
 
 #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();
 }
index 1368f7e5e883ad4b8c94adf626d9d85db7657b67..e0280e76466a2f6e4a1752478b828c743de33e6d 100644 (file)
@@ -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;
 
index ad46ef32babf9fd52b0f9d58f08fd09e6f534275..5c8d990b22a5462395735aa9134cbcbfac13c3f2 100644 (file)
@@ -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;
 
index 6fa654973842877a59325e94cd3a991e6d1750d0..74f4021b070854cf9dd0e0f10f55e03ba6b96823 100644 (file)
@@ -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;
 
index 591ca8a07576fb01a2888754d5f372fc9ab0ac47..190f9d1766ea7dbd96f1b95c9a2b6ac52c7f3061 100644 (file)
@@ -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;