All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christoffer Dall <christoffer.dall@linaro.org>
To: shannon.zhao@linaro.org
Cc: kvmarm@lists.cs.columbia.edu,
	linux-arm-kernel@lists.infradead.org, kvm@vger.kernel.org,
	will.deacon@arm.com, marc.zyngier@arm.com,
	alex.bennee@linaro.org, zhaoshenglong@huawei.com
Subject: Re: [PATCH 09/18] KVM: ARM64: Add reset and access handlers for PMXEVCNTR_EL0 register
Date: Fri, 17 Jul 2015 16:41:15 +0200	[thread overview]
Message-ID: <20150717144115.GS14024@cbox> (raw)
In-Reply-To: <1436149068-3784-10-git-send-email-shannon.zhao@linaro.org>

On Mon, Jul 06, 2015 at 10:17:39AM +0800, shannon.zhao@linaro.org wrote:
> From: Shannon Zhao <shannon.zhao@linaro.org>
> 
> Since the reset value of PMXEVTYPER_EL0 is UNKNOWN, use reset_unknown
> for its reset handler. Add access handler which emulates writing and
> reading PMXEVTYPER_EL0 register. When reading PMXEVCNTR_EL0, call
> perf_event_read_value to get the count value of the perf event.
> 
> Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org>
> ---
>  arch/arm64/kvm/sys_regs.c | 21 ++++++++++++++++++++-
>  include/kvm/arm_pmu.h     | 11 +++++++++++
>  virt/kvm/arm/pmu.c        | 37 +++++++++++++++++++++++++++++++++++++
>  3 files changed, 68 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
> index b4f8dd9..2bcf1a0 100644
> --- a/arch/arm64/kvm/sys_regs.c
> +++ b/arch/arm64/kvm/sys_regs.c
> @@ -356,6 +356,25 @@ static bool access_pmxevtyper(struct kvm_vcpu *vcpu,
>  	return true;
>  }
>  
> +static bool access_pmxevcntr(struct kvm_vcpu *vcpu,
> +			     const struct sys_reg_params *p,
> +			     const struct sys_reg_desc *r)
> +{
> +	unsigned long val;
> +
> +	if (p->is_write) {
> +		val = *vcpu_reg(vcpu, p->Rt);
> +		kvm_pmu_set_counter_value(vcpu, vcpu_sys_reg(vcpu, PMSELR_EL0),
> +					  val & 0xffffffffUL);
> +	} else {
> +		val = kvm_pmu_get_counter_value(vcpu,
> +						vcpu_sys_reg(vcpu, PMSELR_EL0));
> +		*vcpu_reg(vcpu, p->Rt) = val;
> +	}
> +
> +	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 */						\
> @@ -577,7 +596,7 @@ static const struct sys_reg_desc sys_reg_descs[] = {
>  	  access_pmxevtyper, reset_unknown, PMXEVTYPER_EL0 },
>  	/* PMXEVCNTR_EL0 */
>  	{ Op0(0b11), Op1(0b011), CRn(0b1001), CRm(0b1101), Op2(0b010),
> -	  trap_raz_wi },
> +	  access_pmxevcntr, reset_unknown, PMXEVCNTR_EL0 },
>  	/* PMUSERENR_EL0 */
>  	{ Op0(0b11), Op1(0b011), CRn(0b1001), CRm(0b1110), Op2(0b000),
>  	  trap_raz_wi },
> diff --git a/include/kvm/arm_pmu.h b/include/kvm/arm_pmu.h
> index 1050b24..40ab4a0 100644
> --- a/include/kvm/arm_pmu.h
> +++ b/include/kvm/arm_pmu.h
> @@ -45,11 +45,22 @@ struct kvm_pmu {
>  
>  #ifdef CONFIG_KVM_ARM_PMU
>  void kvm_pmu_vcpu_reset(struct kvm_vcpu *vcpu);
> +void kvm_pmu_set_counter_value(struct kvm_vcpu *vcpu, unsigned long select_idx,
> +			       unsigned long val);
> +unsigned long kvm_pmu_get_counter_value(struct kvm_vcpu *vcpu,
> +					unsigned long select_idx);
>  void kvm_pmu_set_counter_event_type(struct kvm_vcpu *vcpu, unsigned long data,
>  				    unsigned long select_idx);
>  void kvm_pmu_init(struct kvm_vcpu *vcpu);
>  #else
>  static inline void kvm_pmu_vcpu_reset(struct kvm_vcpu *vcpu) {}
> +void kvm_pmu_set_counter_value(struct kvm_vcpu *vcpu, unsigned long select_idx,
> +			       unsigned long val) {}
> +unsigned long kvm_pmu_get_counter_value(struct kvm_vcpu *vcpu,
> +					unsigned long select_idx)
> +{
> +	return 0;
> +}
>  void kvm_pmu_set_counter_event_type(struct kvm_vcpu *vcpu, unsigned long data,
>  				    unsigned long select_idx) {}
>  static inline void kvm_pmu_init(struct kvm_vcpu *vcpu) {}
> diff --git a/virt/kvm/arm/pmu.c b/virt/kvm/arm/pmu.c
> index 50a3c82..361fa51 100644
> --- a/virt/kvm/arm/pmu.c
> +++ b/virt/kvm/arm/pmu.c
> @@ -97,6 +97,43 @@ void kvm_pmu_vcpu_reset(struct kvm_vcpu *vcpu)
>  }
>  
>  /**
> + * kvm_pmu_set_counter_value - set PMU counter value
> + * @vcpu: The vcpu pointer
> + * @select_idx: The counter index
> + * @val: the value to be set
> + */
> +void kvm_pmu_set_counter_value(struct kvm_vcpu *vcpu, unsigned long select_idx,
> +			       unsigned long val)
> +{
> +	struct kvm_pmu *pmu = &vcpu->arch.pmu;
> +	struct kvm_pmc *pmc = &pmu->pmc[select_idx];
> +
> +	pmc->counter = val;

how does this help generate an overflow event when expected?

> +}
> +
> +/**
> + * kvm_pmu_set_counter_value - set PMU counter value

s/set/get/

> + * @vcpu: The vcpu pointer
> + * @select_idx: The counter index
> + *
> + * Call perf_event API to get the event count
> + */
> +unsigned long kvm_pmu_get_counter_value(struct kvm_vcpu *vcpu,
> +					unsigned long select_idx)
> +{
> +	u64 enabled, running;
> +	struct kvm_pmu *pmu = &vcpu->arch.pmu;
> +	struct kvm_pmc *pmc = &pmu->pmc[select_idx];
> +	unsigned long counter = pmc->counter;
> +
> +	if (pmc->perf_event) {
> +		counter += perf_event_read_value(pmc->perf_event,
> +						&enabled, &running);

I don't quite understand the summation here or feel convinced that
enabled and running should be simply thrown away.

Can you explain this, potentially in the kdocs above...

> +	}
> +	return counter;
> +}
> +
> +/**
>   * kvm_pmu_find_hw_event - find hardware event
>   * @pmu: The pmu pointer
>   * @event_select: The number of selected event type
> -- 
> 2.1.0
> 

WARNING: multiple messages have this Message-ID (diff)
From: christoffer.dall@linaro.org (Christoffer Dall)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 09/18] KVM: ARM64: Add reset and access handlers for PMXEVCNTR_EL0 register
Date: Fri, 17 Jul 2015 16:41:15 +0200	[thread overview]
Message-ID: <20150717144115.GS14024@cbox> (raw)
In-Reply-To: <1436149068-3784-10-git-send-email-shannon.zhao@linaro.org>

On Mon, Jul 06, 2015 at 10:17:39AM +0800, shannon.zhao at linaro.org wrote:
> From: Shannon Zhao <shannon.zhao@linaro.org>
> 
> Since the reset value of PMXEVTYPER_EL0 is UNKNOWN, use reset_unknown
> for its reset handler. Add access handler which emulates writing and
> reading PMXEVTYPER_EL0 register. When reading PMXEVCNTR_EL0, call
> perf_event_read_value to get the count value of the perf event.
> 
> Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org>
> ---
>  arch/arm64/kvm/sys_regs.c | 21 ++++++++++++++++++++-
>  include/kvm/arm_pmu.h     | 11 +++++++++++
>  virt/kvm/arm/pmu.c        | 37 +++++++++++++++++++++++++++++++++++++
>  3 files changed, 68 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
> index b4f8dd9..2bcf1a0 100644
> --- a/arch/arm64/kvm/sys_regs.c
> +++ b/arch/arm64/kvm/sys_regs.c
> @@ -356,6 +356,25 @@ static bool access_pmxevtyper(struct kvm_vcpu *vcpu,
>  	return true;
>  }
>  
> +static bool access_pmxevcntr(struct kvm_vcpu *vcpu,
> +			     const struct sys_reg_params *p,
> +			     const struct sys_reg_desc *r)
> +{
> +	unsigned long val;
> +
> +	if (p->is_write) {
> +		val = *vcpu_reg(vcpu, p->Rt);
> +		kvm_pmu_set_counter_value(vcpu, vcpu_sys_reg(vcpu, PMSELR_EL0),
> +					  val & 0xffffffffUL);
> +	} else {
> +		val = kvm_pmu_get_counter_value(vcpu,
> +						vcpu_sys_reg(vcpu, PMSELR_EL0));
> +		*vcpu_reg(vcpu, p->Rt) = val;
> +	}
> +
> +	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 */						\
> @@ -577,7 +596,7 @@ static const struct sys_reg_desc sys_reg_descs[] = {
>  	  access_pmxevtyper, reset_unknown, PMXEVTYPER_EL0 },
>  	/* PMXEVCNTR_EL0 */
>  	{ Op0(0b11), Op1(0b011), CRn(0b1001), CRm(0b1101), Op2(0b010),
> -	  trap_raz_wi },
> +	  access_pmxevcntr, reset_unknown, PMXEVCNTR_EL0 },
>  	/* PMUSERENR_EL0 */
>  	{ Op0(0b11), Op1(0b011), CRn(0b1001), CRm(0b1110), Op2(0b000),
>  	  trap_raz_wi },
> diff --git a/include/kvm/arm_pmu.h b/include/kvm/arm_pmu.h
> index 1050b24..40ab4a0 100644
> --- a/include/kvm/arm_pmu.h
> +++ b/include/kvm/arm_pmu.h
> @@ -45,11 +45,22 @@ struct kvm_pmu {
>  
>  #ifdef CONFIG_KVM_ARM_PMU
>  void kvm_pmu_vcpu_reset(struct kvm_vcpu *vcpu);
> +void kvm_pmu_set_counter_value(struct kvm_vcpu *vcpu, unsigned long select_idx,
> +			       unsigned long val);
> +unsigned long kvm_pmu_get_counter_value(struct kvm_vcpu *vcpu,
> +					unsigned long select_idx);
>  void kvm_pmu_set_counter_event_type(struct kvm_vcpu *vcpu, unsigned long data,
>  				    unsigned long select_idx);
>  void kvm_pmu_init(struct kvm_vcpu *vcpu);
>  #else
>  static inline void kvm_pmu_vcpu_reset(struct kvm_vcpu *vcpu) {}
> +void kvm_pmu_set_counter_value(struct kvm_vcpu *vcpu, unsigned long select_idx,
> +			       unsigned long val) {}
> +unsigned long kvm_pmu_get_counter_value(struct kvm_vcpu *vcpu,
> +					unsigned long select_idx)
> +{
> +	return 0;
> +}
>  void kvm_pmu_set_counter_event_type(struct kvm_vcpu *vcpu, unsigned long data,
>  				    unsigned long select_idx) {}
>  static inline void kvm_pmu_init(struct kvm_vcpu *vcpu) {}
> diff --git a/virt/kvm/arm/pmu.c b/virt/kvm/arm/pmu.c
> index 50a3c82..361fa51 100644
> --- a/virt/kvm/arm/pmu.c
> +++ b/virt/kvm/arm/pmu.c
> @@ -97,6 +97,43 @@ void kvm_pmu_vcpu_reset(struct kvm_vcpu *vcpu)
>  }
>  
>  /**
> + * kvm_pmu_set_counter_value - set PMU counter value
> + * @vcpu: The vcpu pointer
> + * @select_idx: The counter index
> + * @val: the value to be set
> + */
> +void kvm_pmu_set_counter_value(struct kvm_vcpu *vcpu, unsigned long select_idx,
> +			       unsigned long val)
> +{
> +	struct kvm_pmu *pmu = &vcpu->arch.pmu;
> +	struct kvm_pmc *pmc = &pmu->pmc[select_idx];
> +
> +	pmc->counter = val;

how does this help generate an overflow event when expected?

> +}
> +
> +/**
> + * kvm_pmu_set_counter_value - set PMU counter value

s/set/get/

> + * @vcpu: The vcpu pointer
> + * @select_idx: The counter index
> + *
> + * Call perf_event API to get the event count
> + */
> +unsigned long kvm_pmu_get_counter_value(struct kvm_vcpu *vcpu,
> +					unsigned long select_idx)
> +{
> +	u64 enabled, running;
> +	struct kvm_pmu *pmu = &vcpu->arch.pmu;
> +	struct kvm_pmc *pmc = &pmu->pmc[select_idx];
> +	unsigned long counter = pmc->counter;
> +
> +	if (pmc->perf_event) {
> +		counter += perf_event_read_value(pmc->perf_event,
> +						&enabled, &running);

I don't quite understand the summation here or feel convinced that
enabled and running should be simply thrown away.

Can you explain this, potentially in the kdocs above...

> +	}
> +	return counter;
> +}
> +
> +/**
>   * kvm_pmu_find_hw_event - find hardware event
>   * @pmu: The pmu pointer
>   * @event_select: The number of selected event type
> -- 
> 2.1.0
> 

  reply	other threads:[~2015-07-17 14:41 UTC|newest]

Thread overview: 98+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-06  2:17 [PATCH 00/18] KVM: ARM64: Add guest PMU support shannon.zhao
2015-07-06  2:17 ` shannon.zhao at linaro.org
2015-07-06  2:17 ` [PATCH 01/18] ARM64: Move PMU register related defines to asm/pmu.h shannon.zhao
2015-07-06  2:17   ` shannon.zhao at linaro.org
2015-07-08 17:18   ` Will Deacon
2015-07-08 17:18     ` Will Deacon
2015-07-06  2:17 ` [PATCH 02/18] KVM: ARM64: Add initial support for PMU shannon.zhao
2015-07-06  2:17   ` shannon.zhao at linaro.org
2015-07-16 18:25   ` Christoffer Dall
2015-07-16 18:25     ` Christoffer Dall
2015-07-17  8:13     ` Shannon Zhao
2015-07-17  8:13       ` Shannon Zhao
2015-07-17  9:58       ` Christoffer Dall
2015-07-17  9:58         ` Christoffer Dall
2015-07-17 11:34         ` Shannon Zhao
2015-07-17 11:34           ` Shannon Zhao
2015-07-17 12:48           ` Christoffer Dall
2015-07-17 12:48             ` Christoffer Dall
2015-07-06  2:17 ` [PATCH 03/18] KVM: ARM64: Add offset defines for PMU registers shannon.zhao
2015-07-06  2:17   ` shannon.zhao at linaro.org
2015-07-16 18:45   ` Christoffer Dall
2015-07-16 18:45     ` Christoffer Dall
2015-07-17  8:25     ` Shannon Zhao
2015-07-17  8:25       ` Shannon Zhao
2015-07-17 10:17       ` Christoffer Dall
2015-07-17 10:17         ` Christoffer Dall
2015-07-17 11:40         ` Shannon Zhao
2015-07-17 11:40           ` Shannon Zhao
2015-07-06  2:17 ` [PATCH 04/18] KVM: ARM64: Add reset and access handlers for PMCR_EL0 register shannon.zhao
2015-07-06  2:17   ` shannon.zhao at linaro.org
2015-07-16 19:55   ` Christoffer Dall
2015-07-16 19:55     ` Christoffer Dall
2015-07-17  8:45     ` Shannon Zhao
2015-07-17  8:45       ` Shannon Zhao
2015-07-17 10:21       ` Christoffer Dall
2015-07-17 10:21         ` Christoffer Dall
2015-07-21  1:16         ` Shannon Zhao
2015-07-21  1:16           ` Shannon Zhao
2015-08-03 19:39           ` Christoffer Dall
2015-08-03 19:39             ` Christoffer Dall
2015-07-06  2:17 ` [PATCH 05/18] KVM: ARM64: Add reset and access handlers for PMSELR_EL0 register shannon.zhao
2015-07-06  2:17   ` shannon.zhao at linaro.org
2015-07-06  2:17 ` [PATCH 06/18] KVM: ARM64: Add reset and access handlers for PMCEID0_EL0 and PMCEID1_EL0 register shannon.zhao
2015-07-06  2:17   ` shannon.zhao at linaro.org
2015-07-17 13:51   ` Christoffer Dall
2015-07-17 13:51     ` Christoffer Dall
2015-07-06  2:17 ` [PATCH 07/18] KVM: ARM64: PMU: Add perf event map and introduce perf event creating function shannon.zhao
2015-07-06  2:17   ` shannon.zhao at linaro.org
2015-07-17 14:30   ` Christoffer Dall
2015-07-17 14:30     ` Christoffer Dall
2015-07-21  1:35     ` Shannon Zhao
2015-07-21  1:35       ` Shannon Zhao
2015-08-03 19:55       ` Christoffer Dall
2015-08-03 19:55         ` Christoffer Dall
2015-07-06  2:17 ` [PATCH 08/18] KVM: ARM64: Add reset and access handlers for PMXEVTYPER_EL0 register shannon.zhao
2015-07-06  2:17   ` shannon.zhao at linaro.org
2015-07-06  2:17 ` [PATCH 09/18] KVM: ARM64: Add reset and access handlers for PMXEVCNTR_EL0 register shannon.zhao
2015-07-06  2:17   ` shannon.zhao at linaro.org
2015-07-17 14:41   ` Christoffer Dall [this message]
2015-07-17 14:41     ` Christoffer Dall
2015-07-06  2:17 ` [PATCH 10/18] KVM: ARM64: Add reset and access handlers for PMCCNTR_EL0 register shannon.zhao
2015-07-06  2:17   ` shannon.zhao at linaro.org
2015-07-17 14:42   ` Christoffer Dall
2015-07-17 14:42     ` Christoffer Dall
2015-07-06  2:17 ` [PATCH 11/18] KVM: ARM64: Add reset and access handlers for PMCNTENSET_EL0 and PMCNTENCLR_EL0 register shannon.zhao
2015-07-06  2:17   ` shannon.zhao at linaro.org
2015-07-17 14:52   ` Christoffer Dall
2015-07-17 14:52     ` Christoffer Dall
2015-07-06  2:17 ` [PATCH 12/18] KVM: ARM64: Add reset and access handlers for PMINTENSET_EL1 and PMINTENCLR_EL1 register shannon.zhao
2015-07-06  2:17   ` shannon.zhao at linaro.org
2015-07-17 14:56   ` Christoffer Dall
2015-07-17 14:56     ` Christoffer Dall
2015-07-06  2:17 ` [PATCH 13/18] KVM: ARM64: Add reset and access handlers for PMOVSSET_EL0 and PMOVSCLR_EL0 register shannon.zhao
2015-07-06  2:17   ` shannon.zhao at linaro.org
2015-07-17 14:59   ` Christoffer Dall
2015-07-17 14:59     ` Christoffer Dall
2015-07-17 15:02   ` Christoffer Dall
2015-07-17 15:02     ` Christoffer Dall
2015-07-06  2:17 ` [PATCH 14/18] KVM: ARM64: Add reset and access handlers for PMUSERENR_EL0 register shannon.zhao
2015-07-06  2:17   ` shannon.zhao at linaro.org
2015-07-17 15:01   ` Christoffer Dall
2015-07-17 15:01     ` Christoffer Dall
2015-07-06  2:17 ` [PATCH 15/18] KVM: ARM64: Add reset and access handlers for PMSWINC_EL0 register shannon.zhao
2015-07-06  2:17   ` shannon.zhao at linaro.org
2015-07-17 15:13   ` Christoffer Dall
2015-07-17 15:13     ` Christoffer Dall
2015-07-06  2:17 ` [PATCH 16/18] KVM: ARM64: Add access handlers for PMEVCNTRn_EL0 and PMEVTYPERn_EL0 register shannon.zhao
2015-07-06  2:17   ` shannon.zhao at linaro.org
2015-07-17 15:19   ` Christoffer Dall
2015-07-17 15:19     ` Christoffer Dall
2015-07-06  2:17 ` [PATCH 17/18] KVM: ARM64: Add PMU overflow interrupt routing shannon.zhao
2015-07-06  2:17   ` shannon.zhao at linaro.org
2015-07-17 15:28   ` Christoffer Dall
2015-07-17 15:28     ` Christoffer Dall
2015-07-06  2:17 ` [PATCH 18/18] KVM: ARM64: Add KVM_CAP_ARM_PMU and KVM_ARM_PMU_SET_IRQ shannon.zhao
2015-07-06  2:17   ` shannon.zhao at linaro.org
2015-07-17 15:32   ` Christoffer Dall
2015-07-17 15:32     ` Christoffer Dall

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150717144115.GS14024@cbox \
    --to=christoffer.dall@linaro.org \
    --cc=alex.bennee@linaro.org \
    --cc=kvm@vger.kernel.org \
    --cc=kvmarm@lists.cs.columbia.edu \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=marc.zyngier@arm.com \
    --cc=shannon.zhao@linaro.org \
    --cc=will.deacon@arm.com \
    --cc=zhaoshenglong@huawei.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.