Am 26.05.21 um 15:55 schrieb Kevin O'Connor:
diff --git a/src/stacks.c b/src/stacks.c index 2fe1bfb..641b13f 100644 --- a/src/stacks.c +++ b/src/stacks.c @@ -549,7 +549,10 @@ __end_thread(struct thread_info *old) dprintf(1, "All threads complete.\n"); }
-// Create a new thread and start executing 'func' in it. +void VISIBLE16 check_irqs(void);
+// Create a new thread. Briefly permit irqs to occur and start +// executing 'func' in the new thread. void run_thread(void (*func)(void*), void *data) { @@ -565,6 +568,10 @@ run_thread(void (*func)(void*), void *data) thread->stackpos = (void*)thread + THREADSTACKSIZE; struct thread_info *cur = getCurThread(); hlist_add_after(&thread->node, &cur->node);
- if (cur == &MainThread)
// Permit irqs to fire
check_irqs();
Thanks. I'm concerned about running check_irqs() before starting the thread, because I'm not sure if there are code locations that are expecting an atomic handoff between calling thread and called thread. The current "threading" scheme uses cooperative multi-tasking and calling before the thread would effectively add a yield() in new locations. (In contrast, I think we can be confident that adding a yield() after the run_thread() is okay because all other "threads" are already assured to have run by that point.) If there is a concern with parity wrt yield(), we should be able to move the check_irqs() call in yield() to after the code returns to the main thread.
My only concern with calling check_irqs() after run_thread() and calling check_irqs() before switch_next() is that I can construct the following call sequence in the main thread
run_thread(background_thread_1, NULL); yield(); run_thread(background_thread_2, NULL);
where with the call to yield() and the following run_thread(), the background_thread_1 runs twice without a check_irqs() call in between. But I don't think there is such a code sequence in SeaBIOS.
It will take a few days before I can send a new patch.
With best regards, Volker
Cheers, -Kevin
asm volatile( // Start thread " pushl $1f\n" // store return pc
-- 2.26.2