* [PATCH v4 0/6] target/arm/kvm: Report PMU unavailability @ 2024-07-20 9:30 Akihiko Odaki 2024-07-20 9:30 ` [PATCH v4 1/6] target/arm/kvm: Set PMU for host only when available Akihiko Odaki ` (6 more replies) 0 siblings, 7 replies; 13+ messages in thread From: Akihiko Odaki @ 2024-07-20 9:30 UTC (permalink / raw) To: Peter Maydell, Thomas Huth, Laurent Vivier, Paolo Bonzini, Cornelia Huck Cc: qemu-arm, qemu-devel, kvm, Akihiko Odaki target/arm/kvm.c checked PMU availability but claimed PMU is available even if it is not. In fact, Asahi Linux supports KVM but lacks PMU support. Only advertise PMU availability only when it is really available. Fixes: dc40d45ebd8e ("target/arm/kvm: Move kvm_arm_get_host_cpu_features and unexport") Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> --- Changes in v4: - Split patch "target/arm/kvm: Fix PMU feature bit early" into "target/arm/kvm: Set PMU for host only when available" and "target/arm/kvm: Do not silently remove PMU". - Changed to define PMU also for Armv7. - Changed not to define PMU for M. - Extracted patch "hvf: arm: Raise an exception for sysreg by default" from "hvf: arm: Properly disable PMU". - Rebased. - Link to v3: https://lore.kernel.org/r/20240716-pmu-v3-0-8c7c1858a227@daynix.com Changes in v3: - Dropped patch "target/arm: Do not allow setting 'pmu' for hvf". - Dropped patch "target/arm: Allow setting 'pmu' only for host and max". - Dropped patch "target/arm/kvm: Report PMU unavailability". - Added patch "target/arm/kvm: Fix PMU feature bit early". - Added patch "hvf: arm: Do not advance PC when raising an exception". - Added patch "hvf: arm: Properly disable PMU". - Changed to check for Armv8 before adding PMU property. - Link to v2: https://lore.kernel.org/r/20240716-pmu-v2-0-f3e3e4b2d3d5@daynix.com Changes in v2: - Restricted writes to 'pmu' to host and max. - Prohibited writes to 'pmu' for hvf. - Link to v1: https://lore.kernel.org/r/20240629-pmu-v1-0-7269123b88a4@daynix.com --- Akihiko Odaki (6): target/arm/kvm: Set PMU for host only when available target/arm/kvm: Do not silently remove PMU target/arm: Always add pmu property for Armv7-A/R+ hvf: arm: Raise an exception for sysreg by default hvf: arm: Properly disable PMU hvf: arm: Do not advance PC when raising an exception target/arm/cpu.c | 5 +- target/arm/hvf/hvf.c | 302 ++++++++++++++++++++++++++------------------------- target/arm/kvm.c | 7 +- 3 files changed, 159 insertions(+), 155 deletions(-) --- base-commit: a87a7c449e532130d4fa8faa391ff7e1f04ed660 change-id: 20240629-pmu-ad5f67e2c5d0 Best regards, -- Akihiko Odaki <akihiko.odaki@daynix.com> ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v4 1/6] target/arm/kvm: Set PMU for host only when available 2024-07-20 9:30 [PATCH v4 0/6] target/arm/kvm: Report PMU unavailability Akihiko Odaki @ 2024-07-20 9:30 ` Akihiko Odaki 2024-07-20 9:30 ` [PATCH v4 2/6] target/arm/kvm: Do not silently remove PMU Akihiko Odaki ` (5 subsequent siblings) 6 siblings, 0 replies; 13+ messages in thread From: Akihiko Odaki @ 2024-07-20 9:30 UTC (permalink / raw) To: Peter Maydell, Thomas Huth, Laurent Vivier, Paolo Bonzini, Cornelia Huck Cc: qemu-arm, qemu-devel, kvm, Akihiko Odaki target/arm/kvm.c checked PMU availability but unconditionally set the PMU feature flag for the host CPU model, which is confusing. Set the feature flag only when available. Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> --- target/arm/kvm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/target/arm/kvm.c b/target/arm/kvm.c index 70f79eda33cd..b20a35052f41 100644 --- a/target/arm/kvm.c +++ b/target/arm/kvm.c @@ -280,6 +280,7 @@ static bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf) if (kvm_arm_pmu_supported()) { init.features[0] |= 1 << KVM_ARM_VCPU_PMU_V3; pmu_supported = true; + features |= 1ULL << ARM_FEATURE_PMU; } if (!kvm_arm_create_scratch_host_vcpu(cpus_to_try, fdarray, &init)) { @@ -448,7 +449,6 @@ static bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf) features |= 1ULL << ARM_FEATURE_V8; features |= 1ULL << ARM_FEATURE_NEON; features |= 1ULL << ARM_FEATURE_AARCH64; - features |= 1ULL << ARM_FEATURE_PMU; features |= 1ULL << ARM_FEATURE_GENERIC_TIMER; ahcf->features = features; -- 2.45.2 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v4 2/6] target/arm/kvm: Do not silently remove PMU 2024-07-20 9:30 [PATCH v4 0/6] target/arm/kvm: Report PMU unavailability Akihiko Odaki 2024-07-20 9:30 ` [PATCH v4 1/6] target/arm/kvm: Set PMU for host only when available Akihiko Odaki @ 2024-07-20 9:30 ` Akihiko Odaki 2024-07-20 9:30 ` [PATCH v4 3/6] target/arm: Always add pmu property for Armv7-A/R+ Akihiko Odaki ` (4 subsequent siblings) 6 siblings, 0 replies; 13+ messages in thread From: Akihiko Odaki @ 2024-07-20 9:30 UTC (permalink / raw) To: Peter Maydell, Thomas Huth, Laurent Vivier, Paolo Bonzini, Cornelia Huck Cc: qemu-arm, qemu-devel, kvm, Akihiko Odaki kvm_arch_init_vcpu() used to remove PMU when it is not available even if the CPU model needs one. It is semantically incorrect, and may continue execution on a misbehaving host that advertises a CPU model while lacking its PMU. Keep the PMU when the CPU model needs one, and let kvm_arm_vcpu_init() fail if the KVM implementation mismatches with our expectation. Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> --- target/arm/kvm.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/target/arm/kvm.c b/target/arm/kvm.c index b20a35052f41..849e2e21b304 100644 --- a/target/arm/kvm.c +++ b/target/arm/kvm.c @@ -1888,13 +1888,8 @@ int kvm_arch_init_vcpu(CPUState *cs) if (!arm_feature(env, ARM_FEATURE_AARCH64)) { cpu->kvm_init_features[0] |= 1 << KVM_ARM_VCPU_EL1_32BIT; } - if (!kvm_check_extension(cs->kvm_state, KVM_CAP_ARM_PMU_V3)) { - cpu->has_pmu = false; - } if (cpu->has_pmu) { cpu->kvm_init_features[0] |= 1 << KVM_ARM_VCPU_PMU_V3; - } else { - env->features &= ~(1ULL << ARM_FEATURE_PMU); } if (cpu_isar_feature(aa64_sve, cpu)) { assert(kvm_arm_sve_supported()); -- 2.45.2 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v4 3/6] target/arm: Always add pmu property for Armv7-A/R+ 2024-07-20 9:30 [PATCH v4 0/6] target/arm/kvm: Report PMU unavailability Akihiko Odaki 2024-07-20 9:30 ` [PATCH v4 1/6] target/arm/kvm: Set PMU for host only when available Akihiko Odaki 2024-07-20 9:30 ` [PATCH v4 2/6] target/arm/kvm: Do not silently remove PMU Akihiko Odaki @ 2024-07-20 9:30 ` Akihiko Odaki 2024-07-29 15:13 ` Peter Maydell 2024-07-20 9:30 ` [PATCH v4 4/6] hvf: arm: Raise an exception for sysreg by default Akihiko Odaki ` (3 subsequent siblings) 6 siblings, 1 reply; 13+ messages in thread From: Akihiko Odaki @ 2024-07-20 9:30 UTC (permalink / raw) To: Peter Maydell, Thomas Huth, Laurent Vivier, Paolo Bonzini, Cornelia Huck Cc: qemu-arm, qemu-devel, kvm, Akihiko Odaki kvm-steal-time and sve properties are added for KVM even if the corresponding features are not available. Always add pmu property for Armv8. Note that the property is added only for Armv7-A/R+ as QEMU currently emulates PMU only for such versions, and a different version may have a different definition of PMU or may not have one at all. Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> --- target/arm/cpu.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/target/arm/cpu.c b/target/arm/cpu.c index 19191c239181..c1955a82fb3c 100644 --- a/target/arm/cpu.c +++ b/target/arm/cpu.c @@ -1741,6 +1741,10 @@ void arm_cpu_post_init(Object *obj) if (!arm_feature(&cpu->env, ARM_FEATURE_M)) { qdev_property_add_static(DEVICE(obj), &arm_cpu_reset_hivecs_property); + + if (arm_feature(&cpu->env, ARM_FEATURE_V7)) { + object_property_add_bool(obj, "pmu", arm_get_pmu, arm_set_pmu); + } } if (arm_feature(&cpu->env, ARM_FEATURE_V8)) { @@ -1770,7 +1774,6 @@ void arm_cpu_post_init(Object *obj) if (arm_feature(&cpu->env, ARM_FEATURE_PMU)) { cpu->has_pmu = true; - object_property_add_bool(obj, "pmu", arm_get_pmu, arm_set_pmu); } /* -- 2.45.2 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH v4 3/6] target/arm: Always add pmu property for Armv7-A/R+ 2024-07-20 9:30 ` [PATCH v4 3/6] target/arm: Always add pmu property for Armv7-A/R+ Akihiko Odaki @ 2024-07-29 15:13 ` Peter Maydell 2024-07-29 16:32 ` Akihiko Odaki 0 siblings, 1 reply; 13+ messages in thread From: Peter Maydell @ 2024-07-29 15:13 UTC (permalink / raw) To: Akihiko Odaki Cc: Thomas Huth, Laurent Vivier, Paolo Bonzini, Cornelia Huck, qemu-arm, qemu-devel, kvm On Sat, 20 Jul 2024 at 10:31, Akihiko Odaki <akihiko.odaki@daynix.com> wrote: > > kvm-steal-time and sve properties are added for KVM even if the > corresponding features are not available. Always add pmu property for > Armv8. Note that the property is added only for Armv7-A/R+ as QEMU > currently emulates PMU only for such versions, and a different > version may have a different definition of PMU or may not have one at > all. > > Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> > --- > target/arm/cpu.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/target/arm/cpu.c b/target/arm/cpu.c > index 19191c239181..c1955a82fb3c 100644 > --- a/target/arm/cpu.c > +++ b/target/arm/cpu.c > @@ -1741,6 +1741,10 @@ void arm_cpu_post_init(Object *obj) > > if (!arm_feature(&cpu->env, ARM_FEATURE_M)) { > qdev_property_add_static(DEVICE(obj), &arm_cpu_reset_hivecs_property); > + > + if (arm_feature(&cpu->env, ARM_FEATURE_V7)) { > + object_property_add_bool(obj, "pmu", arm_get_pmu, arm_set_pmu); > + } Not every V7 CPU has a PMU[*]. Unfortunately for PMUv1 the architecture did not define an ID register field for it, so there's no ID field you can look at to distinguish "has PMUv1" from "has no PMU". (For PMUv2 and later you can look at ID_DFR0 bits [27:24]; or for AArch64 ID_AA64DFR0_EL1.PMUVer.) This is why we have the ARM_FEATURE_PMU feature bit. So the correct way to determine "does this CPU have a PMU and so it's OK to add the 'pmu' property" is to look at ARM_FEATURE_PMU. Which is what we already do. Alternatively, if you want to make the property always present even on CPUs where it can't be set, you need to have some mechanism for having the user's attempt to enable it fail. But mostly for Arm at the moment we have properties which are only present when they're meaningful. (I'm not opposed to changing this -- it would arguably be cleaner to have properties be per-class, not per-object, to aid in introspection. But it's a big task and probably not easy.) [*] It happens that all the v7 CPUs that QEMU currently models do have at least a PMUv1, but that's not an architectural requirement. thanks -- PMM ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 3/6] target/arm: Always add pmu property for Armv7-A/R+ 2024-07-29 15:13 ` Peter Maydell @ 2024-07-29 16:32 ` Akihiko Odaki 0 siblings, 0 replies; 13+ messages in thread From: Akihiko Odaki @ 2024-07-29 16:32 UTC (permalink / raw) To: Peter Maydell Cc: Thomas Huth, Laurent Vivier, Paolo Bonzini, Cornelia Huck, qemu-arm, qemu-devel, kvm On 2024/07/30 0:13, Peter Maydell wrote: > On Sat, 20 Jul 2024 at 10:31, Akihiko Odaki <akihiko.odaki@daynix.com> wrote: >> >> kvm-steal-time and sve properties are added for KVM even if the >> corresponding features are not available. Always add pmu property for >> Armv8. Note that the property is added only for Armv7-A/R+ as QEMU >> currently emulates PMU only for such versions, and a different >> version may have a different definition of PMU or may not have one at >> all. >> >> Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> >> --- >> target/arm/cpu.c | 5 ++++- >> 1 file changed, 4 insertions(+), 1 deletion(-) >> >> diff --git a/target/arm/cpu.c b/target/arm/cpu.c >> index 19191c239181..c1955a82fb3c 100644 >> --- a/target/arm/cpu.c >> +++ b/target/arm/cpu.c >> @@ -1741,6 +1741,10 @@ void arm_cpu_post_init(Object *obj) >> >> if (!arm_feature(&cpu->env, ARM_FEATURE_M)) { >> qdev_property_add_static(DEVICE(obj), &arm_cpu_reset_hivecs_property); >> + >> + if (arm_feature(&cpu->env, ARM_FEATURE_V7)) { >> + object_property_add_bool(obj, "pmu", arm_get_pmu, arm_set_pmu); >> + } > > Not every V7 CPU has a PMU[*]. Unfortunately for PMUv1 the > architecture did not define an ID register field for it, > so there's no ID field you can look at to distinguish > "has PMUv1" from "has no PMU". (For PMUv2 and later you > can look at ID_DFR0 bits [27:24]; or for AArch64 > ID_AA64DFR0_EL1.PMUVer.) This is why we have the > ARM_FEATURE_PMU feature bit. So the correct way to determine > "does this CPU have a PMU and so it's OK to add the 'pmu' > property" is to look at ARM_FEATURE_PMU. Which is what > we already do. > > Alternatively, if you want to make the property always > present even on CPUs where it can't be set, you need > to have some mechanism for having the user's attempt to > enable it fail. But mostly for Arm at the moment we > have properties which are only present when they're > meaningful. (I'm not opposed to changing this -- it would > arguably be cleaner to have properties be per-class, > not per-object, to aid in introspection. But it's a big > task and probably not easy.) Why not disabling PMU fail for V7 then? If the guest cannot know the presence or the lack of PMUv1, disabling PMUv1 for a V7 CPU that has one is as wrong as enabling PMUv1 for a V7 CPU lacking PMUv1. Regards, Akihiko Odaki ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v4 4/6] hvf: arm: Raise an exception for sysreg by default 2024-07-20 9:30 [PATCH v4 0/6] target/arm/kvm: Report PMU unavailability Akihiko Odaki ` (2 preceding siblings ...) 2024-07-20 9:30 ` [PATCH v4 3/6] target/arm: Always add pmu property for Armv7-A/R+ Akihiko Odaki @ 2024-07-20 9:30 ` Akihiko Odaki 2024-07-20 9:30 ` [PATCH v4 5/6] hvf: arm: Properly disable PMU Akihiko Odaki ` (2 subsequent siblings) 6 siblings, 0 replies; 13+ messages in thread From: Akihiko Odaki @ 2024-07-20 9:30 UTC (permalink / raw) To: Peter Maydell, Thomas Huth, Laurent Vivier, Paolo Bonzini, Cornelia Huck Cc: qemu-arm, qemu-devel, kvm, Akihiko Odaki Any sysreg access results in an exception unless defined otherwise so we should raise an exception by default. Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> --- target/arm/hvf/hvf.c | 174 +++++++++++++++++++++++++-------------------------- 1 file changed, 85 insertions(+), 89 deletions(-) diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c index eb090e67a2f8..1a749534fb0d 100644 --- a/target/arm/hvf/hvf.c +++ b/target/arm/hvf/hvf.c @@ -1199,57 +1199,56 @@ static bool hvf_sysreg_read_cp(CPUState *cpu, uint32_t reg, uint64_t *val) return false; } -static int hvf_sysreg_read(CPUState *cpu, uint32_t reg, uint32_t rt) +static int hvf_sysreg_read(CPUState *cpu, uint32_t reg, uint64_t *val) { ARMCPU *arm_cpu = ARM_CPU(cpu); CPUARMState *env = &arm_cpu->env; - uint64_t val = 0; switch (reg) { case SYSREG_CNTPCT_EL0: - val = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) / + *val = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) / gt_cntfrq_period_ns(arm_cpu); - break; + return 0; case SYSREG_PMCR_EL0: - val = env->cp15.c9_pmcr; - break; + *val = env->cp15.c9_pmcr; + return 0; case SYSREG_PMCCNTR_EL0: pmu_op_start(env); - val = env->cp15.c15_ccnt; + *val = env->cp15.c15_ccnt; pmu_op_finish(env); - break; + return 0; case SYSREG_PMCNTENCLR_EL0: - val = env->cp15.c9_pmcnten; - break; + *val = env->cp15.c9_pmcnten; + return 0; case SYSREG_PMOVSCLR_EL0: - val = env->cp15.c9_pmovsr; - break; + *val = env->cp15.c9_pmovsr; + return 0; case SYSREG_PMSELR_EL0: - val = env->cp15.c9_pmselr; - break; + *val = env->cp15.c9_pmselr; + return 0; case SYSREG_PMINTENCLR_EL1: - val = env->cp15.c9_pminten; - break; + *val = env->cp15.c9_pminten; + return 0; case SYSREG_PMCCFILTR_EL0: - val = env->cp15.pmccfiltr_el0; - break; + *val = env->cp15.pmccfiltr_el0; + return 0; case SYSREG_PMCNTENSET_EL0: - val = env->cp15.c9_pmcnten; - break; + *val = env->cp15.c9_pmcnten; + return 0; case SYSREG_PMUSERENR_EL0: - val = env->cp15.c9_pmuserenr; - break; + *val = env->cp15.c9_pmuserenr; + return 0; case SYSREG_PMCEID0_EL0: case SYSREG_PMCEID1_EL0: /* We can't really count anything yet, declare all events invalid */ - val = 0; - break; + *val = 0; + return 0; case SYSREG_OSLSR_EL1: - val = env->cp15.oslsr_el1; - break; + *val = env->cp15.oslsr_el1; + return 0; case SYSREG_OSDLR_EL1: /* Dummy register */ - break; + return 0; case SYSREG_ICC_AP0R0_EL1: case SYSREG_ICC_AP0R1_EL1: case SYSREG_ICC_AP0R2_EL1: @@ -1276,9 +1275,8 @@ static int hvf_sysreg_read(CPUState *cpu, uint32_t reg, uint32_t rt) case SYSREG_ICC_SRE_EL1: case SYSREG_ICC_CTLR_EL1: /* Call the TCG sysreg handler. This is only safe for GICv3 regs. */ - if (!hvf_sysreg_read_cp(cpu, reg, &val)) { - hvf_raise_exception(cpu, EXCP_UDEF, syn_uncategorized()); - return 1; + if (hvf_sysreg_read_cp(cpu, reg, &val)) { + return 0; } break; case SYSREG_DBGBVR0_EL1: @@ -1297,8 +1295,8 @@ static int hvf_sysreg_read(CPUState *cpu, uint32_t reg, uint32_t rt) case SYSREG_DBGBVR13_EL1: case SYSREG_DBGBVR14_EL1: case SYSREG_DBGBVR15_EL1: - val = env->cp15.dbgbvr[SYSREG_CRM(reg)]; - break; + *val = env->cp15.dbgbvr[SYSREG_CRM(reg)]; + return 0; case SYSREG_DBGBCR0_EL1: case SYSREG_DBGBCR1_EL1: case SYSREG_DBGBCR2_EL1: @@ -1315,8 +1313,8 @@ static int hvf_sysreg_read(CPUState *cpu, uint32_t reg, uint32_t rt) case SYSREG_DBGBCR13_EL1: case SYSREG_DBGBCR14_EL1: case SYSREG_DBGBCR15_EL1: - val = env->cp15.dbgbcr[SYSREG_CRM(reg)]; - break; + *val = env->cp15.dbgbcr[SYSREG_CRM(reg)]; + return 0; case SYSREG_DBGWVR0_EL1: case SYSREG_DBGWVR1_EL1: case SYSREG_DBGWVR2_EL1: @@ -1333,8 +1331,8 @@ static int hvf_sysreg_read(CPUState *cpu, uint32_t reg, uint32_t rt) case SYSREG_DBGWVR13_EL1: case SYSREG_DBGWVR14_EL1: case SYSREG_DBGWVR15_EL1: - val = env->cp15.dbgwvr[SYSREG_CRM(reg)]; - break; + *val = env->cp15.dbgwvr[SYSREG_CRM(reg)]; + return 0; case SYSREG_DBGWCR0_EL1: case SYSREG_DBGWCR1_EL1: case SYSREG_DBGWCR2_EL1: @@ -1351,35 +1349,25 @@ static int hvf_sysreg_read(CPUState *cpu, uint32_t reg, uint32_t rt) case SYSREG_DBGWCR13_EL1: case SYSREG_DBGWCR14_EL1: case SYSREG_DBGWCR15_EL1: - val = env->cp15.dbgwcr[SYSREG_CRM(reg)]; - break; + *val = env->cp15.dbgwcr[SYSREG_CRM(reg)]; + return 0; default: if (is_id_sysreg(reg)) { /* ID system registers read as RES0 */ - val = 0; - break; + *val = 0; + return 0; } - cpu_synchronize_state(cpu); - trace_hvf_unhandled_sysreg_read(env->pc, reg, - SYSREG_OP0(reg), - SYSREG_OP1(reg), - SYSREG_CRN(reg), - SYSREG_CRM(reg), - SYSREG_OP2(reg)); - hvf_raise_exception(cpu, EXCP_UDEF, syn_uncategorized()); - return 1; } - trace_hvf_sysreg_read(reg, - SYSREG_OP0(reg), - SYSREG_OP1(reg), - SYSREG_CRN(reg), - SYSREG_CRM(reg), - SYSREG_OP2(reg), - val); - hvf_set_reg(cpu, rt, val); - - return 0; + cpu_synchronize_state(cpu); + trace_hvf_unhandled_sysreg_read(env->pc, reg, + SYSREG_OP0(reg), + SYSREG_OP1(reg), + SYSREG_CRN(reg), + SYSREG_CRM(reg), + SYSREG_OP2(reg)); + hvf_raise_exception(cpu, EXCP_UDEF, syn_uncategorized()); + return 1; } static void pmu_update_irq(CPUARMState *env) @@ -1503,7 +1491,7 @@ static int hvf_sysreg_write(CPUState *cpu, uint32_t reg, uint64_t val) pmu_op_start(env); env->cp15.c15_ccnt = val; pmu_op_finish(env); - break; + return 0; case SYSREG_PMCR_EL0: pmu_op_start(env); @@ -1523,45 +1511,45 @@ static int hvf_sysreg_write(CPUState *cpu, uint32_t reg, uint64_t val) env->cp15.c9_pmcr |= (val & PMCR_WRITABLE_MASK); pmu_op_finish(env); - break; + return 0; case SYSREG_PMUSERENR_EL0: env->cp15.c9_pmuserenr = val & 0xf; - break; + return 0; case SYSREG_PMCNTENSET_EL0: env->cp15.c9_pmcnten |= (val & pmu_counter_mask(env)); - break; + return 0; case SYSREG_PMCNTENCLR_EL0: env->cp15.c9_pmcnten &= ~(val & pmu_counter_mask(env)); - break; + return 0; case SYSREG_PMINTENCLR_EL1: pmu_op_start(env); env->cp15.c9_pminten |= val; pmu_op_finish(env); - break; + return 0; case SYSREG_PMOVSCLR_EL0: pmu_op_start(env); env->cp15.c9_pmovsr &= ~val; pmu_op_finish(env); - break; + return 0; case SYSREG_PMSWINC_EL0: pmu_op_start(env); pmswinc_write(env, val); pmu_op_finish(env); - break; + return 0; case SYSREG_PMSELR_EL0: env->cp15.c9_pmselr = val & 0x1f; - break; + return 0; case SYSREG_PMCCFILTR_EL0: pmu_op_start(env); env->cp15.pmccfiltr_el0 = val & PMCCFILTR_EL0; pmu_op_finish(env); - break; + return 0; case SYSREG_OSLAR_EL1: env->cp15.oslsr_el1 = val & 1; - break; + return 0; case SYSREG_OSDLR_EL1: /* Dummy register */ - break; + return 0; case SYSREG_ICC_AP0R0_EL1: case SYSREG_ICC_AP0R1_EL1: case SYSREG_ICC_AP0R2_EL1: @@ -1591,10 +1579,10 @@ static int hvf_sysreg_write(CPUState *cpu, uint32_t reg, uint64_t val) if (!hvf_sysreg_write_cp(cpu, reg, val)) { hvf_raise_exception(cpu, EXCP_UDEF, syn_uncategorized()); } - break; + return 0; case SYSREG_MDSCR_EL1: env->cp15.mdscr_el1 = val; - break; + return 0; case SYSREG_DBGBVR0_EL1: case SYSREG_DBGBVR1_EL1: case SYSREG_DBGBVR2_EL1: @@ -1612,7 +1600,7 @@ static int hvf_sysreg_write(CPUState *cpu, uint32_t reg, uint64_t val) case SYSREG_DBGBVR14_EL1: case SYSREG_DBGBVR15_EL1: env->cp15.dbgbvr[SYSREG_CRM(reg)] = val; - break; + return 0; case SYSREG_DBGBCR0_EL1: case SYSREG_DBGBCR1_EL1: case SYSREG_DBGBCR2_EL1: @@ -1630,7 +1618,7 @@ static int hvf_sysreg_write(CPUState *cpu, uint32_t reg, uint64_t val) case SYSREG_DBGBCR14_EL1: case SYSREG_DBGBCR15_EL1: env->cp15.dbgbcr[SYSREG_CRM(reg)] = val; - break; + return 0; case SYSREG_DBGWVR0_EL1: case SYSREG_DBGWVR1_EL1: case SYSREG_DBGWVR2_EL1: @@ -1648,7 +1636,7 @@ static int hvf_sysreg_write(CPUState *cpu, uint32_t reg, uint64_t val) case SYSREG_DBGWVR14_EL1: case SYSREG_DBGWVR15_EL1: env->cp15.dbgwvr[SYSREG_CRM(reg)] = val; - break; + return 0; case SYSREG_DBGWCR0_EL1: case SYSREG_DBGWCR1_EL1: case SYSREG_DBGWCR2_EL1: @@ -1666,20 +1654,18 @@ static int hvf_sysreg_write(CPUState *cpu, uint32_t reg, uint64_t val) case SYSREG_DBGWCR14_EL1: case SYSREG_DBGWCR15_EL1: env->cp15.dbgwcr[SYSREG_CRM(reg)] = val; - break; - default: - cpu_synchronize_state(cpu); - trace_hvf_unhandled_sysreg_write(env->pc, reg, - SYSREG_OP0(reg), - SYSREG_OP1(reg), - SYSREG_CRN(reg), - SYSREG_CRM(reg), - SYSREG_OP2(reg)); - hvf_raise_exception(cpu, EXCP_UDEF, syn_uncategorized()); - return 1; + return 0; } - return 0; + cpu_synchronize_state(cpu); + trace_hvf_unhandled_sysreg_write(env->pc, reg, + SYSREG_OP0(reg), + SYSREG_OP1(reg), + SYSREG_CRN(reg), + SYSREG_CRM(reg), + SYSREG_OP2(reg)); + hvf_raise_exception(cpu, EXCP_UDEF, syn_uncategorized()); + return 1; } static int hvf_inject_interrupts(CPUState *cpu) @@ -1944,7 +1930,17 @@ int hvf_vcpu_exec(CPUState *cpu) int sysreg_ret = 0; if (isread) { - sysreg_ret = hvf_sysreg_read(cpu, reg, rt); + sysreg_ret = hvf_sysreg_read(cpu, reg, &val); + if (!sysreg_ret) { + trace_hvf_sysreg_read(reg, + SYSREG_OP0(reg), + SYSREG_OP1(reg), + SYSREG_CRN(reg), + SYSREG_CRM(reg), + SYSREG_OP2(reg), + val); + hvf_set_reg(cpu, rt, val); + } } else { val = hvf_get_reg(cpu, rt); sysreg_ret = hvf_sysreg_write(cpu, reg, val); -- 2.45.2 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v4 5/6] hvf: arm: Properly disable PMU 2024-07-20 9:30 [PATCH v4 0/6] target/arm/kvm: Report PMU unavailability Akihiko Odaki ` (3 preceding siblings ...) 2024-07-20 9:30 ` [PATCH v4 4/6] hvf: arm: Raise an exception for sysreg by default Akihiko Odaki @ 2024-07-20 9:30 ` Akihiko Odaki 2024-07-20 9:30 ` [PATCH v4 6/6] hvf: arm: Do not advance PC when raising an exception Akihiko Odaki 2024-07-29 15:15 ` [PATCH v4 0/6] target/arm/kvm: Report PMU unavailability Peter Maydell 6 siblings, 0 replies; 13+ messages in thread From: Akihiko Odaki @ 2024-07-20 9:30 UTC (permalink / raw) To: Peter Maydell, Thomas Huth, Laurent Vivier, Paolo Bonzini, Cornelia Huck Cc: qemu-arm, qemu-devel, kvm, Akihiko Odaki Setting pmu property used to have no effect for hvf so fix it. Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> --- target/arm/hvf/hvf.c | 184 +++++++++++++++++++++++++++------------------------ 1 file changed, 97 insertions(+), 87 deletions(-) diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c index 1a749534fb0d..adcdfae0b17f 100644 --- a/target/arm/hvf/hvf.c +++ b/target/arm/hvf/hvf.c @@ -1204,45 +1204,50 @@ static int hvf_sysreg_read(CPUState *cpu, uint32_t reg, uint64_t *val) ARMCPU *arm_cpu = ARM_CPU(cpu); CPUARMState *env = &arm_cpu->env; + if (arm_feature(env, ARM_FEATURE_PMU)) { + switch (reg) { + case SYSREG_PMCR_EL0: + *val = env->cp15.c9_pmcr; + return 0; + case SYSREG_PMCCNTR_EL0: + pmu_op_start(env); + *val = env->cp15.c15_ccnt; + pmu_op_finish(env); + return 0; + case SYSREG_PMCNTENCLR_EL0: + *val = env->cp15.c9_pmcnten; + return 0; + case SYSREG_PMOVSCLR_EL0: + *val = env->cp15.c9_pmovsr; + return 0; + case SYSREG_PMSELR_EL0: + *val = env->cp15.c9_pmselr; + return 0; + case SYSREG_PMINTENCLR_EL1: + *val = env->cp15.c9_pminten; + return 0; + case SYSREG_PMCCFILTR_EL0: + *val = env->cp15.pmccfiltr_el0; + return 0; + case SYSREG_PMCNTENSET_EL0: + *val = env->cp15.c9_pmcnten; + return 0; + case SYSREG_PMUSERENR_EL0: + *val = env->cp15.c9_pmuserenr; + return 0; + case SYSREG_PMCEID0_EL0: + case SYSREG_PMCEID1_EL0: + /* We can't really count anything yet, declare all events invalid */ + *val = 0; + return 0; + } + } + switch (reg) { case SYSREG_CNTPCT_EL0: *val = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) / gt_cntfrq_period_ns(arm_cpu); return 0; - case SYSREG_PMCR_EL0: - *val = env->cp15.c9_pmcr; - return 0; - case SYSREG_PMCCNTR_EL0: - pmu_op_start(env); - *val = env->cp15.c15_ccnt; - pmu_op_finish(env); - return 0; - case SYSREG_PMCNTENCLR_EL0: - *val = env->cp15.c9_pmcnten; - return 0; - case SYSREG_PMOVSCLR_EL0: - *val = env->cp15.c9_pmovsr; - return 0; - case SYSREG_PMSELR_EL0: - *val = env->cp15.c9_pmselr; - return 0; - case SYSREG_PMINTENCLR_EL1: - *val = env->cp15.c9_pminten; - return 0; - case SYSREG_PMCCFILTR_EL0: - *val = env->cp15.pmccfiltr_el0; - return 0; - case SYSREG_PMCNTENSET_EL0: - *val = env->cp15.c9_pmcnten; - return 0; - case SYSREG_PMUSERENR_EL0: - *val = env->cp15.c9_pmuserenr; - return 0; - case SYSREG_PMCEID0_EL0: - case SYSREG_PMCEID1_EL0: - /* We can't really count anything yet, declare all events invalid */ - *val = 0; - return 0; case SYSREG_OSLSR_EL1: *val = env->cp15.oslsr_el1; return 0; @@ -1486,64 +1491,69 @@ static int hvf_sysreg_write(CPUState *cpu, uint32_t reg, uint64_t val) SYSREG_OP2(reg), val); - switch (reg) { - case SYSREG_PMCCNTR_EL0: - pmu_op_start(env); - env->cp15.c15_ccnt = val; - pmu_op_finish(env); - return 0; - case SYSREG_PMCR_EL0: - pmu_op_start(env); + if (arm_feature(env, ARM_FEATURE_PMU)) { + switch (reg) { + case SYSREG_PMCCNTR_EL0: + pmu_op_start(env); + env->cp15.c15_ccnt = val; + pmu_op_finish(env); + return 0; + case SYSREG_PMCR_EL0: + pmu_op_start(env); - if (val & PMCRC) { - /* The counter has been reset */ - env->cp15.c15_ccnt = 0; - } + if (val & PMCRC) { + /* The counter has been reset */ + env->cp15.c15_ccnt = 0; + } - if (val & PMCRP) { - unsigned int i; - for (i = 0; i < pmu_num_counters(env); i++) { - env->cp15.c14_pmevcntr[i] = 0; + if (val & PMCRP) { + unsigned int i; + for (i = 0; i < pmu_num_counters(env); i++) { + env->cp15.c14_pmevcntr[i] = 0; + } } - } - env->cp15.c9_pmcr &= ~PMCR_WRITABLE_MASK; - env->cp15.c9_pmcr |= (val & PMCR_WRITABLE_MASK); + env->cp15.c9_pmcr &= ~PMCR_WRITABLE_MASK; + env->cp15.c9_pmcr |= (val & PMCR_WRITABLE_MASK); - pmu_op_finish(env); - return 0; - case SYSREG_PMUSERENR_EL0: - env->cp15.c9_pmuserenr = val & 0xf; - return 0; - case SYSREG_PMCNTENSET_EL0: - env->cp15.c9_pmcnten |= (val & pmu_counter_mask(env)); - return 0; - case SYSREG_PMCNTENCLR_EL0: - env->cp15.c9_pmcnten &= ~(val & pmu_counter_mask(env)); - return 0; - case SYSREG_PMINTENCLR_EL1: - pmu_op_start(env); - env->cp15.c9_pminten |= val; - pmu_op_finish(env); - return 0; - case SYSREG_PMOVSCLR_EL0: - pmu_op_start(env); - env->cp15.c9_pmovsr &= ~val; - pmu_op_finish(env); - return 0; - case SYSREG_PMSWINC_EL0: - pmu_op_start(env); - pmswinc_write(env, val); - pmu_op_finish(env); - return 0; - case SYSREG_PMSELR_EL0: - env->cp15.c9_pmselr = val & 0x1f; - return 0; - case SYSREG_PMCCFILTR_EL0: - pmu_op_start(env); - env->cp15.pmccfiltr_el0 = val & PMCCFILTR_EL0; - pmu_op_finish(env); - return 0; + pmu_op_finish(env); + return 0; + case SYSREG_PMUSERENR_EL0: + env->cp15.c9_pmuserenr = val & 0xf; + return 0; + case SYSREG_PMCNTENSET_EL0: + env->cp15.c9_pmcnten |= (val & pmu_counter_mask(env)); + return 0; + case SYSREG_PMCNTENCLR_EL0: + env->cp15.c9_pmcnten &= ~(val & pmu_counter_mask(env)); + return 0; + case SYSREG_PMINTENCLR_EL1: + pmu_op_start(env); + env->cp15.c9_pminten |= val; + pmu_op_finish(env); + return 0; + case SYSREG_PMOVSCLR_EL0: + pmu_op_start(env); + env->cp15.c9_pmovsr &= ~val; + pmu_op_finish(env); + return 0; + case SYSREG_PMSWINC_EL0: + pmu_op_start(env); + pmswinc_write(env, val); + pmu_op_finish(env); + return 0; + case SYSREG_PMSELR_EL0: + env->cp15.c9_pmselr = val & 0x1f; + return 0; + case SYSREG_PMCCFILTR_EL0: + pmu_op_start(env); + env->cp15.pmccfiltr_el0 = val & PMCCFILTR_EL0; + pmu_op_finish(env); + return 0; + } + } + + switch (reg) { case SYSREG_OSLAR_EL1: env->cp15.oslsr_el1 = val & 1; return 0; -- 2.45.2 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v4 6/6] hvf: arm: Do not advance PC when raising an exception 2024-07-20 9:30 [PATCH v4 0/6] target/arm/kvm: Report PMU unavailability Akihiko Odaki ` (4 preceding siblings ...) 2024-07-20 9:30 ` [PATCH v4 5/6] hvf: arm: Properly disable PMU Akihiko Odaki @ 2024-07-20 9:30 ` Akihiko Odaki 2024-08-02 6:41 ` Michael Tokarev 2024-07-29 15:15 ` [PATCH v4 0/6] target/arm/kvm: Report PMU unavailability Peter Maydell 6 siblings, 1 reply; 13+ messages in thread From: Akihiko Odaki @ 2024-07-20 9:30 UTC (permalink / raw) To: Peter Maydell, Thomas Huth, Laurent Vivier, Paolo Bonzini, Cornelia Huck Cc: qemu-arm, qemu-devel, kvm, Akihiko Odaki This is identical with commit 30a1690f2402 ("hvf: arm: Do not advance PC when raising an exception") but for writes instead of reads. Fixes: a2260983c655 ("hvf: arm: Add support for GICv3") Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> --- target/arm/hvf/hvf.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c index adcdfae0b17f..c1496ad5be9b 100644 --- a/target/arm/hvf/hvf.c +++ b/target/arm/hvf/hvf.c @@ -1586,10 +1586,10 @@ static int hvf_sysreg_write(CPUState *cpu, uint32_t reg, uint64_t val) case SYSREG_ICC_SGI1R_EL1: case SYSREG_ICC_SRE_EL1: /* Call the TCG sysreg handler. This is only safe for GICv3 regs. */ - if (!hvf_sysreg_write_cp(cpu, reg, val)) { - hvf_raise_exception(cpu, EXCP_UDEF, syn_uncategorized()); + if (hvf_sysreg_write_cp(cpu, reg, val)) { + return 0; } - return 0; + break; case SYSREG_MDSCR_EL1: env->cp15.mdscr_el1 = val; return 0; -- 2.45.2 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH v4 6/6] hvf: arm: Do not advance PC when raising an exception 2024-07-20 9:30 ` [PATCH v4 6/6] hvf: arm: Do not advance PC when raising an exception Akihiko Odaki @ 2024-08-02 6:41 ` Michael Tokarev 2024-08-02 6:44 ` Akihiko Odaki 0 siblings, 1 reply; 13+ messages in thread From: Michael Tokarev @ 2024-08-02 6:41 UTC (permalink / raw) To: Akihiko Odaki, Peter Maydell, Thomas Huth, Laurent Vivier, Paolo Bonzini, Cornelia Huck Cc: qemu-arm, qemu-devel, kvm 20.07.2024 12:30, Akihiko Odaki wrote: > This is identical with commit 30a1690f2402 ("hvf: arm: Do not advance > PC when raising an exception") but for writes instead of reads. > > Fixes: a2260983c655 ("hvf: arm: Add support for GICv3") > Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> Is it -stable material (together with 30a1690f2402) ? Thanks, /mjt > --- > target/arm/hvf/hvf.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c > index adcdfae0b17f..c1496ad5be9b 100644 > --- a/target/arm/hvf/hvf.c > +++ b/target/arm/hvf/hvf.c > @@ -1586,10 +1586,10 @@ static int hvf_sysreg_write(CPUState *cpu, uint32_t reg, uint64_t val) > case SYSREG_ICC_SGI1R_EL1: > case SYSREG_ICC_SRE_EL1: > /* Call the TCG sysreg handler. This is only safe for GICv3 regs. */ > - if (!hvf_sysreg_write_cp(cpu, reg, val)) { > - hvf_raise_exception(cpu, EXCP_UDEF, syn_uncategorized()); > + if (hvf_sysreg_write_cp(cpu, reg, val)) { > + return 0; > } > - return 0; > + break; > case SYSREG_MDSCR_EL1: > env->cp15.mdscr_el1 = val; > return 0; > -- GPG Key transition (from rsa2048 to rsa4096) since 2024-04-24. New key: rsa4096/61AD3D98ECDF2C8E 9D8B E14E 3F2A 9DD7 9199 28F1 61AD 3D98 ECDF 2C8E Old key: rsa2048/457CE0A0804465C5 6EE1 95D1 886E 8FFB 810D 4324 457C E0A0 8044 65C5 Transition statement: http://www.corpit.ru/mjt/gpg-transition-2024.txt ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 6/6] hvf: arm: Do not advance PC when raising an exception 2024-08-02 6:41 ` Michael Tokarev @ 2024-08-02 6:44 ` Akihiko Odaki 2024-08-02 7:32 ` Michael Tokarev 0 siblings, 1 reply; 13+ messages in thread From: Akihiko Odaki @ 2024-08-02 6:44 UTC (permalink / raw) To: Michael Tokarev, Peter Maydell, Thomas Huth, Laurent Vivier, Paolo Bonzini, Cornelia Huck Cc: qemu-arm, qemu-devel, kvm On 2024/08/02 15:41, Michael Tokarev wrote: > 20.07.2024 12:30, Akihiko Odaki wrote: >> This is identical with commit 30a1690f2402 ("hvf: arm: Do not advance >> PC when raising an exception") but for writes instead of reads. >> >> Fixes: a2260983c655 ("hvf: arm: Add support for GICv3") >> Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> > > Is it -stable material (together with 30a1690f2402) ? The fixed bugs are trivial, and probably nobody is actually impacted by them. Regards, Akihiko Odaki ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 6/6] hvf: arm: Do not advance PC when raising an exception 2024-08-02 6:44 ` Akihiko Odaki @ 2024-08-02 7:32 ` Michael Tokarev 0 siblings, 0 replies; 13+ messages in thread From: Michael Tokarev @ 2024-08-02 7:32 UTC (permalink / raw) To: Akihiko Odaki, Peter Maydell, Thomas Huth, Laurent Vivier, Paolo Bonzini, Cornelia Huck Cc: qemu-arm, qemu-devel, kvm 02.08.2024 09:44, Akihiko Odaki wrote: > On 2024/08/02 15:41, Michael Tokarev wrote: >> 20.07.2024 12:30, Akihiko Odaki wrote: >>> This is identical with commit 30a1690f2402 ("hvf: arm: Do not advance >>> PC when raising an exception") but for writes instead of reads. >>> >>> Fixes: a2260983c655 ("hvf: arm: Add support for GICv3") >>> Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> >> >> Is it -stable material (together with 30a1690f2402) ? > > The fixed bugs are trivial, and probably nobody is actually impacted by them. The famous last words.. But okay, I'm not picking these up :) Thanks, /mjt -- GPG Key transition (from rsa2048 to rsa4096) since 2024-04-24. New key: rsa4096/61AD3D98ECDF2C8E 9D8B E14E 3F2A 9DD7 9199 28F1 61AD 3D98 ECDF 2C8E Old key: rsa2048/457CE0A0804465C5 6EE1 95D1 886E 8FFB 810D 4324 457C E0A0 8044 65C5 Transition statement: http://www.corpit.ru/mjt/gpg-transition-2024.txt ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 0/6] target/arm/kvm: Report PMU unavailability 2024-07-20 9:30 [PATCH v4 0/6] target/arm/kvm: Report PMU unavailability Akihiko Odaki ` (5 preceding siblings ...) 2024-07-20 9:30 ` [PATCH v4 6/6] hvf: arm: Do not advance PC when raising an exception Akihiko Odaki @ 2024-07-29 15:15 ` Peter Maydell 6 siblings, 0 replies; 13+ messages in thread From: Peter Maydell @ 2024-07-29 15:15 UTC (permalink / raw) To: Akihiko Odaki Cc: Thomas Huth, Laurent Vivier, Paolo Bonzini, Cornelia Huck, qemu-arm, qemu-devel, kvm On Sat, 20 Jul 2024 at 10:31, Akihiko Odaki <akihiko.odaki@daynix.com> wrote: > > target/arm/kvm.c checked PMU availability but claimed PMU is > available even if it is not. In fact, Asahi Linux supports KVM but lacks > PMU support. Only advertise PMU availability only when it is really > available. > > Fixes: dc40d45ebd8e ("target/arm/kvm: Move kvm_arm_get_host_cpu_features and unexport") > > Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> > Akihiko Odaki (6): > target/arm/kvm: Set PMU for host only when available > target/arm/kvm: Do not silently remove PMU > target/arm: Always add pmu property for Armv7-A/R+ > hvf: arm: Raise an exception for sysreg by default > hvf: arm: Properly disable PMU > hvf: arm: Do not advance PC when raising an exception Thanks for this patchset; I've applied patches 1, 2, 4, 5 and 6 to target-arm.next, but I had comments about patch 3. (Let me know if there's a dependency that 4-6 have on patch 3 that I've missed: but they look to me like they're still OK to take without patch 3.) -- PMM ^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2024-08-02 7:33 UTC | newest] Thread overview: 13+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-07-20 9:30 [PATCH v4 0/6] target/arm/kvm: Report PMU unavailability Akihiko Odaki 2024-07-20 9:30 ` [PATCH v4 1/6] target/arm/kvm: Set PMU for host only when available Akihiko Odaki 2024-07-20 9:30 ` [PATCH v4 2/6] target/arm/kvm: Do not silently remove PMU Akihiko Odaki 2024-07-20 9:30 ` [PATCH v4 3/6] target/arm: Always add pmu property for Armv7-A/R+ Akihiko Odaki 2024-07-29 15:13 ` Peter Maydell 2024-07-29 16:32 ` Akihiko Odaki 2024-07-20 9:30 ` [PATCH v4 4/6] hvf: arm: Raise an exception for sysreg by default Akihiko Odaki 2024-07-20 9:30 ` [PATCH v4 5/6] hvf: arm: Properly disable PMU Akihiko Odaki 2024-07-20 9:30 ` [PATCH v4 6/6] hvf: arm: Do not advance PC when raising an exception Akihiko Odaki 2024-08-02 6:41 ` Michael Tokarev 2024-08-02 6:44 ` Akihiko Odaki 2024-08-02 7:32 ` Michael Tokarev 2024-07-29 15:15 ` [PATCH v4 0/6] target/arm/kvm: Report PMU unavailability Peter Maydell
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).