The ll/sc constructs in the kernel use ".set noat" to inhibit use of $at,
and proceed to use it themselves. This is fine, except for one problem: the
constraints on memory operands are "o" and "=o", which means offsettable
memory references. If I'm not mistaken, the assembler will (always?)
turn these into uses of $at if the offset is not 0 - at least, it certainly
seems to do that here (gcc 2.95.3, binutils 2.10.91.0.2). Just being honest
with the compiler and asking for a real memory reference does the trick.
Does this patch look right?
--
Daniel Jacobowitz Debian GNU/Linux Developer
Monta Vista Software Debian Security Team
mips-offset.diff
Description: Text document
|