Fixes race where we'd ignore a kmsg when halting
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 31 Aug 2011 02:24:04 +0000 (19:24 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:36:06 +0000 (17:36 -0700)
commit0b83422c8c662e4f8f1f854c10d8db86437592ac
tree065ffac4f546a6fb81fe80b0aa4020365c99bf5f
parent16a868638814e9a0d355f68b7edfd2c1c1035ca4
Fixes race where we'd ignore a kmsg when halting

If an interrupt came in at the wrong time, right after PRKM returns
(more specifically, right after it turns on interrupts but after it
thought the list was empty), then we'd halt and miss the message til the
next interrupt.

To fix this, we want cpu_halt() to mean "turn on interrupts and then
halt the core, atomically".  x86 does this via some irq_handler()
hacking, though from what I've seen, "sti;hlt" won't get interrupts
before the hlt (not sure if this is intentional or not).

Other archs (sparc/riscv) will need to support similar semantics in
their cpu_halt(), as the code is now.  Alternatively (and slightly
preferred), we can shut down the core completely and have it come back
up and come in through the top of smp_idle().
kern/arch/i686/arch.h
kern/arch/i686/trap.c
kern/src/smp.c
kern/src/testing.c