[llvm-dev] Status of Intel JCC Mitigations and Next Steps
Eric Christopher via llvm-dev
llvm-dev at lists.llvm.org
Wed Mar 25 13:08:26 PDT 2020
FWIW I'm with Eli here if you need any more data points.
-eric
On Tue, Mar 24, 2020 at 8:21 PM Eli Friedman via llvm-dev <
llvm-dev at lists.llvm.org> wrote:
> Changing the length of a sequence of assembly instructions will break
> someone’s code at some point. The length of a sequence of instructions is
> known, in general, and people will write code to take advantage of that.
> For example, I’ve seen assembly code using something like Duff’s device,
> except that instead of using a jump table, it just computed the destination
> as “base+n*caselength”. Given that, I don’t think it’s reasonable to hide
> this mechanism from user control.
>
>
>
> We definitely should not have any undocumented or unpredictable behavior
> in the assembler. The actual instruction bytes matter. That said, I’m not
> sure there’s a strong line between “automagic” and “explicit”, as long as
> the rules are documented.
>
>
>
> -Eli
>
>
>
> *From:* llvm-dev <llvm-dev-bounces at lists.llvm.org> *On Behalf Of *Philip
> Reames via llvm-dev
> *Sent:* Tuesday, March 24, 2020 3:55 PM
> *To:* llvm-dev <llvm-dev at lists.llvm.org>
> *Cc:* Luo, Yuanke <yuanke.luo at intel.com>; Zhang, Annita <
> annita.zhang at intel.com>; Craig Topper <craig.topper at intel.com>
> *Subject:* [EXT] [llvm-dev] Status of Intel JCC Mitigations and Next Steps
>
>
>
> TLDR - We have a choice to make about assembler support, and a
> disagreement about how to move forward. Community input needed.
>
>
>
> Background
>
> Intel has a hardware bug in Skylake and later whose mitigation requires
> padding of branches to avoid performance degradation. Background here:
> https://www.intel.com/content/dam/support/us/en/documents/processors/mitigations-jump-conditional-code-erratum.pdf
>
> We now have in tree support for alignment of such branches via nop
> padding, and limited support for padding existing instructions with either
> prefixes or larger immediate values. This has survived several days of
> dedicated testing and appears to be reasonably robust. The padding support
> applies both to branch alignment for the mitigation, but also normal align
> directives.
>
> The original patches proposed a somewhat different approach than we've
> ended up taking - primarily because of memory overhead concerns. However,
> there was also a deeper disagreement on the original review threads (D70157
> and others) which was never settled, and we seem to be at a point where
> this needs attention. In short, the question is how assembler support
> should be handled.
>
>
>
> The Choice
>
> The problematic use case comes when assembling user provided .s files.
> (Instead of the more restricted output of the compiler.) Our basic choice
> is do we want to force a new directive syntax (and thus a source code
> change to use the new feature), or attempt to automatically infer where
> it's safe to insert padding?
>
> The options as I see them:
>
> - Assembler directives w/explicit opt in - In this model, assembler
> input is assumed to only enable padding in regions where it is safe to do
> so.
> - Automagic assembler - In this model, the assembler is responsible
> for inferring where it is legal to pad without breaking user expectations.
>
> (I'll stop and disclaim that I'm strongly in favor of the former. I've
> tried to describe the pros/cons of each, but my perspective is definitely
> biased.)
>
> The difference between the two is a huge amount of complexity, and a very
> fundamental correctness risk. The basic problem is that assemblers have to
> handle unconstrained inputs, and IMO, the semantics of assembler as used in
> practice is so under specified that it's really hard to infer semantics in
> any useful way. As a couple of examples, is the fault behavior of an
> instruction well defined? Is the label near an instruction used by the
> signal handler? Is that data byte just before an instruction actually
> decoded as part of the instruction?
>
> The benefit of the later option is that existing assembly files can be
> used without modification. This is a huge advantage in terms of ease of
> mitigation for existing code bases. It's also the approach the original
> patch sets for GCC took.
>
> In the original review thread(s), I had taken the position that we should
> reject the automagic assembler based on the correctness concerns
> mentioned. I had thought the consensus in the review was clearly in that
> direction as well, but this has recently come up again. Given that, I
> wanted to open it to a wider audience.
>
>
>
> Why am I pushing for a decision now?
>
> There are two major reasons. First, there have recently been a couple of
> patches posted and landed (D76176, and D76052) building towards the
> automagic assembler variant. And second, I've started getting review
> comments (https://reviews.llvm.org/D76398#1930383) which block forward
> progress on generalized padding support assuming the automagic
> interpretation. Implementing the automatic assembler variant for prefix
> and immediate padding adds substantial complexity and I would very much
> like not to bother with if I don't have to.
>
>
>
> Current implementation details
>
> We have support in the integrated assembler only for autopadding
> suppression. This allows a LLVM based compiler to effectively apply
> padding selectively. In particular, we've instrumented lowering from MI to
> MC (X86MCInstLowering.cpp) to selectively disable padding around constructs
> which are thought to be problematic. We do not have an agreed upon syntax
> for this in assembler; the code that got checked in is modeled closely
> around the last seriously discussed variant (see below). This support is
> able to use all of the padding variants: nop, prefix, and immediate.
>
> We also have limited support in the assembler for not inserting nops
> between fragments where doing so would break known idioms. The list of
> such idioms is, IMO, ad hoc. This assembler support does not include
> prefix or immediate padding.
>
>
>
> Philip
>
> p.s. For those interested, here's roughly what the last round of assembler
> syntax I remember being discussed looked like.
>
> .autopadding
> .noautopadding
>
> These two directives would respectively enable and disable automatic
> padding of instructions within the region defined. It's presumed to be
> legal to insert nops between instructions, modify encodings, or otherwise
> adjust offsets of instruction boundaries within the region to achieve
> target specific desired alignments. Similarly, it's presumed not to be
> legal to change relative offsets outside an explicitly enabled region.
> (Except for existing cases - e.g. relaxation of branches, etc...)
>
> The assembler would provide a command line flag which conceptually wrapped
> the whole file in a pair of enable/disable directives.
>
> We'd previously discussed a variant with push/pop semantics and more fine
> grained control over alignment requests, but I believe we decided that was
> overkill in the end. (I walked away with that impression based on the
> integrated assembler work at least.)
>
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200325/4045c800/attachment.html>
More information about the llvm-dev
mailing list