On 28/04/2020 16:09, H.J. Lu wrote:
> On Tue, Apr 28, 2020 at 8:06 AM Jan Beulich <jbeul...@suse.com> wrote:
>> On 28.04.2020 17:00, H.J. Lu wrote:
>>> On Tue, Apr 28, 2020 at 6:41 AM Andrew Cooper <andrew.coop...@citrix.com> 
>>> wrote:
>>>> On 28/04/2020 14:00, H.J. Lu wrote:
>>>>> On Tue, Apr 28, 2020 at 5:43 AM Andrew Cooper <andrew.coop...@citrix.com> 
>>>>> wrote:
>>>>>> Hello,
>>>>>>
>>>>>> I raised https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93654 but it has
>>>>>> had nothing but tumbleweeds in months, and it is continuing to cause
>>>>>> problems for Xen.
>>>>>>
>>>>>> During the Spectre embargo period, it was specifically identified that
>>>>>> kernels would need to be able to compile one single binary, which was
>>>>>> retpoline safe on older hardware, and able to use CET on newer hardware.
>>>>>>
>>>>>> thunk-extern was deliberately constructed (along with
>>>>>> -mindirect-branch-register) such that the thunk could be turned into
>>>>>> something which wasn't a ROP gadget when hardware was less broken.  Both
>>>>>> Linux and Xen use this, with the ability to substitute the exact thunk
>>>>>> in use to be suitable for the CPU booted on.  (In particular, AMD
>>>>>> recommend `lfence; jmp *%reg` over the traditional retpoline thunk.)
>>>>>>
>>>>>>
>>>>>> A consequence of GCC rejecting this combination is that Linux has
>>>>>> unilaterally disabled -fcf-protection
>>>>>>
>>>>>> # ensure -fcf-protection is disabled when using retpoline as it is
>>>>>> # incompatible with -mindirect-branch=thunk-extern
>>>>>> ifdef CONFIG_RETPOLINE
>>>>>> KBUILD_CFLAGS += $(call cc-option,-fcf-protection=none)
>>>>>> endif
>>>>>>
>>>>>> and a change similar to this is being proposed for Xen.  However, doing
>>>>>> this will leave distros with the choice between disabling retpoline or
>>>>>> not using CET, which is not in the best security interest of the user.
>>>>>>
>>>>>> Please can the original change be partially reverted?  thunk-extern
>>>>>> means "I'm providing the thunks, and I'll take care of ensuring that
>>>>>> they are appropriate", and that includes not being a ROP gadget when CET
>>>>>> is active.
>>>>>>
>>>>> Please DO disable -fcf-protection in the kernel build.  We are enabling
>>>>> CET for the user space first.   The kernel CET will be the next.
>>>>>
>>>>> I am enclosing a proposal to make -fcf-protection compatible with 
>>>>> retpoline.
>>>>> It targets user space.  It can be made compatible with kernel.
>>>> Its fine to focus on userspace first, but the kernel is far more simple.
>>>>
>>>> Looking at that presentation, the only thing missing for kernel is the
>>>> notrack thunks, in the unlikely case that such code would be tolerated
>>>> (Frankly, I don't expect Xen or Linux to run with notrack enabled, as
>>>> there is no legacy code to be concerned with).
>>>>
>>>> What is going to happen about unbreaking this combination of options?
>>>> How will we know when kernel mode is supported (not that I can see
>>>> anything further required from the toolchain)?  I really hope you're not
>>> My proposal requires assembler, linker and compiler changes.
>>>
>>>> suggesting that we'll need to use something separate such as
>>>> -fcf-protection=magic-kernel-mode when plain -fcf-protection would do.
>>> -mcmodel=kernel should be sufficient.  If
>>>
>>> -mcmodel=kernel -fcf-protection -mindirect-branch=thunk-extern
>>>
>>> works, your toolchain has implemented my proposal.
>> But please note that Xen doesn't get built with -mcmodel=kernel, so
>> the two remaining options ought to work together also without this
>> one.
> Then
>
> -fcf-protection -mindirect-branch=thunk-extern

That's all I was asking for.

I understand and completely accept that -fcf-protection and most
-mindirect-branch options are incompatible, and rejecting those are
reasonable.

But by building with thunk-extern, I (the kernel) am taking
responsibility for providing suitable thunks.

~Andrew

P.S. It is not just Xen.  Microkernels don't tend to use -mcmodel=kernel
either.

Reply via email to