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 11/18] KVM: ARM64: Add reset and access handlers for PMCNTENSET_EL0 and PMCNTENCLR_EL0 register
Date: Fri, 17 Jul 2015 16:52:33 +0200 [thread overview]
Message-ID: <20150717145233.GU14024@cbox> (raw)
In-Reply-To: <1436149068-3784-12-git-send-email-shannon.zhao@linaro.org>
On Mon, Jul 06, 2015 at 10:17:41AM +0800, shannon.zhao@linaro.org wrote:
> From: Shannon Zhao <shannon.zhao@linaro.org>
>
> Since the reset value of PMCNTENSET_EL0 and PMCNTENCLR_EL0 is UNKNOWN,
> use reset_unknown for its reset handler. Add access handler which
> emulates writing and reading PMCNTENSET_EL0 or PMCNTENCLR_EL0 register.
> When writing to PMCNTENSET_EL0, call perf_event_enable to enable the
> perf event. When writing to PMCNTENCLR_EL0, call perf_event_disable to
> disable the perf event.
>
> Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org>
> ---
> arch/arm64/kvm/sys_regs.c | 56 +++++++++++++++++++++++++++++++++++++++++++++--
> include/kvm/arm_pmu.h | 4 ++++
> virt/kvm/arm/pmu.c | 41 ++++++++++++++++++++++++++++++++++
> 3 files changed, 99 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
> index 29883df..c14ec8d 100644
> --- a/arch/arm64/kvm/sys_regs.c
> +++ b/arch/arm64/kvm/sys_regs.c
> @@ -392,6 +392,58 @@ static bool access_pmccntr(struct kvm_vcpu *vcpu,
> return true;
> }
>
> +/* PMCNTENSET_EL0 accessor. */
> +static bool access_pmcntenset(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);
> + if (!p->is_aarch32)
> + vcpu_sys_reg(vcpu, r->reg) |= val;
> + else
> + vcpu_cp15(vcpu, r->reg) |= val & 0xffffffffUL;
> +
> + kvm_pmu_enable_counter(vcpu, val);
> + } else {
> + if (!p->is_aarch32)
> + val = vcpu_sys_reg(vcpu, r->reg);
> + else
> + val = vcpu_cp15(vcpu, r->reg);
> + *vcpu_reg(vcpu, p->Rt) = val;
> + }
> +
> + return true;
> +}
> +
> +/* PMCNTENCLR_EL0 accessor. */
> +static bool access_pmcntenclr(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);
> + if (!p->is_aarch32)
> + vcpu_sys_reg(vcpu, r->reg) |= val;
huh, this is the clear register, don't you need to &= ~val ?
also, there's a lot of code duplication between these two functions, it
must be worthwhile having a single static function that they both call
if a bool differentiating between set/clear.
> + else
> + vcpu_cp15(vcpu, r->reg) |= val & 0xffffffffUL;
> +
> + kvm_pmu_disable_counter(vcpu, val);
> + } else {
> + if (!p->is_aarch32)
> + val = vcpu_sys_reg(vcpu, r->reg);
> + else
> + val = vcpu_cp15(vcpu, r->reg);
> + *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 */ \
> @@ -586,10 +638,10 @@ static const struct sys_reg_desc sys_reg_descs[] = {
> access_pmcr, reset_pmcr_el0, PMCR_EL0, },
> /* PMCNTENSET_EL0 */
> { Op0(0b11), Op1(0b011), CRn(0b1001), CRm(0b1100), Op2(0b001),
> - trap_raz_wi },
> + access_pmcntenset, reset_unknown, PMCNTENSET_EL0 },
> /* PMCNTENCLR_EL0 */
> { Op0(0b11), Op1(0b011), CRn(0b1001), CRm(0b1100), Op2(0b010),
> - trap_raz_wi },
> + access_pmcntenclr, reset_unknown, PMCNTENCLR_EL0 },
> /* PMOVSCLR_EL0 */
> { Op0(0b11), Op1(0b011), CRn(0b1001), CRm(0b1100), Op2(0b011),
> trap_raz_wi },
> diff --git a/include/kvm/arm_pmu.h b/include/kvm/arm_pmu.h
> index 40ab4a0..2cfd9be 100644
> --- a/include/kvm/arm_pmu.h
> +++ b/include/kvm/arm_pmu.h
> @@ -49,6 +49,8 @@ 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_disable_counter(struct kvm_vcpu *vcpu, unsigned long val);
> +void kvm_pmu_enable_counter(struct kvm_vcpu *vcpu, unsigned long val);
> 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);
> @@ -61,6 +63,8 @@ unsigned long kvm_pmu_get_counter_value(struct kvm_vcpu *vcpu,
> {
> return 0;
> }
> +void kvm_pmu_disable_counter(struct kvm_vcpu *vcpu, unsigned long val) {}
> +void kvm_pmu_enable_counter(struct kvm_vcpu *vcpu, unsigned long val) {}
> 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 361fa51..cf59998 100644
> --- a/virt/kvm/arm/pmu.c
> +++ b/virt/kvm/arm/pmu.c
> @@ -134,6 +134,47 @@ unsigned long kvm_pmu_get_counter_value(struct kvm_vcpu *vcpu,
> }
>
> /**
> + * kvm_pmu_enable_counter - enable selected PMU counter
> + * @vcpu: The vcpu pointer
> + * @val: the value guest writes to PMCNTENSET_EL0 register
> + *
> + * Call perf_event_enable to start counting the perf event
> + */
> +void kvm_pmu_enable_counter(struct kvm_vcpu *vcpu, unsigned long val)
> +{
> + int select_idx = find_first_bit(&val, 32);
Both of these functions should be able to handle more than one bit set
in val though, right?
Or perhaps you should make the parameter be select_idx and loop over the
bits in the caller, your choice.
> + struct kvm_pmu *pmu = &vcpu->arch.pmu;
> + struct kvm_pmc *pmc = &pmu->pmc[select_idx];
> +
> + if (pmc->perf_event) {
> + local64_set(&pmc->perf_event->count, 0);
why local64_set? Is this local to this CPU somehow?
why do we clear the count? Is it architecturally mandated?
> + perf_event_enable(pmc->perf_event);
> + if (pmc->perf_event->state != PERF_EVENT_STATE_ACTIVE)
> + printk("kvm: fail to enable event\n");
do you really want this print here? What could cause this error,
anything the VM can provoke?
> + }
what's the difference between having pmc->perf_event == NULL and having
pmc->perf_event->state == PERF_EVENT_STATE_INACTIVE ?
> + pmc->enable = true;
> +}
> +
> +/**
> + * kvm_pmu_disable_counter - disable selected PMU counter
> + * @vcpu: The vcpu pointer
> + * @val: the value guest writes to PMCNTENCLR_EL0 register
> + *
> + * Call perf_event_disable to stop counting the perf event
> + */
> +void kvm_pmu_disable_counter(struct kvm_vcpu *vcpu, unsigned long val)
> +{
> + int select_idx = find_first_bit(&val, 32);
ditto, see above.
> + struct kvm_pmu *pmu = &vcpu->arch.pmu;
> + struct kvm_pmc *pmc = &pmu->pmc[select_idx];
> +
> + if (pmc->perf_event)
> + perf_event_disable(pmc->perf_event);
> +
> + pmc->enable = false;
> +}
> +
> +/**
> * kvm_pmu_find_hw_event - find hardware event
> * @pmu: The pmu pointer
> * @event_select: The number of selected event type
> --
> 2.1.0
>
Thanks,
-Christoffer
WARNING: multiple messages have this Message-ID (diff)
From: christoffer.dall@linaro.org (Christoffer Dall)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 11/18] KVM: ARM64: Add reset and access handlers for PMCNTENSET_EL0 and PMCNTENCLR_EL0 register
Date: Fri, 17 Jul 2015 16:52:33 +0200 [thread overview]
Message-ID: <20150717145233.GU14024@cbox> (raw)
In-Reply-To: <1436149068-3784-12-git-send-email-shannon.zhao@linaro.org>
On Mon, Jul 06, 2015 at 10:17:41AM +0800, shannon.zhao at linaro.org wrote:
> From: Shannon Zhao <shannon.zhao@linaro.org>
>
> Since the reset value of PMCNTENSET_EL0 and PMCNTENCLR_EL0 is UNKNOWN,
> use reset_unknown for its reset handler. Add access handler which
> emulates writing and reading PMCNTENSET_EL0 or PMCNTENCLR_EL0 register.
> When writing to PMCNTENSET_EL0, call perf_event_enable to enable the
> perf event. When writing to PMCNTENCLR_EL0, call perf_event_disable to
> disable the perf event.
>
> Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org>
> ---
> arch/arm64/kvm/sys_regs.c | 56 +++++++++++++++++++++++++++++++++++++++++++++--
> include/kvm/arm_pmu.h | 4 ++++
> virt/kvm/arm/pmu.c | 41 ++++++++++++++++++++++++++++++++++
> 3 files changed, 99 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
> index 29883df..c14ec8d 100644
> --- a/arch/arm64/kvm/sys_regs.c
> +++ b/arch/arm64/kvm/sys_regs.c
> @@ -392,6 +392,58 @@ static bool access_pmccntr(struct kvm_vcpu *vcpu,
> return true;
> }
>
> +/* PMCNTENSET_EL0 accessor. */
> +static bool access_pmcntenset(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);
> + if (!p->is_aarch32)
> + vcpu_sys_reg(vcpu, r->reg) |= val;
> + else
> + vcpu_cp15(vcpu, r->reg) |= val & 0xffffffffUL;
> +
> + kvm_pmu_enable_counter(vcpu, val);
> + } else {
> + if (!p->is_aarch32)
> + val = vcpu_sys_reg(vcpu, r->reg);
> + else
> + val = vcpu_cp15(vcpu, r->reg);
> + *vcpu_reg(vcpu, p->Rt) = val;
> + }
> +
> + return true;
> +}
> +
> +/* PMCNTENCLR_EL0 accessor. */
> +static bool access_pmcntenclr(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);
> + if (!p->is_aarch32)
> + vcpu_sys_reg(vcpu, r->reg) |= val;
huh, this is the clear register, don't you need to &= ~val ?
also, there's a lot of code duplication between these two functions, it
must be worthwhile having a single static function that they both call
if a bool differentiating between set/clear.
> + else
> + vcpu_cp15(vcpu, r->reg) |= val & 0xffffffffUL;
> +
> + kvm_pmu_disable_counter(vcpu, val);
> + } else {
> + if (!p->is_aarch32)
> + val = vcpu_sys_reg(vcpu, r->reg);
> + else
> + val = vcpu_cp15(vcpu, r->reg);
> + *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 */ \
> @@ -586,10 +638,10 @@ static const struct sys_reg_desc sys_reg_descs[] = {
> access_pmcr, reset_pmcr_el0, PMCR_EL0, },
> /* PMCNTENSET_EL0 */
> { Op0(0b11), Op1(0b011), CRn(0b1001), CRm(0b1100), Op2(0b001),
> - trap_raz_wi },
> + access_pmcntenset, reset_unknown, PMCNTENSET_EL0 },
> /* PMCNTENCLR_EL0 */
> { Op0(0b11), Op1(0b011), CRn(0b1001), CRm(0b1100), Op2(0b010),
> - trap_raz_wi },
> + access_pmcntenclr, reset_unknown, PMCNTENCLR_EL0 },
> /* PMOVSCLR_EL0 */
> { Op0(0b11), Op1(0b011), CRn(0b1001), CRm(0b1100), Op2(0b011),
> trap_raz_wi },
> diff --git a/include/kvm/arm_pmu.h b/include/kvm/arm_pmu.h
> index 40ab4a0..2cfd9be 100644
> --- a/include/kvm/arm_pmu.h
> +++ b/include/kvm/arm_pmu.h
> @@ -49,6 +49,8 @@ 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_disable_counter(struct kvm_vcpu *vcpu, unsigned long val);
> +void kvm_pmu_enable_counter(struct kvm_vcpu *vcpu, unsigned long val);
> 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);
> @@ -61,6 +63,8 @@ unsigned long kvm_pmu_get_counter_value(struct kvm_vcpu *vcpu,
> {
> return 0;
> }
> +void kvm_pmu_disable_counter(struct kvm_vcpu *vcpu, unsigned long val) {}
> +void kvm_pmu_enable_counter(struct kvm_vcpu *vcpu, unsigned long val) {}
> 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 361fa51..cf59998 100644
> --- a/virt/kvm/arm/pmu.c
> +++ b/virt/kvm/arm/pmu.c
> @@ -134,6 +134,47 @@ unsigned long kvm_pmu_get_counter_value(struct kvm_vcpu *vcpu,
> }
>
> /**
> + * kvm_pmu_enable_counter - enable selected PMU counter
> + * @vcpu: The vcpu pointer
> + * @val: the value guest writes to PMCNTENSET_EL0 register
> + *
> + * Call perf_event_enable to start counting the perf event
> + */
> +void kvm_pmu_enable_counter(struct kvm_vcpu *vcpu, unsigned long val)
> +{
> + int select_idx = find_first_bit(&val, 32);
Both of these functions should be able to handle more than one bit set
in val though, right?
Or perhaps you should make the parameter be select_idx and loop over the
bits in the caller, your choice.
> + struct kvm_pmu *pmu = &vcpu->arch.pmu;
> + struct kvm_pmc *pmc = &pmu->pmc[select_idx];
> +
> + if (pmc->perf_event) {
> + local64_set(&pmc->perf_event->count, 0);
why local64_set? Is this local to this CPU somehow?
why do we clear the count? Is it architecturally mandated?
> + perf_event_enable(pmc->perf_event);
> + if (pmc->perf_event->state != PERF_EVENT_STATE_ACTIVE)
> + printk("kvm: fail to enable event\n");
do you really want this print here? What could cause this error,
anything the VM can provoke?
> + }
what's the difference between having pmc->perf_event == NULL and having
pmc->perf_event->state == PERF_EVENT_STATE_INACTIVE ?
> + pmc->enable = true;
> +}
> +
> +/**
> + * kvm_pmu_disable_counter - disable selected PMU counter
> + * @vcpu: The vcpu pointer
> + * @val: the value guest writes to PMCNTENCLR_EL0 register
> + *
> + * Call perf_event_disable to stop counting the perf event
> + */
> +void kvm_pmu_disable_counter(struct kvm_vcpu *vcpu, unsigned long val)
> +{
> + int select_idx = find_first_bit(&val, 32);
ditto, see above.
> + struct kvm_pmu *pmu = &vcpu->arch.pmu;
> + struct kvm_pmc *pmc = &pmu->pmc[select_idx];
> +
> + if (pmc->perf_event)
> + perf_event_disable(pmc->perf_event);
> +
> + pmc->enable = false;
> +}
> +
> +/**
> * kvm_pmu_find_hw_event - find hardware event
> * @pmu: The pmu pointer
> * @event_select: The number of selected event type
> --
> 2.1.0
>
Thanks,
-Christoffer
next prev parent reply other threads:[~2015-07-17 14:52 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
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 [this message]
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=20150717145233.GU14024@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.