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

Re: [Xen-devel] [PATCH v3 7/8] x86emul: support RDPRU



On 03.09.2019 14:34, Andrew Cooper wrote:
> On 03/09/2019 10:41, Jan Beulich wrote:
>> While the PM doesn't say so, this assumes that the MPERF value read this
>> way gets scaled similarly to its reading through RDMSR.
>>
>> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
> 
> This wants the following hunks merged, to at least keep the
> intercept/exit codes up to date.  This is from my alternative series
> which intercepted and terminated RDPRU with #UD.
> 
> diff --git a/xen/include/asm-x86/hvm/svm/vmcb.h
> b/xen/include/asm-x86/hvm/svm/vmcb.h
> index 5c710286f7..2bf0d50f6d 100644
> --- a/xen/include/asm-x86/hvm/svm/vmcb.h
> +++ b/xen/include/asm-x86/hvm/svm/vmcb.h
> @@ -76,7 +76,8 @@ enum GenericIntercept2bits
>      GENERAL2_INTERCEPT_MONITOR = 1 << 10,
>      GENERAL2_INTERCEPT_MWAIT   = 1 << 11,
>      GENERAL2_INTERCEPT_MWAIT_CONDITIONAL = 1 << 12,
> -    GENERAL2_INTERCEPT_XSETBV  = 1 << 13
> +    GENERAL2_INTERCEPT_XSETBV  = 1 << 13,
> +    GENERAL2_INTERCEPT_RDPRU   = 1 << 14,
>  };
> 
> 
> @@ -300,6 +301,7 @@ enum VMEXIT_EXITCODE
>      VMEXIT_MWAIT            = 139, /* 0x8b */
>      VMEXIT_MWAIT_CONDITIONAL= 140, /* 0x8c */
>      VMEXIT_XSETBV           = 141, /* 0x8d */
> +    VMEXIT_RDPRU            = 142, /* 0x8e */
>      VMEXIT_NPF              = 1024, /* 0x400, nested paging fault */
>      VMEXIT_INVALID          =  -1
>  };

I wouldn't think this belongs here, but since you ask for it, I
can fold it in.

>> --- a/xen/arch/x86/cpuid.c
>> +++ b/xen/arch/x86/cpuid.c
>> @@ -545,6 +545,11 @@ void recalculate_cpuid_policy(struct dom
>>  
>>      p->extd.maxlinaddr = p->extd.lm ? 48 : 32;
>>  
>> +    if ( p->extd.rdpru )
>> +        p->extd.rdpru_max = min(p->extd.rdpru_max, max->extd.rdpru_max);
>> +    else
>> +        p->extd.rdpru_max = 0;
>> +
>>      recalculate_xstate(p);
>>      recalculate_misc(p);
> 
> The CPUID logic needs quite a bit more than this, and to be safe on
> migrate.  For one, recalculate_xstate() unilaterally clobbers this to 0.

Oh, recalculate_misc() - yes, I see this now. And I have to admit
I don't see the migration-unsafety, so ...

> Shall I do a prep patch getting the CPUID side of things in order?

... yes, I'd appreciate you doing so.

>> --- a/xen/arch/x86/x86_emulate/x86_emulate.c
>> +++ b/xen/arch/x86/x86_emulate/x86_emulate.c
>> @@ -5670,6 +5671,52 @@ x86_emulate(
>>                  limit -= sizeof(zero);
>>              }
>>              break;
>> +
>> +        case 0xfd: /* rdpru */
>> +            vcpu_must_have(rdpru);
>> +
>> +            if ( !mode_ring0() )
>> +            {
>> +                fail_if(!ops->read_cr);
>> +                if ( (rc = ops->read_cr(4, &cr4, ctxt)) != X86EMUL_OKAY )
>> +                    goto done;
>> +                generate_exception_if(cr4 & X86_CR4_TSD, EXC_UD);
>> +            }
>> +
>> +            switch ( _regs.ecx )
>> +            {
>> +            case 0:  n = MSR_IA32_MPERF; break;
>> +            case 1:  n = MSR_IA32_APERF; break;
>> +            default: n = 0; break;
>> +            }
>> +            if ( _regs.ecx > ctxt->cpuid->extd.rdpru_max )
>> +                n = 0;
> 
> This can be folded into the switch statement.  Something like (
> _regs.ecx | -(_regs.ecx > ctxt->cpuid->extd.rdpru_max) )

Will do.

> Also, the sentinel might better be -1, which is not in a defined MSR
> block.  MSR 0 is a P5-compat MCE MSR, even on AMD hardware.

I did consider this, but decided there's a vanishingly small risk
for them to expose this MSR (and if they did we could still change
the code along the lines of what you say). A sentinel of zero is
slightly cheaper to have, after all.

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