[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v6.5 20/26] x86: Protect unaware domains from meddling hyperthreads



>>> On 09.01.18 at 15:21, <andrew.cooper3@xxxxxxxxxx> wrote:
> On 04/01/18 09:59, Jan Beulich wrote:
>>>>> On 04.01.18 at 01:15, <andrew.cooper3@xxxxxxxxxx> wrote:
>>> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
>> Fundamentally (as before)
>> Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
>> However:
>>
>>> --- a/xen/arch/x86/domain.c
>>> +++ b/xen/arch/x86/domain.c
>>> @@ -2027,6 +2027,25 @@ int domain_relinquish_resources(struct domain *d)
>>>   */
>>>  void cpuid_policy_updated(struct vcpu *v)
>>>  {
>>> +    const struct cpuid_policy *cp = v->domain->arch.cpuid;
>>> +    struct msr_vcpu_policy *vp = v->arch.msr;
>>> +
>>> +    /*
>>> +     * For guests which know about IBRS but are not told about STIBP 
> running
>>> +     * on hardware supporting hyperthreading, the guest doesn't know to
>>> +     * protect itself fully.  (Such a guest won't be permitted direct 
> access
>>> +     * to the MSR.)  Have Xen fill in the gaps, so an unaware guest can't 
> be
>>> +     * interfered with by a meddling guest on an adjacent hyperthread.
>>> +     */
>>> +    if ( cp->feat.ibrsb )
>>> +    {
>>> +        if ( !cp->feat.stibp && cpu_has_stibp &&
>>> +             !(vp->spec_ctrl.guest & (SPEC_CTRL_IBRS | SPEC_CTRL_STIBP)) )
>>> +            vp->spec_ctrl.host = SPEC_CTRL_STIBP;
>>> +        else
>>> +            vp->spec_ctrl.host = vp->spec_ctrl.guest;
>> This code is so similar to ...
>>
>>> --- a/xen/arch/x86/msr.c
>>> +++ b/xen/arch/x86/msr.c
>>> @@ -181,7 +181,20 @@ int guest_wrmsr(struct vcpu *v, uint32_t msr, uint64_t 
> val)
>>>                       (cp->feat.stibp ? SPEC_CTRL_STIBP : 0)) )
>>>              goto gp_fault; /* Rsvd bit set? */
>>>          vp->spec_ctrl.guest = val;
>>> -        vp->spec_ctrl.host  = val;
>>> +
>>> +        /*
>>> +         * For guests which are not told about STIBP, running on hardware
>>> +         * supporting hyperthreading, the guest doesn't know to protect 
>>> itself
>>> +         * fully.  (Such a guest won't be permitted direct access to the 
>>> MSR.)
>>> +         * When IBRS is not in force, have Xen fill in the gaps, so an 
>>> unaware
>>> +         * guest can't be interfered with by a meddling guest on an 
>>> adjacent
>>> +         * hyperthread.
>>> +         */
>>> +        if ( !cp->feat.stibp && cpu_has_stibp &&
>>> +             !(val & (SPEC_CTRL_IBRS | SPEC_CTRL_STIBP)) )
>>> +            vp->spec_ctrl.host = SPEC_CTRL_STIBP;
>>> +        else
>>> +            vp->spec_ctrl.host = val;
>> ... this that I think a helper function would be warranted, unless you
>> have reasons to believe that future changes might break the
>> similarity.
> 
> I don't expect them to diverge, and will pull it out into a separate helper.
> 
>>
>> I'm also a little puzzled by you checking SPEC_CTRL_STIBP there -
>> this bit ought to be clear when !cp->feat.stibp due to the earlier
>> reserved bit check (part of which is even visible in context above).
>> IOW the check is not wrong, but perhaps misleading. You had
>> replied to this remark with
>>
>> "The SPEC_CTRL_STIBP check exists solely because of v3 review which
>>  objected to me implying a link between IBRS and STIPB."
> 
> The original logic was was "!cp->feat.stibp && cpu_has_stibp && val ==
> 0", which you argued would go stale as new SPEC_CTRL_ bits got added.

Ah, I recall now. But by just checking !(val & SPEC_CTRL_IBRS) you
would avoid the staleness; you might even consider putting an
ASSERT() in to validate the other bit is clear.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.