On Fri, May 25, 2001 at 01:49:09PM -0700, Daniel Jacobowitz wrote:
> On Fri, May 25, 2001 at 05:27:46PM -0300, Ralf Baechle wrote:
> > On Thu, May 24, 2001 at 03:42:56PM +0200, Maciej W. Rozycki wrote:
> > > > 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 22.214.171.124.2). Just being
> > > > honest
> > > > with the compiler and asking for a real memory reference does the
> > > > trick.
> > >
> > > Both "m" and "o" seem to be incorrect here as both are the same for
> > > MIPS;
> > > "R" seems to be appropriate, OTOH. Still gcc 2.95.3 doesn't handle "R"
> > > fine for all cases, but it works most of the time and emits a warning
> > > otherwise. I can't comment on 3.0.
Back to quibbling - that's just not true. For one thing, from the info
Memory reference that can be loaded with one instruction (`m'
is preferable for `asm' statements)
For another, using the patch I posted below, I get inconsistent
constraint errors. I'm not entirely sure why. Is there any reason not
to use the "m" version? I can't see any case in which it would not
Daniel Jacobowitz Debian GNU/Linux Developer
Monta Vista Software Debian Security Team