From e922df50694959fb4872882b148dd69c407f6ec4 Mon Sep 17 00:00:00 2001 From: Andy Ross Date: Thu, 8 Feb 2018 16:07:56 -0800 Subject: [PATCH] kernel: Allow k_thread_abort(_current) from ISRs Traditionally k_thread_abort() of the current thread has done a synchronous _Swap() to the new context. Doing this from an ISR has never worked portably (some architectures can do it, some can't) for this reason. But on Xtensa/asm2, exception handlers now run in interrupt context and it's a very reasonable requirement for them to abort the excepting thread. So simply don't swap, but do the rest of the bookeeping, returning to the calling context. As a side effect it's now possible to terminate threads from interrupts, even if they have been interrupted. Signed-off-by: Andy Ross --- kernel/thread_abort.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/kernel/thread_abort.c b/kernel/thread_abort.c index fe54cda4f2c..be6485e46fa 100644 --- a/kernel/thread_abort.c +++ b/kernel/thread_abort.c @@ -37,13 +37,17 @@ void _impl_k_thread_abort(k_tid_t thread) _k_thread_single_abort(thread); _thread_monitor_exit(thread); - if (_current == thread) { - _Swap(key); - CODE_UNREACHABLE; - } + if (_is_in_isr()) { + irq_unlock(key); + } else { + if (_current == thread) { + _Swap(key); + CODE_UNREACHABLE; + } - /* The abort handler might have altered the ready queue. */ - _reschedule_threads(key); + /* The abort handler might have altered the ready queue. */ + _reschedule_threads(key); + } } #endif