diff options
Diffstat (limited to 'firmware/thread.c')
-rw-r--r-- | firmware/thread.c | 25 |
1 files changed, 10 insertions, 15 deletions
diff --git a/firmware/thread.c b/firmware/thread.c index de9d05da88..c00fc36e3f 100644 --- a/firmware/thread.c +++ b/firmware/thread.c | |||
@@ -157,8 +157,8 @@ static inline void load_context(const void* addr) | |||
157 | __attribute__((always_inline)); | 157 | __attribute__((always_inline)); |
158 | 158 | ||
159 | #if NUM_CORES > 1 | 159 | #if NUM_CORES > 1 |
160 | static void thread_final_exit(struct thread_entry *current) | 160 | static void thread_final_exit_do(struct thread_entry *current) |
161 | __attribute__((noinline, noreturn)); | 161 | __attribute__((noinline, noreturn, used)); |
162 | #else | 162 | #else |
163 | static inline void thread_final_exit(struct thread_entry *current) | 163 | static inline void thread_final_exit(struct thread_entry *current) |
164 | __attribute__((always_inline, noreturn)); | 164 | __attribute__((always_inline, noreturn)); |
@@ -1675,22 +1675,16 @@ void thread_wait(unsigned int thread_id) | |||
1675 | /* This is done to foil optimizations that may require the current stack, | 1675 | /* This is done to foil optimizations that may require the current stack, |
1676 | * such as optimizing subexpressions that put variables on the stack that | 1676 | * such as optimizing subexpressions that put variables on the stack that |
1677 | * get used after switching stacks. */ | 1677 | * get used after switching stacks. */ |
1678 | static void thread_final_exit(struct thread_entry *current) | ||
1679 | { | ||
1680 | #if NUM_CORES > 1 | 1678 | #if NUM_CORES > 1 |
1681 | cpucache_flush(); | 1679 | /* Called by ASM stub */ |
1682 | 1680 | static void thread_final_exit_do(struct thread_entry *current) | |
1683 | /* Switch to the idle stack if not on the main core (where "main" | 1681 | #else |
1684 | * runs) - we can hope gcc doesn't need the old stack beyond this | 1682 | /* No special procedure is required before calling */ |
1685 | * point. */ | 1683 | static inline void thread_final_exit(struct thread_entry *current) |
1686 | if (current->core != CPU) | 1684 | #endif |
1687 | { | 1685 | { |
1688 | switch_to_idle_stack(current->core); | ||
1689 | } | ||
1690 | |||
1691 | /* At this point, this thread isn't using resources allocated for | 1686 | /* At this point, this thread isn't using resources allocated for |
1692 | * execution except the slot itself. */ | 1687 | * execution except the slot itself. */ |
1693 | #endif /* NUM_CORES */ | ||
1694 | 1688 | ||
1695 | /* Signal this thread */ | 1689 | /* Signal this thread */ |
1696 | thread_queue_wake(¤t->queue); | 1690 | thread_queue_wake(¤t->queue); |
@@ -1746,6 +1740,7 @@ void thread_exit(void) | |||
1746 | new_thread_id(current->id, current); | 1740 | new_thread_id(current->id, current); |
1747 | current->name = NULL; | 1741 | current->name = NULL; |
1748 | 1742 | ||
1743 | /* Do final cleanup and remove the thread */ | ||
1749 | thread_final_exit(current); | 1744 | thread_final_exit(current); |
1750 | } | 1745 | } |
1751 | 1746 | ||