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


_______________________________________________
SeaBIOS mailing list -- seabios@seabios.org
To unsubscribe send an email to seabios-le...@seabios.org

Reply via email to