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

Re: [Xen-devel] [PATCH v2 07/10] x86: Add Intel Processor Trace MSRs read/write emulation



>>> On 30.05.18 at 15:28, <luwei.kang@xxxxxxxxx> wrote:
> @@ -106,6 +114,105 @@ static int __init parse_ipt_params(const char *str)
>      return 0;
>  }
>  
> +int ipt_do_rdmsr(unsigned int msr, uint64_t *msr_content)
> +{
> +    const struct ipt_desc *ipt_desc = current->arch.hvm_vmx.ipt_desc;
> +    const struct cpuid_policy *p = current->domain->arch.cpuid;
> +    unsigned int index;
> +
> +    if ( !ipt_desc )
> +        return 1;
> +
> +    switch ( msr )
> +    {
> +    case MSR_IA32_RTIT_CTL:
> +        *msr_content = ipt_desc->ipt_guest.ctl;
> +        break;
> +    case MSR_IA32_RTIT_STATUS:
> +        *msr_content = ipt_desc->ipt_guest.status;
> +        break;
> +    case MSR_IA32_RTIT_OUTPUT_BASE:
> +        if ( !ipt_cap(p->ipt.raw, IPT_CAP_single_range_output) &&
> +             !ipt_cap(p->ipt.raw, IPT_CAP_topa_output) )
> +            return 1;
> +        *msr_content = ipt_desc->ipt_guest.output_base;
> +        break;
> +    case MSR_IA32_RTIT_OUTPUT_MASK:
> +        if ( !ipt_cap(p->ipt.raw, IPT_CAP_single_range_output) &&
> +             !ipt_cap(p->ipt.raw, IPT_CAP_topa_output) )
> +            return 1;
> +        *msr_content = ipt_desc->ipt_guest.output_mask |
> +                                    RTIT_OUTPUT_MASK_DEFAULT;
> +        break;
> +    case MSR_IA32_RTIT_CR3_MATCH:
> +        if ( !ipt_cap(p->ipt.raw, IPT_CAP_cr3_filter) )
> +            return 1;
> +        *msr_content = ipt_desc->ipt_guest.cr3_match;
> +        break;
> +    default:
> +     index = msr - MSR_IA32_RTIT_ADDR_A(0);

Hard tab. Also throughout both functions' switch() statements please
add blank lines between case blocks.

> +int ipt_do_wrmsr(unsigned int msr, uint64_t msr_content)
> +{
> +    struct ipt_desc *ipt_desc = current->arch.hvm_vmx.ipt_desc;
> +    const struct cpuid_policy *p = current->domain->arch.cpuid;
> +    unsigned int index;
> +
> +    if ( !ipt_desc )
> +        return 1;
> +
> +    switch ( msr )
> +    {
> +    case MSR_IA32_RTIT_CTL:
> +        ipt_desc->ipt_guest.ctl = msr_content;
> +        __vmwrite(GUEST_IA32_RTIT_CTL, msr_content);
> +        break;
> +    case MSR_IA32_RTIT_STATUS:
> +        if ( (ipt_desc->ipt_guest.ctl & RTIT_CTL_TRACEEN) ||
> +             (msr_content & MSR_IA32_RTIT_STATUS_MASK) )
> +            return 1;
> +        ipt_desc->ipt_guest.status = msr_content;
> +        break;
> +    case MSR_IA32_RTIT_OUTPUT_BASE:
> +        if ( (ipt_desc->ipt_guest.ctl & RTIT_CTL_TRACEEN) ||
> +             (msr_content &
> +                 MSR_IA32_RTIT_OUTPUT_BASE_MASK(p->extd.maxphysaddr)) ||

Indentation.

> +             (!ipt_cap(p->ipt.raw, IPT_CAP_single_range_output) &&
> +              !ipt_cap(p->ipt.raw, IPT_CAP_topa_output)) )
> +            return 1;
> +        ipt_desc->ipt_guest.output_base = msr_content;
> +        break;
> +    case MSR_IA32_RTIT_OUTPUT_MASK:
> +        if ( (ipt_desc->ipt_guest.ctl & RTIT_CTL_TRACEEN) ||
> +             (!ipt_cap(p->ipt.raw, IPT_CAP_single_range_output) &&
> +              !ipt_cap(p->ipt.raw, IPT_CAP_topa_output)) )
> +            return 1;
> +        ipt_desc->ipt_guest.output_mask = msr_content |
> +                                RTIT_OUTPUT_MASK_DEFAULT;

Again.

> +        break;
> +    case MSR_IA32_RTIT_CR3_MATCH:
> +        if ( (ipt_desc->ipt_guest.ctl & RTIT_CTL_TRACEEN) ||
> +             !ipt_cap(p->ipt.raw, IPT_CAP_cr3_filter) )
> +            return 1;
> +        ipt_desc->ipt_guest.cr3_match = msr_content;
> +        break;
> +    default:
> +        index = msr - MSR_IA32_RTIT_ADDR_A(0);
> +        if ( index >= ipt_cap(p->ipt.raw, IPT_CAP_addr_range) * 2 )
> +            return 1;
> +        ipt_desc->ipt_guest.addr[index] = msr_content;
> +    }

Please don't omit the "break;" above here (same in the other
function).

> +    return 0;
> +}

Both functions only ever return 0 or 1 - did you mean their return type
to be bool? And the perhaps better use true for success and false for
failure?

> @@ -204,3 +311,4 @@ void ipt_destroy(struct vcpu *v)
>          v->arch.hvm_vmx.ipt_desc = NULL;
>      }
>  }
> +

Stray addition of a blank line.

> --- a/xen/arch/x86/hvm/vmx/vmx.c
> +++ b/xen/arch/x86/hvm/vmx/vmx.c
> @@ -2898,6 +2898,15 @@ static int vmx_msr_read_intercept(unsigned int msr, 
> uint64_t *msr_content)
>          if ( vpmu_do_rdmsr(msr, msr_content) )
>              goto gp_fault;
>          break;
> +    case MSR_IA32_RTIT_CTL:
> +    case MSR_IA32_RTIT_STATUS:
> +    case MSR_IA32_RTIT_OUTPUT_BASE:
> +    case MSR_IA32_RTIT_OUTPUT_MASK:
> +    case MSR_IA32_RTIT_CR3_MATCH:
> +    case MSR_IA32_RTIT_ADDR_A(0) ... MSR_IA32_RTIT_ADDR_B(3):

Is the 3 here an architectural limit? Otherwise you want to use a higher
number here and rely on the callee to do the full checking.

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®.