From: Kevin O'Connor Date: Fri, 7 Aug 2015 20:12:02 +0000 (-0400) Subject: Move CanInterrupt check to check_irqs() X-Git-Tag: rel-1.9.0~68 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=ec52068b241ae47d7244c3dd5abb6171625ae5aa;p=seabios.git Move CanInterrupt check to check_irqs() Signed-off-by: Kevin O'Connor --- diff --git a/src/stacks.c b/src/stacks.c index 1ad9ef0..107c89e 100644 --- a/src/stacks.c +++ b/src/stacks.c @@ -661,6 +661,9 @@ fail: void VISIBLE16 check_irqs(void) { + if (!MODESEGMENT && !CanInterrupt) + // Can't enable interrupts (PIC and/or IVT not yet setup) + return; if (need_hop_back()) { extern void _cfunc16_check_irqs(void); stack_hop_back(0, 0, _cfunc16_check_irqs); @@ -674,12 +677,11 @@ void yield(void) { if (MODESEGMENT || !CONFIG_THREADS) { - if (MODESEGMENT || CanInterrupt) - check_irqs(); + check_irqs(); return; } struct thread_info *cur = getCurThread(); - if (cur == &MainThread && CanInterrupt) + if (cur == &MainThread) // Permit irqs to fire check_irqs(); @@ -702,13 +704,12 @@ wait_irq(void) void yield_toirq(void) { - if (!MODESEGMENT && have_threads()) { - // Threads still active - do a yield instead. + if (!MODESEGMENT && (have_threads() || !CanInterrupt)) { + // Threads still active or irqs not available - do a yield instead. yield(); return; } - if (MODESEGMENT || CanInterrupt) - wait_irq(); + wait_irq(); } // Wait for all threads (other than the main thread) to complete.