From: David Woodhouse <dwmw2@infradead.org>
To: Paulius Zaleckas <paulius.zaleckas@gmail.com>,
nico@cam.org, rth@twiddle.net
Cc: nico@fluxnic.net, akpm@linux-foundation.org,
u.kleine-koenig@pengutronix.de, simon.kagstrom@netinsight.net,
linux-mtd@lists.infradead.org,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH] MTD: Fix Orion NAND driver compilation with ARM OABI
Date: Sat, 20 Mar 2010 11:58:06 +0000 [thread overview]
Message-ID: <1269086286.4028.6039.camel@macbook.infradead.org> (raw)
In-Reply-To: <badfd5ba1003200420xc0680c1h8b4cccd02a8fdaba@mail.gmail.com>
On Sat, 2010-03-20 at 13:20 +0200, Paulius Zaleckas wrote:
> On Sat, Mar 20, 2010 at 11:41 AM, David Woodhouse <dwmw2@infradead.org> wrote:
> > On Sat, 2010-03-20 at 10:55 +0200, Paulius Zaleckas wrote:
> >> - uint64_t x;
> >> + /*
> >> + * force x variable to r2/r3 registers since ldrd instruction
> >> + * requires first register to be even.
> >> + */
> >> + register uint64_t x asm ("r2");
> >> +
> >> asm volatile ("ldrd\t%0, [%1]" : "=&r" (x) : "r" (io_base));
> >
> > Hm, isn't there an asm constraint which will force it into an
> > appropriate register pair?
>
> Not that I know of...
>
> > Failing that, "=&r2,r4,r6,r8" ought to work.
>
> No, fails with error: matching constraint not valid in output operand
Hm, crap -- GCC on ARM doesn't let you give specific registers, so that
trick doesn't work.
Strictly speaking, I think your version is wrong -- although you force
the variable 'x' to be stored in r2/r3, you don't actually force GCC to
use r2/r3 as the output registers for the asm statement -- it could
happily use other registers, then move their contents into r2/r3
afterwards.
Obviously it _won't_ do that most of the time, but it _could_. GCC PR
#15089 was filed for the fact that sometimes it does, but I think Nico
was missing the point -- GCC is _allowed_ to do that, and if it makes
you sad then you should be asking for better assembly constraints which
would allow you to tell it not to.
See the __asmeq() macro in <asm/system.h> for a dirty hack which will
check which registers are used and abort at compile time, although your
compilation is going to fail anyway so I'm not sure it makes much of a
difference in this particular case.
The real fix here is to add an asm constraint to GCC which allows you to
specify "any even GPR" (or whatever's most suitable for the ldrd
instruction). Being able to give specific registers, like you can on
other architectures, would be useful too.
Please file a PR, then resubmit your patch with a comment explaining
that the code is known to be broken because GCC doesn't allow you to do
any better, and containing a reference to your PR. If people copy your
code, I want them to at least know that they're propagating a bug.
--
David Woodhouse Open Source Technology Centre
David.Woodhouse@intel.com Intel Corporation
next prev parent reply other threads:[~2010-03-20 11:58 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-03-20 8:55 Paulius Zaleckas
2010-03-20 9:41 ` David Woodhouse
2010-03-20 11:20 ` Paulius Zaleckas
2010-03-20 11:58 ` David Woodhouse [this message]
2010-03-20 14:41 ` Nicolas Pitre
2010-03-20 15:06 ` Mikael Pettersson
2010-03-20 15:37 ` Nicolas Pitre
2010-03-21 17:16 ` Jamie Lokier
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1269086286.4028.6039.camel@macbook.infradead.org \
--to=dwmw2@infradead.org \
--cc=akpm@linux-foundation.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mtd@lists.infradead.org \
--cc=nico@cam.org \
--cc=nico@fluxnic.net \
--cc=paulius.zaleckas@gmail.com \
--cc=rth@twiddle.net \
--cc=simon.kagstrom@netinsight.net \
--cc=u.kleine-koenig@pengutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®