Fixes x86 spinlocks with new gcc
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 14 Jan 2015 21:21:26 +0000 (13:21 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 14 Jan 2015 21:29:29 +0000 (13:29 -0800)
commit9d5a8638749a1dfe17f7c70633885d785109d6ab
treee9c5d36c88dcf08f950d612904fff0d1e233a0c9
parentdba684161574d1dc700050b304dac4770d01a909
Fixes x86 spinlocks with new gcc

Newer versions of GCC screw up our ancient spinlocks.

The issue was that "m" can include (%rax) implicitly, and GCC does not give us
a way to tell it to not use that register.  Previously, putting "eax" in the
clobber list was enough (maybe!) to tell GCC to not mess with it.  But it
really only tells GCC not to use it afterwards.  There is no way to tell it to
not use it during.  And we don't know which register they picked.  The fix is
to use a dummy variable, to force GCC to give us a register to play with.

To make things fun to track down, the location of the KMSG immediate lock in
pcpui mattered for this, since the clobber of rax's lower byte made a
diffference with how this would show up.

If we have any other inline asm with "m" in the input:output, we'll need to
take a look.

For a similar horror story, check out:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58758

Note the answer was basically "don't use inline asm."
kern/arch/x86/atomic.h