On Tue, Jan 9, 2018 at 10:52 AM, Jeff Law <l...@redhat.com> wrote:
> On 01/07/2018 05:29 PM, H.J. Lu wrote:
>> On Sun, Jan 7, 2018 at 3:36 PM, Jeff Law <l...@redhat.com> wrote:
>>> On 01/07/2018 03:58 PM, H.J. Lu wrote:
>>>> This set of patches for GCC 8 mitigates variant #2 of the speculative 
>>>> execution
>>>> vulnerabilities on x86 processors identified by CVE-2017-5715, aka 
>>>> Spectre.  They
>>>> convert indirect branches to call and return thunks to avoid speculative 
>>>> execution
>>>> via indirect call and jmp.
>>>>
>>>>
>>>> H.J. Lu (5):
>>>>   x86: Add -mindirect-branch=
>>>>   x86: Add -mindirect-branch-loop=
>>>>   x86: Add -mfunction-return=
>>>>   x86: Add -mindirect-branch-register
>>>>   x86: Add 'V' register operand modifier
>>>>
>>>>  gcc/config/i386/constraints.md                     |  12 +-
>>>>  gcc/config/i386/i386-opts.h                        |  14 +
>>>>  gcc/config/i386/i386-protos.h                      |   2 +
>>>>  gcc/config/i386/i386.c                             | 655 
>>>> ++++++++++++++++++++-
>>>>  gcc/config/i386/i386.h                             |  10 +
>>>>  gcc/config/i386/i386.md                            |  51 +-
>>>>  gcc/config/i386/i386.opt                           |  45 ++
>>>>  gcc/config/i386/predicates.md                      |  21 +-
>>>>  gcc/doc/extend.texi                                |  22 +
>>>>  gcc/doc/invoke.texi                                |  37 +-
>>> My fundamental problem with this patchkit is that it is 100% x86/x86_64
>>> specific.
>>>
>>> ISTM we want a target independent mechanism (ie, new standard patterns,
>>> options, etc) then an x86/x86_64 implementation using that target
>>> independent framework (ie, the actual implementation of those new
>>> standard patterns).
>>>
>>
>> My patch set is implemented with some constraints:
>>
>> 1. They need to be backportable to GCC 7/6/5/4.x.
>> 2. They should work with all compiler optimizations.
>> 3. They need to generate code sequences are x86 specific, which can't be
>> changed in any shape or form.  And the generated codes are quite opposite
>> to what a good optimizing compiler should generate.
>>
>> Given that these conditions, I kept existing indirect call, jump and
>> return patterns.
>> I generated different code sequences for these patterns during the final pass
>> when generating assembly codes.
>>
>> I guess that I could add a late target independent RTL pass to convert
>> indirect call, jump and return patterns to something else.  But I am not sure
>> if that is what you are looking for.
> I don't see how those constraints are incompatible with doing most of
> this work at a higher level in the compiler.  You just surround the
> resulting RTL bits with appropriate barriers to prevent them from
> getting mucked up by the optimizers.  Actually I think you're going to
> need one barrier in the middle of the sequence to keep bbro at bay
> within the sequence as a whole.
>
> It's really just a couple of new primitives to emit a jump as a call and
> one to slam in a new return address.  Given those I think you can do the
> entire implementation as RTL at expansion time and you've got a damn
> good shot at protecting most architectures from these kinds of attacks.

Doing this at RTL expansion time may not work well with RTL optimizing
paases nor IRA/LRA.  We may wind up undoing all kinds of optimizations
as well code sequences.


-- 
H.J.

Reply via email to