From: Peter Zijlstra <peterz@infradead.org>
To: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Jann Horn <jannh@google.com>, Andy Lutomirski <luto@kernel.org>,
Thomas Gleixner <tglx@linutronix.de>,
Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>,
"H. Peter Anvin" <hpa@zytor.com>,
the arch/x86 maintainers <x86@kernel.org>,
kernel list <linux-kernel@vger.kernel.org>,
alexandre.chartre@oracle.com
Subject: Re: x86 entry perf unwinding failure (missing IRET_REGS annotation on stack switch?)
Date: Tue, 28 Apr 2020 14:46:27 +0200 [thread overview]
Message-ID: <20200428124627.GC13558@hirez.programming.kicks-ass.net> (raw)
In-Reply-To: <20200428070450.w5l5ey54dtmqy5ph@treble>
On Tue, Apr 28, 2020 at 02:04:50AM -0500, Josh Poimboeuf wrote:
> On Mon, Mar 02, 2020 at 09:52:40AM -0600, Josh Poimboeuf wrote:
> > On Mon, Mar 02, 2020 at 09:18:29AM -0600, Josh Poimboeuf wrote:
> > > > So I think on machines without X86_FEATURE_SMAP, trying to unwind from
> > > > the two NOPs at f41 and f42 will cause the unwinder to report an
> > > > error? Looking at unwind_next_frame(), "sp:(und)" without the "end:1"
> > > > marker seems to be reserved for errors.
> >
> > I think we can blame this one on Peter ;-)
> >
> > 764eef4b109a ("objtool: Rewrite alt->skip_orig")
> >
> > With X86_FEATURE_SMAP, alt->skip_orig gets set, which tells objtool to
> > skip validation of the NOPs. That has the side effect of not
> > propagating the ORC state to the NOPs as well.
>
> I almost forgot about this one, until I rediscovered it just now...
> Peter, I just realized you weren't CCed on the original email, oops.
Nah, I got them (through x86@); but I too lost track of it :/
> I'm thinking something like this should fix it. Peter, does this look
> ok?
Unfortunate. But also, I fear, insufficient. Specifically consider
things like:
ALTERNATIVE "jmp 1f",
"alt...
"..."
"...insn", X86_FEAT_foo
1:
This results in something like:
.text .altinstr_replacement
e8 xx ...
90
90
...
90
Where all our normal single byte nops (0x90) are unreachable with
undefined CFI, but the alternative might have CFI, which is never
propagated.
We ran into this with the validate_alternative stuff from Alexandre.
> @@ -773,12 +772,26 @@ static int handle_group_alt(struct objtool_file *file,
> struct instruction *last_orig_insn, *last_new_insn, *insn, *fake_jump = NULL;
> unsigned long dest_off;
>
> + /*
> + * For uaccess checking, propagate the STAC/CLAC from the alternative
> + * to the original insn to avoid paths where we see the STAC but then
> + * take the NOP instead of CLAC (and vice versa).
> + */
> + if (!orig_insn->ignore_alts && orig_insn->type == INSN_NOP &&
> + *new_insn &&
> + ((*new_insn)->type == INSN_STAC ||
> + (*new_insn)->type == INSN_CLAC))
> + orig_insn->type = (*new_insn)->type;
Also, this generates a mis-match between actual instruction text and
type. We now have a single byte instruction (0x90) with the type of a 3
byte (SLAC/CLAC). Which currently isn't a problem, but I'm looking at
adding infrastructure for having objtool rewrite instructions.
So rather than hacking around this issue, should we not make
create_orc() smarter?
I'm trying to come up with something, but so far I'm just making a mess.
next prev parent reply other threads:[~2020-04-28 12:46 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-03-01 6:02 x86 entry perf unwinding failure (missing IRET_REGS annotation on stack switch?) Jann Horn
2020-03-02 14:58 ` Peter Zijlstra
2020-03-02 15:18 ` Josh Poimboeuf
2020-03-02 15:52 ` Josh Poimboeuf
2020-04-28 7:04 ` Josh Poimboeuf
2020-04-28 12:46 ` Peter Zijlstra [this message]
2020-04-28 14:14 ` Josh Poimboeuf
2020-04-28 14:35 ` Peter Zijlstra
2020-04-28 14:16 ` Peter Zijlstra
2020-04-28 14:31 ` Josh Poimboeuf
2020-04-28 15:25 ` Peter Zijlstra
2020-04-28 15:49 ` Josh Poimboeuf
2020-04-28 15:54 ` Josh Poimboeuf
2020-04-28 16:25 ` Sean Christopherson
2020-04-28 16:33 ` Josh Poimboeuf
2020-04-28 18:28 ` Peter Zijlstra
2020-04-28 16:44 ` Peter Zijlstra
2020-04-28 17:01 ` Josh Poimboeuf
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=20200428124627.GC13558@hirez.programming.kicks-ass.net \
--to=peterz@infradead.org \
--cc=alexandre.chartre@oracle.com \
--cc=bp@alien8.de \
--cc=hpa@zytor.com \
--cc=jannh@google.com \
--cc=jpoimboe@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@kernel.org \
--cc=mingo@redhat.com \
--cc=tglx@linutronix.de \
--cc=x86@kernel.org \
/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