On 22/12/15 08:08, Shannon Zhao wrote:
> From: Shannon Zhao <shannon.z...@linaro.org>
> 
> Add access handler which gets host value of PMCEID0 or PMCEID1 when
> guest access these registers. Writing action to PMCEID0 or PMCEID1 is
> UNDEFINED.
> 
> Signed-off-by: Shannon Zhao <shannon.z...@linaro.org>
> ---
>  arch/arm64/kvm/sys_regs.c | 27 +++++++++++++++++++++++----
>  1 file changed, 23 insertions(+), 4 deletions(-)
> 
> diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
> index f9985fc..2552db1 100644
> --- a/arch/arm64/kvm/sys_regs.c
> +++ b/arch/arm64/kvm/sys_regs.c
> @@ -486,6 +486,25 @@ static bool access_pmselr(struct kvm_vcpu *vcpu, struct 
> sys_reg_params *p,
>       return true;
>  }
>  
> +static bool access_pmceid(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
> +                       const struct sys_reg_desc *r)
> +{
> +     u64 pmceid;
> +
> +     if (p->is_write) {
> +             kvm_inject_undefined(vcpu);

Just "return false", which will do the right thing.

> +     } else {
> +             if (!(p->Op2 & 1))
> +                     asm volatile("mrs %0, pmceid0_el0\n" : "=r" (pmceid));
> +             else
> +                     asm volatile("mrs %0, pmceid1_el0\n" : "=r" (pmceid));
> +
> +             p->regval = pmceid;
> +     }
> +
> +     return true;
> +}
> +
>  /* Silly macro to expand the DBG{BCR,BVR,WVR,WCR}n_EL1 registers in one go */
>  #define DBG_BCR_BVR_WCR_WVR_EL1(n)                                   \
>       /* DBGBVRn_EL1 */                                               \
> @@ -688,10 +707,10 @@ static const struct sys_reg_desc sys_reg_descs[] = {
>         access_pmselr, reset_unknown, PMSELR_EL0 },
>       /* PMCEID0_EL0 */
>       { Op0(0b11), Op1(0b011), CRn(0b1001), CRm(0b1100), Op2(0b110),
> -       trap_raz_wi },
> +       access_pmceid },
>       /* PMCEID1_EL0 */
>       { Op0(0b11), Op1(0b011), CRn(0b1001), CRm(0b1100), Op2(0b111),
> -       trap_raz_wi },
> +       access_pmceid },
>       /* PMCCNTR_EL0 */
>       { Op0(0b11), Op1(0b011), CRn(0b1001), CRm(0b1101), Op2(0b000),
>         trap_raz_wi },
> @@ -937,8 +956,8 @@ static const struct sys_reg_desc cp15_regs[] = {
>       { Op1( 0), CRn( 9), CRm(12), Op2( 2), trap_raz_wi },
>       { Op1( 0), CRn( 9), CRm(12), Op2( 3), trap_raz_wi },
>       { Op1( 0), CRn( 9), CRm(12), Op2( 5), access_pmselr },
> -     { Op1( 0), CRn( 9), CRm(12), Op2( 6), trap_raz_wi },
> -     { Op1( 0), CRn( 9), CRm(12), Op2( 7), trap_raz_wi },
> +     { Op1( 0), CRn( 9), CRm(12), Op2( 6), access_pmceid },
> +     { Op1( 0), CRn( 9), CRm(12), Op2( 7), access_pmceid },
>       { Op1( 0), CRn( 9), CRm(13), Op2( 0), trap_raz_wi },
>       { Op1( 0), CRn( 9), CRm(13), Op2( 1), trap_raz_wi },
>       { Op1( 0), CRn( 9), CRm(13), Op2( 2), trap_raz_wi },
> 

Thanks,

        M.
-- 
Jazz is not dead. It just smells funny...
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to