mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Josh Poimboeuf <jpoimboe@redhat.com>
To: "Jason A. Donenfeld" <Jason@zx2c4.com>
Cc: LKML <linux-kernel@vger.kernel.org>, Samuel Neves <sneves@dei.uc.pt>
Subject: Re: objtool - what if I want to clobber rbp?
Date: Tue, 21 Nov 2017 21:31:07 -0600	[thread overview]
Message-ID: <20171122033107.4jo4ricqqlopduya@treble> (raw)
In-Reply-To: <CAHmME9rrA=eYtc-npJCqdhnEnVOT78DR2eZLQTw6yKEYM8=kYw@mail.gmail.com>

On Tue, Nov 21, 2017 at 10:55:23PM +0100, Jason A. Donenfeld wrote:
> Hi Josh,
> 
> We're working on some highly optimized assembly crypto primitive
> implementations for WireGuard. The last 24 hours have been spent
> trying to make objtool happy with a variety of tricks, some more
> unfortunate than others. There's still one issue remaining, however,
> and I just can't figure out how to make it go away:
> 
> poly1305-x86_64.o: warning: objtool: poly1305_blocks_avx uses BP as a
> scratch register
> poly1305-x86_64.o: warning: objtool: poly1305_blocks_avx2 uses BP as a
> scratch register
> poly1305-x86_64.o: warning: objtool: poly1305_blocks_avx512 uses BP as
> a scratch register
> 
> The messages are right. We're using %rbp as a general purpose
> register, writing into it all sorts of crypto gibberish certainly not
> suitable for walking stack frames. It's hard to find a way of not
> using it, without incurring a speed penalty. We really do just need
> all the registers.
> 
> Of course the "problem" goes away with the new slick ORC unwinding,
> which is great. But for frame pointer unwinding, this problem remains.
> 
> I'm wondering if you can think of any clever way of marking a function
> or the like that will make this issue go away, somehow. Is there any
> path forward without sacrificing %rbp and hence performance to a
> useless frame pointer?

Hi Jason,

Unfortunately I don't have an easy answer.

The problem is that using %rbp as a scratch register isn't compatible
with CONFIG_FRAME_POINTER.  GCC doesn't do it, even on leaf functions,
and we also enforce that rule on asm code.  If your function gets
interrupted, and the interrupt handler needs to dump the stack, the
unwinder will get confused by the %rbp value and the rest of the unwind
will fail.

So, a few ideas:

- Make your feature conflict with CONFIG_FRAME_POINTER on x86_64.  The
  ORC unwinder is now the default anyway for 4.15, and we renamed the
  configs, so most people will be actively switching to ORC.

- Add some ifdefs so your code only uses %rbp as a scratch register when
  CONFIG_FRAME_POINTER is disabled.

- If one of the registers is used less often than the others, you could
  spill it to the stack.  I know you said you need all the registers,
  but I'd be willing to review the code for ideas, if that would help.
  Sometimes it helps to get fresh eyes on the problem.  We were able to
  fix this problem with all the existing crypto code without affecting
  performance measurably.  We had to get creative with a few of those.

BTW, since CONFIG_FRAME_POINTER is no longer the default and is becoming
deprecated, there has been some talk of disabling objtool with
CONFIG_FRAME_POINTER.  That would make your life easier.  However I
think we're not quite ready for that, so it might be a few more release
cycles before that happens.

-- 
Josh

  reply	other threads:[~2017-11-22  3:31 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-11-21 21:55 Jason A. Donenfeld
2017-11-22  3:31 ` Josh Poimboeuf [this message]
2017-11-22 10:23   ` Jason A. Donenfeld

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=20171122033107.4jo4ricqqlopduya@treble \
    --to=jpoimboe@redhat.com \
    --cc=Jason@zx2c4.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=sneves@dei.uc.pt \
    /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®