From: Raghavendra Rao Ananta <rananta@google.com>
To: Oliver Upton <oupton@google.com>,
Reiji Watanabe <reijiw@google.com>, Marc Zyngier <maz@kernel.org>,
Ricardo Koller <ricarkol@google.com>,
James Morse <james.morse@arm.com>,
Suzuki K Poulose <suzuki.poulose@arm.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>,
Jing Zhang <jingzhangos@google.com>,
Colton Lewis <coltonlewis@google.com>,
Raghavendra Rao Anata <rananta@google.com>,
linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev,
linux-kernel@vger.kernel.org, kvm@vger.kernel.org
Subject: [PATCH 07/13] selftests: KVM: aarch64: Add KVM EVTYPE filter PMU test
Date: Mon, 13 Feb 2023 18:02:28 +0000 [thread overview]
Message-ID: <20230213180234.2885032-8-rananta@google.com> (raw)
In-Reply-To: <20230213180234.2885032-1-rananta@google.com>
KVM doest't allow the guests to modify the filter types
such counting events in nonsecure/secure-EL2, EL3, and
so on. Validate the same by force-configuring the bits
in PMXEVTYPER_EL0, PMEVTYPERn_EL0, and PMCCFILTR_EL0
registers.
The test extends further by trying to create an event
for counting only in EL2 and validates if the counter
is not progressing.
Signed-off-by: Raghavendra Rao Ananta <rananta@google.com>
---
.../testing/selftests/kvm/aarch64/vpmu_test.c | 85 +++++++++++++++++++
1 file changed, 85 insertions(+)
diff --git a/tools/testing/selftests/kvm/aarch64/vpmu_test.c b/tools/testing/selftests/kvm/aarch64/vpmu_test.c
index 3dfb770b538e9..5c166df245589 100644
--- a/tools/testing/selftests/kvm/aarch64/vpmu_test.c
+++ b/tools/testing/selftests/kvm/aarch64/vpmu_test.c
@@ -15,6 +15,10 @@
* of allowing or denying the events. The guest validates it by
* checking if it's able to count only the events that are allowed.
*
+ * 3. KVM doesn't allow the guest to count the events attributed with
+ * higher exception levels (EL2, EL3). Verify this functionality by
+ * configuring and trying to count the events for EL2 in the guest.
+ *
* Copyright (c) 2022 Google LLC.
*
*/
@@ -23,6 +27,7 @@
#include <test_util.h>
#include <vgic.h>
#include <asm/perf_event.h>
+#include <linux/arm-smccc.h>
#include <linux/bitfield.h>
#include <linux/bitmap.h>
@@ -259,6 +264,7 @@ struct vpmu_vm {
enum test_stage {
TEST_STAGE_COUNTER_ACCESS = 1,
TEST_STAGE_KVM_EVENT_FILTER,
+ TEST_STAGE_KVM_EVTYPE_FILTER,
};
struct guest_data {
@@ -678,6 +684,70 @@ static void guest_event_filter_test(unsigned long *pmu_filter)
}
}
+static void guest_evtype_filter_test(void)
+{
+ int i;
+ struct pmc_accessor *acc;
+ uint64_t typer, cnt;
+ struct arm_smccc_res res;
+
+ pmu_enable();
+
+ /*
+ * KVM blocks the guests from creating events for counting in Secure/Non-Secure Hyp (EL2),
+ * Monitor (EL3), and Multithreading configuration. It applies the mask
+ * ARMV8_PMU_EVTYPE_MASK against guest accesses to PMXEVTYPER_EL0, PMEVTYPERn_EL0,
+ * and PMCCFILTR_EL0 registers to prevent this. Check if KVM honors this using all possible
+ * ways to configure the EVTYPER.
+ */
+ for (i = 0; i < ARRAY_SIZE(pmc_accessors); i++) {
+ acc = &pmc_accessors[i];
+
+ /* Set all filter bits (31-24), readback, and check against the mask */
+ acc->write_typer(0, 0xff000000);
+ typer = acc->read_typer(0);
+
+ GUEST_ASSERT_2((typer | ARMV8_PMU_EVTYPE_EVENT) == ARMV8_PMU_EVTYPE_MASK,
+ typer | ARMV8_PMU_EVTYPE_EVENT, ARMV8_PMU_EVTYPE_MASK);
+
+ /*
+ * Regardless of ARMV8_PMU_EVTYPE_MASK, KVM sets perf attr.exclude_hv
+ * to not count NS-EL2 events. Verify this functionality by configuring
+ * a NS-EL2 event, for which the couunt shouldn't increment.
+ */
+ typer = ARMV8_PMUV3_PERFCTR_INST_RETIRED;
+ typer |= ARMV8_PMU_INCLUDE_EL2 | ARMV8_PMU_EXCLUDE_EL1 | ARMV8_PMU_EXCLUDE_EL0;
+ acc->write_typer(0, typer);
+ acc->write_cntr(0, 0);
+ enable_counter(0);
+
+ /* Issue a hypercall to enter EL2 and return */
+ memset(&res, 0, sizeof(res));
+ smccc_hvc(ARM_SMCCC_VERSION_FUNC_ID, 0, 0, 0, 0, 0, 0, 0, &res);
+
+ cnt = acc->read_cntr(0);
+ GUEST_ASSERT_3(cnt == 0, cnt, typer, i);
+ }
+
+ /* Check the same sequence for the Cycle counter */
+ write_pmccfiltr(0xff000000);
+ typer = read_pmccfiltr();
+ GUEST_ASSERT_2((typer | ARMV8_PMU_EVTYPE_EVENT) == ARMV8_PMU_EVTYPE_MASK,
+ typer | ARMV8_PMU_EVTYPE_EVENT, ARMV8_PMU_EVTYPE_MASK);
+
+ typer = ARMV8_PMU_INCLUDE_EL2 | ARMV8_PMU_EXCLUDE_EL1 | ARMV8_PMU_EXCLUDE_EL0;
+ write_pmccfiltr(typer);
+ reset_cycle_counter();
+ enable_cycle_counter();
+
+ /* Issue a hypercall to enter EL2 and return */
+ memset(&res, 0, sizeof(res));
+ smccc_hvc(ARM_SMCCC_VERSION_FUNC_ID, 0, 0, 0, 0, 0, 0, 0, &res);
+
+ cnt = read_cycle_counter();
+ GUEST_ASSERT_2(cnt == 0, cnt, typer);
+}
+
static void guest_code(void)
{
switch (guest_data.test_stage) {
@@ -687,6 +757,9 @@ static void guest_code(void)
case TEST_STAGE_KVM_EVENT_FILTER:
guest_event_filter_test(guest_data.pmu_filter);
break;
+ case TEST_STAGE_KVM_EVTYPE_FILTER:
+ guest_evtype_filter_test();
+ break;
default:
GUEST_ASSERT_1(0, guest_data.test_stage);
}
@@ -1014,10 +1087,22 @@ static void run_kvm_event_filter_test(void)
run_kvm_event_filter_error_tests();
}
+static void run_kvm_evtype_filter_test(void)
+{
+ struct vpmu_vm *vpmu_vm;
+
+ guest_data.test_stage = TEST_STAGE_KVM_EVTYPE_FILTER;
+
+ vpmu_vm = create_vpmu_vm(guest_code, NULL);
+ run_vcpu(vpmu_vm->vcpu);
+ destroy_vpmu_vm(vpmu_vm);
+}
+
static void run_tests(uint64_t pmcr_n)
{
run_counter_access_tests(pmcr_n);
run_kvm_event_filter_test();
+ run_kvm_evtype_filter_test();
}
/*
--
2.39.1.581.gbfd45094c4-goog
WARNING: multiple messages have this Message-ID (diff)
From: Raghavendra Rao Ananta <rananta@google.com>
To: Oliver Upton <oupton@google.com>,
Reiji Watanabe <reijiw@google.com>, Marc Zyngier <maz@kernel.org>,
Ricardo Koller <ricarkol@google.com>,
James Morse <james.morse@arm.com>,
Suzuki K Poulose <suzuki.poulose@arm.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>,
Jing Zhang <jingzhangos@google.com>,
Colton Lewis <coltonlewis@google.com>,
Raghavendra Rao Anata <rananta@google.com>,
linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev,
linux-kernel@vger.kernel.org, kvm@vger.kernel.org
Subject: [PATCH 07/13] selftests: KVM: aarch64: Add KVM EVTYPE filter PMU test
Date: Mon, 13 Feb 2023 18:02:28 +0000 [thread overview]
Message-ID: <20230213180234.2885032-8-rananta@google.com> (raw)
In-Reply-To: <20230213180234.2885032-1-rananta@google.com>
KVM doest't allow the guests to modify the filter types
such counting events in nonsecure/secure-EL2, EL3, and
so on. Validate the same by force-configuring the bits
in PMXEVTYPER_EL0, PMEVTYPERn_EL0, and PMCCFILTR_EL0
registers.
The test extends further by trying to create an event
for counting only in EL2 and validates if the counter
is not progressing.
Signed-off-by: Raghavendra Rao Ananta <rananta@google.com>
---
.../testing/selftests/kvm/aarch64/vpmu_test.c | 85 +++++++++++++++++++
1 file changed, 85 insertions(+)
diff --git a/tools/testing/selftests/kvm/aarch64/vpmu_test.c b/tools/testing/selftests/kvm/aarch64/vpmu_test.c
index 3dfb770b538e9..5c166df245589 100644
--- a/tools/testing/selftests/kvm/aarch64/vpmu_test.c
+++ b/tools/testing/selftests/kvm/aarch64/vpmu_test.c
@@ -15,6 +15,10 @@
* of allowing or denying the events. The guest validates it by
* checking if it's able to count only the events that are allowed.
*
+ * 3. KVM doesn't allow the guest to count the events attributed with
+ * higher exception levels (EL2, EL3). Verify this functionality by
+ * configuring and trying to count the events for EL2 in the guest.
+ *
* Copyright (c) 2022 Google LLC.
*
*/
@@ -23,6 +27,7 @@
#include <test_util.h>
#include <vgic.h>
#include <asm/perf_event.h>
+#include <linux/arm-smccc.h>
#include <linux/bitfield.h>
#include <linux/bitmap.h>
@@ -259,6 +264,7 @@ struct vpmu_vm {
enum test_stage {
TEST_STAGE_COUNTER_ACCESS = 1,
TEST_STAGE_KVM_EVENT_FILTER,
+ TEST_STAGE_KVM_EVTYPE_FILTER,
};
struct guest_data {
@@ -678,6 +684,70 @@ static void guest_event_filter_test(unsigned long *pmu_filter)
}
}
+static void guest_evtype_filter_test(void)
+{
+ int i;
+ struct pmc_accessor *acc;
+ uint64_t typer, cnt;
+ struct arm_smccc_res res;
+
+ pmu_enable();
+
+ /*
+ * KVM blocks the guests from creating events for counting in Secure/Non-Secure Hyp (EL2),
+ * Monitor (EL3), and Multithreading configuration. It applies the mask
+ * ARMV8_PMU_EVTYPE_MASK against guest accesses to PMXEVTYPER_EL0, PMEVTYPERn_EL0,
+ * and PMCCFILTR_EL0 registers to prevent this. Check if KVM honors this using all possible
+ * ways to configure the EVTYPER.
+ */
+ for (i = 0; i < ARRAY_SIZE(pmc_accessors); i++) {
+ acc = &pmc_accessors[i];
+
+ /* Set all filter bits (31-24), readback, and check against the mask */
+ acc->write_typer(0, 0xff000000);
+ typer = acc->read_typer(0);
+
+ GUEST_ASSERT_2((typer | ARMV8_PMU_EVTYPE_EVENT) == ARMV8_PMU_EVTYPE_MASK,
+ typer | ARMV8_PMU_EVTYPE_EVENT, ARMV8_PMU_EVTYPE_MASK);
+
+ /*
+ * Regardless of ARMV8_PMU_EVTYPE_MASK, KVM sets perf attr.exclude_hv
+ * to not count NS-EL2 events. Verify this functionality by configuring
+ * a NS-EL2 event, for which the couunt shouldn't increment.
+ */
+ typer = ARMV8_PMUV3_PERFCTR_INST_RETIRED;
+ typer |= ARMV8_PMU_INCLUDE_EL2 | ARMV8_PMU_EXCLUDE_EL1 | ARMV8_PMU_EXCLUDE_EL0;
+ acc->write_typer(0, typer);
+ acc->write_cntr(0, 0);
+ enable_counter(0);
+
+ /* Issue a hypercall to enter EL2 and return */
+ memset(&res, 0, sizeof(res));
+ smccc_hvc(ARM_SMCCC_VERSION_FUNC_ID, 0, 0, 0, 0, 0, 0, 0, &res);
+
+ cnt = acc->read_cntr(0);
+ GUEST_ASSERT_3(cnt == 0, cnt, typer, i);
+ }
+
+ /* Check the same sequence for the Cycle counter */
+ write_pmccfiltr(0xff000000);
+ typer = read_pmccfiltr();
+ GUEST_ASSERT_2((typer | ARMV8_PMU_EVTYPE_EVENT) == ARMV8_PMU_EVTYPE_MASK,
+ typer | ARMV8_PMU_EVTYPE_EVENT, ARMV8_PMU_EVTYPE_MASK);
+
+ typer = ARMV8_PMU_INCLUDE_EL2 | ARMV8_PMU_EXCLUDE_EL1 | ARMV8_PMU_EXCLUDE_EL0;
+ write_pmccfiltr(typer);
+ reset_cycle_counter();
+ enable_cycle_counter();
+
+ /* Issue a hypercall to enter EL2 and return */
+ memset(&res, 0, sizeof(res));
+ smccc_hvc(ARM_SMCCC_VERSION_FUNC_ID, 0, 0, 0, 0, 0, 0, 0, &res);
+
+ cnt = read_cycle_counter();
+ GUEST_ASSERT_2(cnt == 0, cnt, typer);
+}
+
static void guest_code(void)
{
switch (guest_data.test_stage) {
@@ -687,6 +757,9 @@ static void guest_code(void)
case TEST_STAGE_KVM_EVENT_FILTER:
guest_event_filter_test(guest_data.pmu_filter);
break;
+ case TEST_STAGE_KVM_EVTYPE_FILTER:
+ guest_evtype_filter_test();
+ break;
default:
GUEST_ASSERT_1(0, guest_data.test_stage);
}
@@ -1014,10 +1087,22 @@ static void run_kvm_event_filter_test(void)
run_kvm_event_filter_error_tests();
}
+static void run_kvm_evtype_filter_test(void)
+{
+ struct vpmu_vm *vpmu_vm;
+
+ guest_data.test_stage = TEST_STAGE_KVM_EVTYPE_FILTER;
+
+ vpmu_vm = create_vpmu_vm(guest_code, NULL);
+ run_vcpu(vpmu_vm->vcpu);
+ destroy_vpmu_vm(vpmu_vm);
+}
+
static void run_tests(uint64_t pmcr_n)
{
run_counter_access_tests(pmcr_n);
run_kvm_event_filter_test();
+ run_kvm_evtype_filter_test();
}
/*
--
2.39.1.581.gbfd45094c4-goog
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2023-02-13 18:02 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-02-13 18:02 [PATCH 00/13] Extend the vPMU selftest Raghavendra Rao Ananta
2023-02-13 18:02 ` Raghavendra Rao Ananta
2023-02-13 18:02 ` [PATCH 01/13] selftests: KVM: aarch64: Rename vpmu_counter_access.c to vpmu_test.c Raghavendra Rao Ananta
2023-02-13 18:02 ` Raghavendra Rao Ananta
2023-02-13 18:02 ` [PATCH 02/13] selftests: KVM: aarch64: Refactor the vPMU counter access tests Raghavendra Rao Ananta
2023-02-13 18:02 ` Raghavendra Rao Ananta
2023-02-13 18:02 ` [PATCH 03/13] tools: arm64: perf_event: Define Cycle counter enable/overflow bits Raghavendra Rao Ananta
2023-02-13 18:02 ` Raghavendra Rao Ananta
2023-02-13 18:02 ` [PATCH 04/13] selftests: KVM: aarch64: Add PMU cycle counter helpers Raghavendra Rao Ananta
2023-02-13 18:02 ` Raghavendra Rao Ananta
2023-02-13 18:02 ` [PATCH 05/13] selftests: KVM: aarch64: Consider PMU event filters for VM creation Raghavendra Rao Ananta
2023-02-13 18:02 ` Raghavendra Rao Ananta
2023-02-13 18:02 ` [PATCH 06/13] selftests: KVM: aarch64: Add KVM PMU event filter test Raghavendra Rao Ananta
2023-02-13 18:02 ` Raghavendra Rao Ananta
2023-02-13 18:02 ` Raghavendra Rao Ananta [this message]
2023-02-13 18:02 ` [PATCH 07/13] selftests: KVM: aarch64: Add KVM EVTYPE filter PMU test Raghavendra Rao Ananta
2023-02-13 18:02 ` [PATCH 08/13] selftests: KVM: aarch64: Add vCPU migration test for PMU Raghavendra Rao Ananta
2023-02-13 18:02 ` Raghavendra Rao Ananta
2023-02-13 18:02 ` [PATCH 09/13] selftests: KVM: aarch64: Test PMU overflow/IRQ functionality Raghavendra Rao Ananta
2023-02-13 18:02 ` Raghavendra Rao Ananta
2023-02-13 18:02 ` [PATCH 10/13] selftests: KVM: aarch64: Test chained events for PMU Raghavendra Rao Ananta
2023-02-13 18:02 ` Raghavendra Rao Ananta
2023-02-13 18:02 ` [PATCH 11/13] selftests: KVM: aarch64: Add PMU test to chain all the counters Raghavendra Rao Ananta
2023-02-13 18:02 ` Raghavendra Rao Ananta
2023-02-13 18:02 ` [PATCH 12/13] selftests: KVM: aarch64: Add multi-vCPU support for vPMU VM creation Raghavendra Rao Ananta
2023-02-13 18:02 ` Raghavendra Rao Ananta
2023-02-13 18:02 ` [PATCH 13/13] selftests: KVM: aarch64: Extend the vCPU migration test to multi-vCPUs Raghavendra Rao Ananta
2023-02-13 18:02 ` Raghavendra Rao Ananta
2023-02-13 23:39 ` [PATCH 00/13] Extend the vPMU selftest Raghavendra Rao Ananta
2023-02-13 23:39 ` Raghavendra Rao Ananta
2023-02-14 8:19 ` Oliver Upton
2023-02-14 8:19 ` Oliver Upton
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=20230213180234.2885032-8-rananta@google.com \
--to=rananta@google.com \
--cc=coltonlewis@google.com \
--cc=james.morse@arm.com \
--cc=jingzhangos@google.com \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.linux.dev \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=maz@kernel.org \
--cc=oupton@google.com \
--cc=pbonzini@redhat.com \
--cc=reijiw@google.com \
--cc=ricarkol@google.com \
--cc=suzuki.poulose@arm.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.