[PATCH 1/2] hv: pass-thru PMU registers when no PROFILING_ON
He, Min
min.he at intel.com
Fri Feb 15 01:57:32 UTC 2019
Sending to a wrong mail list. Please ignore this patch.
> -----Original Message-----
> From: He, Min
> Sent: Friday, February 15, 2019 9:42 AM
> To: intel-gvt-dev at lists.freedesktop.org
> Cc: He, Min <min.he at intel.com>
> Subject: [PATCH 1/2] hv: pass-thru PMU registers when no PROFILING_ON
>
> In debug version, when disabling PROFILING, we will pass-thru the
> PMU registers to allow perf tool to be run in UOS directly.
> Also, a PMI interrupt handler is registered to send the PMI interrupts
> to the UOS through VLAPIC.
>
> Signed-off-by: Min He <min.he at intel.com>
> ---
> hypervisor/arch/x86/guest/vcpuid.c | 2 ++
> hypervisor/arch/x86/guest/vmsr.c | 2 ++
> hypervisor/debug/hypercall.c | 8 +++++++
> hypervisor/debug/profiling.c | 35 ++++++++++++++++++++++++++++++
> 4 files changed, 47 insertions(+)
>
> diff --git a/hypervisor/arch/x86/guest/vcpuid.c
> b/hypervisor/arch/x86/guest/vcpuid.c
> index db38242b..e20d2f35 100644
> --- a/hypervisor/arch/x86/guest/vcpuid.c
> +++ b/hypervisor/arch/x86/guest/vcpuid.c
> @@ -230,8 +230,10 @@ int32_t set_vcpuid_entries(struct acrn_vm *vm)
> break;
>
> /* These features are disabled */
> +#ifdef PROFILING_ON
> /* PMU is not supported */
> case 0x0aU:
> +#endif /* PROFILING_ON */
> /* Intel RDT */
> case 0x0fU:
> case 0x10U:
> diff --git a/hypervisor/arch/x86/guest/vmsr.c
> b/hypervisor/arch/x86/guest/vmsr.c
> index 873c36bc..bdc629bc 100644
> --- a/hypervisor/arch/x86/guest/vmsr.c
> +++ b/hypervisor/arch/x86/guest/vmsr.c
> @@ -114,6 +114,7 @@ static const uint32_t
> unsupported_msrs[NUM_UNSUPPORTED_MSRS] = {
> MSR_SGXOWNEREPOCH0,
> MSR_SGXOWNEREPOCH1,
>
> +#ifdef PROFILING_ON
> /* Performance Counters and Events: CPUID.0AH.EAX[15:8] */
> MSR_IA32_PMC0,
> MSR_IA32_PMC1,
> @@ -146,6 +147,7 @@ static const uint32_t
> unsupported_msrs[NUM_UNSUPPORTED_MSRS] = {
> MSR_IA32_FIXED_CTR0,
> MSR_IA32_FIXED_CTR1,
> MSR_IA32_FIXED_CTR2,
> +#endif /* PROFILING_ON */
>
> /* QOS Configuration disabled: CPUID.10H.ECX[2] */
> MSR_IA32_L3_QOS_CFG,
> diff --git a/hypervisor/debug/hypercall.c b/hypervisor/debug/hypercall.c
> index f20f43d3..32e90ce2 100644
> --- a/hypervisor/debug/hypercall.c
> +++ b/hypervisor/debug/hypercall.c
> @@ -61,6 +61,14 @@ static int32_t hcall_profiling_ops(struct acrn_vm *vm,
> uint64_t cmd, uint64_t pa
> }
> return ret;
> }
> +
> +#else
> +
> +static int32_t hcall_profiling_ops(__unused struct acrn_vm *vm, __unused
> uint64_t cmd, __unused uint64_t param)
> +{
> + return -EPERM;
> +}
> +
> #endif /* PROFILING_ON */
>
> /**
> diff --git a/hypervisor/debug/profiling.c b/hypervisor/debug/profiling.c
> index 41afff60..3f261966 100644
> --- a/hypervisor/debug/profiling.c
> +++ b/hypervisor/debug/profiling.c
> @@ -1455,4 +1455,39 @@ void profiling_setup(void)
> dev_dbg(ACRN_DBG_PROFILING, "%s: exiting", __func__);
> }
>
> +#else
> +
> +#include <hypervisor.h>
> +
> +void profiling_vmenter_handler(__unused struct acrn_vcpu *vcpu) {}
> +void profiling_pre_vmexit_handler(__unused struct acrn_vcpu *vcpu) {}
> +void profiling_post_vmexit_handler(__unused struct acrn_vcpu *vcpu) {}
> +
> +static void pmu_passthru_pmi_handler(__unused uint32_t irq, __unused
> void *data)
> +{
> + struct acrn_vcpu *vcpu = get_ever_run_vcpu(get_cpu_id());
> +
> + msr_write(MSR_IA32_EXT_APIC_LVT_PMI,
> VECTOR_PMI|LAPIC_LVT_MASK);
> + vlapic_set_local_intr(vcpu->vm, vcpu->vcpu_id, APIC_LVT_PMC);
> + msr_write(MSR_IA32_EXT_APIC_LVT_PMI, VECTOR_PMI);
> +}
> +
> +void profiling_setup(void)
> +{
> + uint16_t cpu;
> + int32_t retval;
> +
> + cpu = get_cpu_id();
> + if (cpu == BOOT_CPU_ID){
> + retval = request_irq(PMI_IRQ,
> + pmu_passthru_pmi_handler, NULL,
> IRQF_NONE);
> + if (retval < 0) {
> + pr_err("Failed to add PMI isr");
> + return;
> + }
> + }
> +
> + msr_write(MSR_IA32_EXT_APIC_LVT_PMI, VECTOR_PMI);
> +}
> +
> #endif
> --
> 2.17.0
More information about the intel-gvt-dev
mailing list