|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 08/10] x86: Introduce a function to check the value of RTIT_CTL
> > Any attempt to modify IA32_RTIT_CTL while TraceEn is set will result
> > in a #GP unless the same write also clears TraceEn.
> > Writes to IA32_RTIT_CTL that do not modify any bits will not cause a
> > #GP, even if TraceEn remains set.
> > MSR write that attempts to change bits marked reserved, or utilize
> > encodings marked reserved, will cause a #GP fault.
>
> May I ask that you also add a similar code comment, perhaps ahead of the
> function definition?
Get it. Will do that.
>
> > --- a/xen/arch/x86/cpu/ipt.c
> > +++ b/xen/arch/x86/cpu/ipt.c
> > @@ -114,6 +114,114 @@ static int __init parse_ipt_params(const char *str)
> > return 0;
> > }
> >
> > +static int rtit_ctl_check(uint64_t new, uint64_t old)
>
> It looks as if again you mean the function to return boolean, so please have
> it have bool return type.
Get it.
>
> > +{
> > + const struct cpuid_policy *p = current->domain->arch.cpuid;
> > + const struct ipt_desc *ipt_desc = current->arch.hvm_vmx.ipt_desc;
> > + uint64_t rtit_ctl_mask = ~((uint64_t)0);
>
> Too many parentheses.
Here is a pointless initializer. Will fix it.
> > + */
> > + if ( new & rtit_ctl_mask )
> > + return 1;
> > +
> > + /*
> > + * Any attempt to modify IA32_RTIT_CTL while TraceEn is set will
> > + * result in a #GP unless the same write also clears TraceEn.
> > + */
> > + if ( (ipt_desc->ipt_guest.ctl & RTIT_CTL_TRACEEN) &&
> > + ((ipt_desc->ipt_guest.ctl ^ new) & ~RTIT_CTL_TRACEEN) )
>
> Why the ^ ? You only need to check whether new has the bit clear.
I mean if change any bits (set or clear, not include RTIT_CTL_TRACEEN) with PT
is enabled (RTIT_CTL_TRACEEN is set) will inject an #GP.
> Also please use "old" wherever possible, if you already have it passed into
> the function. This way it'll become obvious that the
> "nothing changed" case is already handled by the very first if().
I think also can remove "old" (decrease a function parameter) and all use
ipt_desc->ipt_guest.ctl instead.
>
> > + return 1;
> > +
> > + /*
> > + * WRMSR to IA32_RTIT_CTL that sets TraceEn but clears this bit
> > + * and FabricEn would cause #GP, if
> > + * CPUID.(EAX=14H, ECX=0):ECX.SNGLRGNOUT[bit 2] = 0
> > + */
> > + if ( (new & RTIT_CTL_TRACEEN) && !(new & RTIT_CTL_TOPA) &&
> > + !(new & RTIT_CTL_FABRIC_EN) &&
> > + !ipt_cap(p->ipt.raw, IPT_CAP_single_range_output) )
> > + return 1;
> > + /*
> > + * MTCFreq, CycThresh and PSBFreq encodings check, any MSR write that
> > + * utilize encodings marked reserved will casue a #GP fault.
> > + */
> > + val = ipt_cap(p->ipt.raw, IPT_CAP_mtc_period);
> > + if ( ipt_cap(p->ipt.raw, IPT_CAP_mtc) &&
> > + !test_bit((new & RTIT_CTL_MTC_FREQ) >>
> > + RTIT_CTL_MTC_FREQ_OFFSET, &val) )
>
> Indentation.
>
> > @@ -171,6 +279,8 @@ int ipt_do_wrmsr(unsigned int msr, uint64_t msr_content)
> > switch ( msr )
> > {
> > case MSR_IA32_RTIT_CTL:
> > + if ( rtit_ctl_check(msr_content, ipt_desc->ipt_guest.ctl) )
> > + return 1;
> > ipt_desc->ipt_guest.ctl = msr_content;
> > __vmwrite(GUEST_IA32_RTIT_CTL, msr_content);
> > break;
>
> Without this I don't see how the previous patch is complete.
What about merge this patch with patch 7 ?
Thanks,
Luwei Kang
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |