From patchwork Thu Feb 29 06:56:19 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shaoqin Huang X-Patchwork-Id: 208223 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:2097:b0:108:e6aa:91d0 with SMTP id gs23csp216643dyb; Wed, 28 Feb 2024 22:58:53 -0800 (PST) X-Forwarded-Encrypted: i=3; AJvYcCVsam9Yso96GkL99PYq6CM7VJA8W4Qh1DFWz+5AdjMBuwNJWdDhSBiDgBsWFlKLkgycyPxHVY0/rgv+QVaqSCDzz78Ofg== X-Google-Smtp-Source: AGHT+IFQgXctCZzwcRB/pZxFvii011k/PGDFykpGgvlhZjacY7pKSYbywBPc5O9lWBGh3bRm+66W X-Received: by 2002:a05:6214:4a4b:b0:68f:5d44:b80 with SMTP id ph11-20020a0562144a4b00b0068f5d440b80mr1265201qvb.29.1709189933239; Wed, 28 Feb 2024 22:58:53 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1709189933; cv=pass; d=google.com; s=arc-20160816; b=WNFw99GRillfQrR1AVTGY/fwvvFR5C4mhrhVgzPoKTkd38KPHuybn0SaniE95XiUly UD8+/gqOXFO4LXt+NhKYw/chgsrbuoCuiN0UnmO6fNNMMyF9FyoDkOg9qYbPn4hnZGf7 mRi6lVI8f8faU1pfmoJqo7iTnAQiDRR9qMZ/xdU1EGyO5t7aFi6LzYV2IYG+/x07qn+1 yeWDE/KQowCSRYjuFr4D9//YS8OlsqF5Q00yS+A1mjTKmgBAhtB931WgoUcgOcom3ruI 2jur4BCyT0kCPBE/zHg1+PgzONKfDUE4YEU5tA2kevM5hd0SMV6VraF+yVe6ShrvIDRk nkPg== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=YFmwQWt00Kaj3Ot93eqM53gw7IrZWb5swPo/SmIieP0=; fh=5oSt14lwq4/RPFHd+JFpAcI7HGmicBIhmFBb0IsqPrA=; b=Tg8spNUWRLehOaSDqKBbApQCxxMwSSvV+7LKOxA/NXYd5gZAdmZJxtl8uJMS5dP/xE wmwpTAEzcpreEI9HgfcxHuhoKDknwLV7uEZmFzct2q8O6fizpIP2j32qHl+yCTlbwXzS bhugr+KCN4bdQ7WLmbZ6EyQhAQoRRK1BuCvXsvVKXFhQ/o7pzKEcmTGxHRhdix9Zrtdh ktpzYTjMbiMdMuQHO6z0eazD/lmNikrXYxXF4T5yfxhEm6JEUp1UZVhBpVdLwdAoQL3t V5DPkz+2HJxgrM+CgRmIkMiOXguV0xKCdWL8LMmfSOASmYeH1CDsdQoAlaIFLE2XiR2d LEvg==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=KU0Rzqq9; arc=pass (i=1 spf=pass spfdomain=redhat.com dkim=pass dkdomain=redhat.com dmarc=pass fromdomain=redhat.com); spf=pass (google.com: domain of linux-kernel+bounces-86201-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-86201-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [2604:1380:45d1:ec00::1]) by mx.google.com with ESMTPS id c4-20020a056214224400b0068f99fe364dsi807989qvc.483.2024.02.28.22.58.53 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 28 Feb 2024 22:58:53 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-86201-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) client-ip=2604:1380:45d1:ec00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=KU0Rzqq9; arc=pass (i=1 spf=pass spfdomain=redhat.com dkim=pass dkdomain=redhat.com dmarc=pass fromdomain=redhat.com); spf=pass (google.com: domain of linux-kernel+bounces-86201-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-86201-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id F36D71C2135B for ; Thu, 29 Feb 2024 06:58:52 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 495A547F7C; Thu, 29 Feb 2024 06:58:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="KU0Rzqq9" Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 674E33CF6E for ; Thu, 29 Feb 2024 06:58:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709189883; cv=none; b=K0BVYoH0oBk75ql9NNVi+QnPrDAeC/HJfX/cnGSmsweKkls+OK3jNt4JQjyoaTVRw13MhLOdcQhtFnvkflHWu8nvA76z9xVUTpUPlM33PRYhpwCg9aNfKehh9hegdl0r3geOjnrnoIGLMusefFVZaNaPPd9Awznvk5V+0QOruZo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709189883; c=relaxed/simple; bh=kSl3pHe/ihRWWBrf1Tezc0PNoeKDj3aNbp4aK+ZcfUs=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=GeAuXw9nqc0+BfHGLdy0S32q/ffPkXW3ekdArGuV/Rdtrwa0DQD2TAGc0alcOs53wEFMCOKboVQViRRYhZOHUBfFQlqaKQDTVqd8dJ3P465FGUciS8HKY2vpAApqPsVFXWiM/t/21KYx0goPMQOfi/7QsCWYrTMnh+weAiye4Ck= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=KU0Rzqq9; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1709189879; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=YFmwQWt00Kaj3Ot93eqM53gw7IrZWb5swPo/SmIieP0=; b=KU0Rzqq9Th7y+JH2tQUObiwn4ZyMAcaxL0hZECiLoD2XdcWXED+EzNjsW16kGNSDU9SiF1 hih70MdboIbMXbw6A+Bdj4zrfaOZEjFNgkjG/hBm7psTMzcG1NamEsY4f0aRCP1rdRHqhU mkzgBdLYQ+6Dvu8L3odlulNhxqEUN5U= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-659-dGxUhgedMeCDdf-lt5JrlQ-1; Thu, 29 Feb 2024 01:57:55 -0500 X-MC-Unique: dGxUhgedMeCDdf-lt5JrlQ-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.rdu2.redhat.com [10.11.54.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 55E9B185A784; Thu, 29 Feb 2024 06:57:55 +0000 (UTC) Received: from virt-mtcollins-01.lab.eng.rdu2.redhat.com (virt-mtcollins-01.lab.eng.rdu2.redhat.com [10.8.1.196]) by smtp.corp.redhat.com (Postfix) with ESMTP id 45FF148B; Thu, 29 Feb 2024 06:57:55 +0000 (UTC) From: Shaoqin Huang To: Oliver Upton , Marc Zyngier , kvmarm@lists.linux.dev Cc: Eric Auger , Shaoqin Huang , James Morse , Suzuki K Poulose , Zenghui Yu , Paolo Bonzini , Shuah Khan , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvm@vger.kernel.org, linux-kselftest@vger.kernel.org Subject: [PATCH v5 1/3] KVM: selftests: aarch64: Add helper function for the vpmu vcpu creation Date: Thu, 29 Feb 2024 01:56:19 -0500 Message-Id: <20240229065625.114207-2-shahuang@redhat.com> In-Reply-To: <20240229065625.114207-1-shahuang@redhat.com> References: <20240229065625.114207-1-shahuang@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.1 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1792215543684813479 X-GMAIL-MSGID: 1792215543684813479 Create a vcpu with vpmu would be a common requirement for the vpmu test, so add the helper function for the vpmu vcpu creation. And use those helper function in the vpmu_counter_access.c test. Use this chance to delete the meaningless ASSERT about the pmuver, because KVM does not advertise an IMP_DEF PMU to guests. No functional changes intended. Signed-off-by: Shaoqin Huang --- .../kvm/aarch64/vpmu_counter_access.c | 33 ++++--------------- .../selftests/kvm/include/aarch64/vpmu.h | 29 ++++++++++++++++ 2 files changed, 36 insertions(+), 26 deletions(-) create mode 100644 tools/testing/selftests/kvm/include/aarch64/vpmu.h diff --git a/tools/testing/selftests/kvm/aarch64/vpmu_counter_access.c b/tools/testing/selftests/kvm/aarch64/vpmu_counter_access.c index 5f9713364693..e068a0a7a43b 100644 --- a/tools/testing/selftests/kvm/aarch64/vpmu_counter_access.c +++ b/tools/testing/selftests/kvm/aarch64/vpmu_counter_access.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -426,18 +427,8 @@ static void guest_code(uint64_t expected_pmcr_n) /* Create a VM that has one vCPU with PMUv3 configured. */ static void create_vpmu_vm(void *guest_code) { - struct kvm_vcpu_init init; - uint8_t pmuver, ec; - uint64_t dfr0, irq = 23; - struct kvm_device_attr irq_attr = { - .group = KVM_ARM_VCPU_PMU_V3_CTRL, - .attr = KVM_ARM_VCPU_PMU_V3_IRQ, - .addr = (uint64_t)&irq, - }; - struct kvm_device_attr init_attr = { - .group = KVM_ARM_VCPU_PMU_V3_CTRL, - .attr = KVM_ARM_VCPU_PMU_V3_INIT, - }; + uint8_t ec; + uint64_t irq = 23; /* The test creates the vpmu_vm multiple times. Ensure a clean state */ memset(&vpmu_vm, 0, sizeof(vpmu_vm)); @@ -449,27 +440,17 @@ static void create_vpmu_vm(void *guest_code) guest_sync_handler); } - /* Create vCPU with PMUv3 */ - vm_ioctl(vpmu_vm.vm, KVM_ARM_PREFERRED_TARGET, &init); - init.features[0] |= (1 << KVM_ARM_VCPU_PMU_V3); - vpmu_vm.vcpu = aarch64_vcpu_add(vpmu_vm.vm, 0, &init, guest_code); + vpmu_vm.vcpu = vm_vcpu_add_with_vpmu(vpmu_vm.vm, 0, guest_code); vcpu_init_descriptor_tables(vpmu_vm.vcpu); + vpmu_vm.gic_fd = vgic_v3_setup(vpmu_vm.vm, 1, 64, GICD_BASE_GPA, GICR_BASE_GPA); __TEST_REQUIRE(vpmu_vm.gic_fd >= 0, "Failed to create vgic-v3, skipping"); - /* Make sure that PMUv3 support is indicated in the ID register */ - vcpu_get_reg(vpmu_vm.vcpu, - KVM_ARM64_SYS_REG(SYS_ID_AA64DFR0_EL1), &dfr0); - pmuver = FIELD_GET(ARM64_FEATURE_MASK(ID_AA64DFR0_EL1_PMUVer), dfr0); - TEST_ASSERT(pmuver != ID_AA64DFR0_EL1_PMUVer_IMP_DEF && - pmuver >= ID_AA64DFR0_EL1_PMUVer_IMP, - "Unexpected PMUVER (0x%x) on the vCPU with PMUv3", pmuver); - /* Initialize vPMU */ - vcpu_ioctl(vpmu_vm.vcpu, KVM_SET_DEVICE_ATTR, &irq_attr); - vcpu_ioctl(vpmu_vm.vcpu, KVM_SET_DEVICE_ATTR, &init_attr); + vpmu_set_irq(vpmu_vm.vcpu, irq); + vpmu_init(vpmu_vm.vcpu); } static void destroy_vpmu_vm(void) diff --git a/tools/testing/selftests/kvm/include/aarch64/vpmu.h b/tools/testing/selftests/kvm/include/aarch64/vpmu.h new file mode 100644 index 000000000000..0dfcc7ab1c4d --- /dev/null +++ b/tools/testing/selftests/kvm/include/aarch64/vpmu.h @@ -0,0 +1,29 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#include + +static inline struct kvm_vcpu *vm_vcpu_add_with_vpmu(struct kvm_vm *vm, + uint32_t vcpu_id, + void *guest_code) +{ + struct kvm_vcpu_init init; + + /* Create vCPU with PMUv3 */ + vm_ioctl(vm, KVM_ARM_PREFERRED_TARGET, &init); + init.features[0] |= (1 << KVM_ARM_VCPU_PMU_V3); + + return aarch64_vcpu_add(vm, 0, &init, guest_code); +} + +static void vpmu_set_irq(struct kvm_vcpu *vcpu, int irq) +{ + kvm_device_attr_set(vcpu->fd, KVM_ARM_VCPU_PMU_V3_CTRL, + KVM_ARM_VCPU_PMU_V3_IRQ, &irq); +} + +static void vpmu_init(struct kvm_vcpu *vcpu) +{ + kvm_device_attr_set(vcpu->fd, KVM_ARM_VCPU_PMU_V3_CTRL, + KVM_ARM_VCPU_PMU_V3_INIT, NULL); +} + From patchwork Thu Feb 29 06:56:20 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shaoqin Huang X-Patchwork-Id: 208224 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:2097:b0:108:e6aa:91d0 with SMTP id gs23csp216714dyb; Wed, 28 Feb 2024 22:59:09 -0800 (PST) X-Forwarded-Encrypted: i=3; AJvYcCUNaYU0T1NADFHwbKWxS7bJpkyk2Q6IZE3wMu/Wj3+Vvuzv+Bsz6Z45LhOYDKn7moO4Vt3rVV6af6oErA2XoqtsPAaT3w== X-Google-Smtp-Source: AGHT+IHmgWxeg3ioqj9nbzv7zpDRWz3k2BT8vYsDa1OKmhy6TNFjKVpo/UKhzVHWrCwK908EKMab X-Received: by 2002:a05:6808:30a1:b0:3c1:c3b4:c722 with SMTP id bl33-20020a05680830a100b003c1c3b4c722mr1466399oib.2.1709189949200; Wed, 28 Feb 2024 22:59:09 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1709189949; cv=pass; d=google.com; s=arc-20160816; b=CKjWYpj9h29X9Najgz/XGicHFin9uUumpQvbt8/Jw5n1tj7eXMNshz3plJYVNuPH4d BoOceiRUfiGesjfd2NvhDXCJg8jblq2pTwyhfhrdGTpSTaCsPItM+pMP4ZkuAe2sT7r7 yFPmYohOHdhchpqFIqjZy74Kj4E5ffzNogQ0tJ/IGgEPo9LGTV4491RlbaP/8dl7VO2f TPTGZIFGXKVT3mXvlr5QXDTjnUeymnuUYKMHecJVTIrVkWh+vQLu8W2DngtOHWpz42r2 loYgL9Af1Tbxh0Jg15KNzZTsd9jSeOdlafvcKLrx4QvCwH23S8aYPpdWRBlwV82o8zBx R/pg== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=02i6fY+fPmPC8X6hJSYnxH6qLlj2LoMQMB24Eg6hdaM=; fh=879xdiqzWURCyCfdxkLuo0iLZdh7U5YG6OMWr7e/hrg=; b=u7fYwvFBca8Ua8SGpNvahKWUGjcBj+REdgRR0o/wPvubTbUzVBFzF/LXzGx2vFQyh8 nFeL/urmhlnQ5ocTNDlaFGe8HhlBbumOFH3CqF58oGIR9FN7E992im84KSIJRjd/v1/c jO/pAQUde1vi0MsDd2M1U89VgOH/apVtfjfNUWAyjxDpXZDO5ieITf35QeD6eNj6XXyE UfFJMKjxuvDB3txW9pcVX8GXFPziUKlzuTVVuYRMBuVDctYYaBvn3ui4wC6krG4YHTT/ lMSJuSTEuLzJi6BbIyD8YtooLhUvDZ5YfSYVxzQStEQ8RXAdgrIsUOYt4RNAzMfWHj+c dNVA==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=LVjcL3Fy; arc=pass (i=1 spf=pass spfdomain=redhat.com dkim=pass dkdomain=redhat.com dmarc=pass fromdomain=redhat.com); spf=pass (google.com: domain of linux-kernel+bounces-86202-ouuuleilei=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-86202-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [139.178.88.99]) by mx.google.com with ESMTPS id j2-20020a056a00234200b006e46627907asi736296pfj.4.2024.02.28.22.59.09 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 28 Feb 2024 22:59:09 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-86202-ouuuleilei=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) client-ip=139.178.88.99; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=LVjcL3Fy; arc=pass (i=1 spf=pass spfdomain=redhat.com dkim=pass dkdomain=redhat.com dmarc=pass fromdomain=redhat.com); spf=pass (google.com: domain of linux-kernel+bounces-86202-ouuuleilei=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-86202-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id F2475286C0F for ; Thu, 29 Feb 2024 06:59:08 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id E5A98482F6; Thu, 29 Feb 2024 06:58:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="LVjcL3Fy" Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 04D13446B8 for ; Thu, 29 Feb 2024 06:58:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709189883; cv=none; b=KiUY6EAh8yhtkOl7Wbg4qjuF+In0afdGtxxZVJuLvrN2conS8jzX5cogPRl5pOFTx/je/2Om0hxzAle5pMobr74dP/CceukTxSJDwLk+vpiKWC9bMdDd9xbUaoxFnzbLzmCf6EL0DiMhnplQQNXGXu4TpoVOIY/SQrZ0eEQwFK8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709189883; c=relaxed/simple; bh=9mm5PapjAKNuxEPWMlnA9tx41y0i9D0f48rDyKhBNNk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=lBf8ikbPFrEnDJ8CwyltwJoLzlGvusBHXi5+gPHzo/yZgGiaD3x+jeuFWX90ij3fndqP4Ld7pGlcrNdcI7JlwLeW8ZLDL9lGoE0cZp8URE/A7NOVRf6EZb9s8lw0kH5clBlMcuTTkxBjdnxbb5mGVjSZgNzBrdrdemMPJ1GZUzE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=LVjcL3Fy; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1709189880; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=02i6fY+fPmPC8X6hJSYnxH6qLlj2LoMQMB24Eg6hdaM=; b=LVjcL3FySgeYcR343PkPStRku6RQXo6lqdoLZJFmdO5lZ1lDQHLB03Cs3vE+cFTS0a2n6L /sJ1CIWJmUpw1cNCn5Vn6JDdOWtrhmzW7bWn2YwXs790sKDl6v9sZfT0M1nuQd4fGzvdOO 6EOHNYy05bJMedo5vGt4UyXACZgBiHQ= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-561-7IvNft_KN7OmKSmHElqXhA-1; Thu, 29 Feb 2024 01:57:57 -0500 X-MC-Unique: 7IvNft_KN7OmKSmHElqXhA-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.rdu2.redhat.com [10.11.54.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 219FD185A783; Thu, 29 Feb 2024 06:57:57 +0000 (UTC) Received: from virt-mtcollins-01.lab.eng.rdu2.redhat.com (virt-mtcollins-01.lab.eng.rdu2.redhat.com [10.8.1.196]) by smtp.corp.redhat.com (Postfix) with ESMTP id 13C60F63F3; Thu, 29 Feb 2024 06:57:57 +0000 (UTC) From: Shaoqin Huang To: Oliver Upton , Marc Zyngier , kvmarm@lists.linux.dev Cc: Eric Auger , Shaoqin Huang , Paolo Bonzini , Shuah Khan , James Morse , Suzuki K Poulose , Zenghui Yu , linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH v5 2/3] KVM: selftests: aarch64: Introduce pmu_event_filter_test Date: Thu, 29 Feb 2024 01:56:20 -0500 Message-Id: <20240229065625.114207-3-shahuang@redhat.com> In-Reply-To: <20240229065625.114207-1-shahuang@redhat.com> References: <20240229065625.114207-1-shahuang@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.1 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1792215515936301750 X-GMAIL-MSGID: 1792215560102087743 Introduce pmu_event_filter_test for arm64 platforms. The test configures PMUv3 for a vCPU, and sets different pmu event filters for the vCPU, and check if the guest can see those events which user allow and can't use those events which use deny. This test refactor the create_vpmu_vm() and make it a wrapper for __create_vpmu_vm(), which allows some extra init code before KVM_ARM_VCPU_PMU_V3_INIT. And this test use the KVM_ARM_VCPU_PMU_V3_FILTER attribute to set the pmu event filter in KVM. And choose to filter two common event branches_retired and instructions_retired, and let the guest to check if it see the right pmceid register. Signed-off-by: Shaoqin Huang --- tools/testing/selftests/kvm/Makefile | 1 + .../kvm/aarch64/pmu_event_filter_test.c | 287 ++++++++++++++++++ 2 files changed, 288 insertions(+) create mode 100644 tools/testing/selftests/kvm/aarch64/pmu_event_filter_test.c diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile index 492e937fab00..732ca5f8bfc0 100644 --- a/tools/testing/selftests/kvm/Makefile +++ b/tools/testing/selftests/kvm/Makefile @@ -147,6 +147,7 @@ TEST_GEN_PROGS_aarch64 += aarch64/arch_timer TEST_GEN_PROGS_aarch64 += aarch64/debug-exceptions TEST_GEN_PROGS_aarch64 += aarch64/hypercalls TEST_GEN_PROGS_aarch64 += aarch64/page_fault_test +TEST_GEN_PROGS_aarch64 += aarch64/pmu_event_filter_test TEST_GEN_PROGS_aarch64 += aarch64/psci_test TEST_GEN_PROGS_aarch64 += aarch64/set_id_regs TEST_GEN_PROGS_aarch64 += aarch64/smccc_filter diff --git a/tools/testing/selftests/kvm/aarch64/pmu_event_filter_test.c b/tools/testing/selftests/kvm/aarch64/pmu_event_filter_test.c new file mode 100644 index 000000000000..2dd8ea418f47 --- /dev/null +++ b/tools/testing/selftests/kvm/aarch64/pmu_event_filter_test.c @@ -0,0 +1,287 @@ + +// SPDX-License-Identifier: GPL-2.0 +/* + * pmu_event_filter_test - Test user limit pmu event for guest. + * + * Copyright (c) 2023 Red Hat, Inc. + * + * This test checks if the guest only see the limited pmu event that userspace + * sets, if the guest can use those events which user allow, and if the guest + * can't use those events which user deny. + * This test runs only when KVM_CAP_ARM_PMU_V3, KVM_ARM_VCPU_PMU_V3_FILTER + * is supported on the host. + */ +#include +#include +#include +#include +#include +#include + +struct pmu_common_event_ids { + uint64_t pmceid0; + uint64_t pmceid1; +} max_pmce, expected_pmce; + +struct vpmu_vm { + struct kvm_vm *vm; + struct kvm_vcpu *vcpu; + int gic_fd; +}; + +static struct vpmu_vm vpmu_vm; + +#define FILTER_NR 10 + +struct test_desc { + const char *name; + struct kvm_pmu_event_filter filter[FILTER_NR]; +}; + +#define __DEFINE_FILTER(base, num, act) \ + ((struct kvm_pmu_event_filter) { \ + .base_event = base, \ + .nevents = num, \ + .action = act, \ + }) + +#define DEFINE_FILTER(base, act) __DEFINE_FILTER(base, 1, act) + +static void guest_code(void) +{ + uint64_t pmceid0 = read_sysreg(pmceid0_el0); + uint64_t pmceid1 = read_sysreg(pmceid1_el0); + + GUEST_ASSERT_EQ(expected_pmce.pmceid0, pmceid0); + GUEST_ASSERT_EQ(expected_pmce.pmceid1, pmceid1); + + GUEST_DONE(); +} + +static void guest_get_pmceid(void) +{ + max_pmce.pmceid0 = read_sysreg(pmceid0_el0); + max_pmce.pmceid1 = read_sysreg(pmceid1_el0); + + GUEST_DONE(); +} + +static void run_vcpu(struct kvm_vcpu *vcpu) +{ + struct ucall uc; + + while (1) { + vcpu_run(vcpu); + switch (get_ucall(vcpu, &uc)) { + case UCALL_DONE: + return; + case UCALL_ABORT: + REPORT_GUEST_ASSERT(uc); + break; + default: + TEST_FAIL("Unknown ucall %lu", uc.cmd); + } + } +} + +static void set_pmce(struct pmu_common_event_ids *pmce, int action, int event) +{ + int base = 0; + uint64_t *pmceid = NULL; + + if (event >= 0x4000) { + event -= 0x4000; + base = 32; + } + + if (event >= 0 && event <= 0x1F) { + pmceid = &pmce->pmceid0; + } else if (event >= 0x20 && event <= 0x3F) { + event -= 0x20; + pmceid = &pmce->pmceid1; + } else { + return; + } + + event += base; + if (action == KVM_PMU_EVENT_ALLOW) + *pmceid |= BIT(event); + else + *pmceid &= ~BIT(event); +} + +static void prepare_expected_pmce(struct kvm_pmu_event_filter *filter) +{ + struct pmu_common_event_ids pmce_mask = { ~0, ~0 }; + bool first_filter = true; + + while (filter && filter->nevents != 0) { + if (first_filter) { + if (filter->action == KVM_PMU_EVENT_ALLOW) + memset(&pmce_mask, 0, sizeof(pmce_mask)); + first_filter = false; + } + + set_pmce(&pmce_mask, filter->action, filter->base_event); + filter++; + } + + expected_pmce.pmceid0 = max_pmce.pmceid0 & pmce_mask.pmceid0; + expected_pmce.pmceid1 = max_pmce.pmceid1 & pmce_mask.pmceid1; +} + +static void pmu_event_filter_init(struct kvm_pmu_event_filter *filter) +{ + while (filter && filter->nevents != 0) { + kvm_device_attr_set(vpmu_vm.vcpu->fd, + KVM_ARM_VCPU_PMU_V3_CTRL, + KVM_ARM_VCPU_PMU_V3_FILTER, + filter); + filter++; + } +} + +#define GICD_BASE_GPA 0x8000000ULL +#define GICR_BASE_GPA 0x80A0000ULL + +/* Create a VM that has one vCPU with PMUv3 configured. */ +static void create_vpmu_vm_with_filter(void *guest_code, + struct kvm_pmu_event_filter *filter) +{ + uint64_t irq = 23; + + /* The test creates the vpmu_vm multiple times. Ensure a clean state */ + memset(&vpmu_vm, 0, sizeof(vpmu_vm)); + + vpmu_vm.vm = vm_create(1); + vpmu_vm.vcpu = vm_vcpu_add_with_vpmu(vpmu_vm.vm, 0, guest_code); + vpmu_vm.gic_fd = vgic_v3_setup(vpmu_vm.vm, 1, 64, + GICD_BASE_GPA, GICR_BASE_GPA); + __TEST_REQUIRE(vpmu_vm.gic_fd >= 0, + "Failed to create vgic-v3, skipping"); + + pmu_event_filter_init(filter); + + /* Initialize vPMU */ + vpmu_set_irq(vpmu_vm.vcpu, irq); + vpmu_init(vpmu_vm.vcpu); +} + +static void create_vpmu_vm(void *guest_code) +{ + create_vpmu_vm_with_filter(guest_code, NULL); +} + +static void destroy_vpmu_vm(void) +{ + close(vpmu_vm.gic_fd); + kvm_vm_free(vpmu_vm.vm); +} + +static void run_test(struct test_desc *t) +{ + pr_info("Test: %s\n", t->name); + + create_vpmu_vm_with_filter(guest_code, t->filter); + prepare_expected_pmce(t->filter); + sync_global_to_guest(vpmu_vm.vm, expected_pmce); + + run_vcpu(vpmu_vm.vcpu); + + destroy_vpmu_vm(); +} + +static struct test_desc tests[] = { + { + .name = "without_filter", + .filter = { + { 0 } + }, + }, + { + .name = "member_allow_filter", + .filter = { + DEFINE_FILTER(ARMV8_PMUV3_PERFCTR_SW_INCR, 0), + DEFINE_FILTER(ARMV8_PMUV3_PERFCTR_INST_RETIRED, 0), + DEFINE_FILTER(ARMV8_PMUV3_PERFCTR_BR_RETIRED, 0), + { 0 }, + }, + }, + { + .name = "member_deny_filter", + .filter = { + DEFINE_FILTER(ARMV8_PMUV3_PERFCTR_SW_INCR, 1), + DEFINE_FILTER(ARMV8_PMUV3_PERFCTR_INST_RETIRED, 1), + DEFINE_FILTER(ARMV8_PMUV3_PERFCTR_BR_RETIRED, 1), + { 0 }, + }, + }, + { + .name = "not_member_deny_filter", + .filter = { + DEFINE_FILTER(ARMV8_PMUV3_PERFCTR_SW_INCR, 1), + { 0 }, + }, + }, + { + .name = "not_member_allow_filter", + .filter = { + DEFINE_FILTER(ARMV8_PMUV3_PERFCTR_SW_INCR, 0), + { 0 }, + }, + }, + { + .name = "deny_chain_filter", + .filter = { + DEFINE_FILTER(ARMV8_PMUV3_PERFCTR_CHAIN, 1), + { 0 }, + }, + }, + { + .name = "deny_cpu_cycles_filter", + .filter = { + DEFINE_FILTER(ARMV8_PMUV3_PERFCTR_CPU_CYCLES, 1), + { 0 }, + }, + }, + { + .name = "cancle_filter", + .filter = { + DEFINE_FILTER(ARMV8_PMUV3_PERFCTR_CPU_CYCLES, 0), + DEFINE_FILTER(ARMV8_PMUV3_PERFCTR_CPU_CYCLES, 1), + }, + }, + { 0 } +}; + +static void run_tests(void) +{ + struct test_desc *t; + + for (t = &tests[0]; t->name; t++) + run_test(t); +} + +static bool kvm_pmu_support_events(void) +{ + create_vpmu_vm(guest_get_pmceid); + + memset(&max_pmce, 0, sizeof(max_pmce)); + sync_global_to_guest(vpmu_vm.vm, max_pmce); + run_vcpu(vpmu_vm.vcpu); + sync_global_from_guest(vpmu_vm.vm, max_pmce); + destroy_vpmu_vm(); + + return max_pmce.pmceid0 & + (ARMV8_PMUV3_PERFCTR_BR_RETIRED | + ARMV8_PMUV3_PERFCTR_INST_RETIRED | + ARMV8_PMUV3_PERFCTR_CHAIN); +} + +int main(void) +{ + TEST_REQUIRE(kvm_has_cap(KVM_CAP_ARM_PMU_V3)); + TEST_REQUIRE(kvm_pmu_support_events()); + + run_tests(); +} From patchwork Thu Feb 29 06:56:21 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shaoqin Huang X-Patchwork-Id: 208225 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:2097:b0:108:e6aa:91d0 with SMTP id gs23csp216720dyb; Wed, 28 Feb 2024 22:59:10 -0800 (PST) X-Forwarded-Encrypted: i=3; AJvYcCX4perQK4fdiMgB8UZfScdT06lTAyfMP6vvFfY5ayKQs0HBcHmtjV9xMDHrwQ96+mrnjFE/ZgLliswdDRBAnAuOiqTj/g== X-Google-Smtp-Source: AGHT+IHCzgfEWzBBKqZJDia5RLJgqwdEG6vdtzUysf/6G1zA46sBbST79Wm4t9mHVB/vbba0Jm9b X-Received: by 2002:a05:6a20:9f4a:b0:19e:bd3e:76e1 with SMTP id ml10-20020a056a209f4a00b0019ebd3e76e1mr1683522pzb.48.1709189950251; Wed, 28 Feb 2024 22:59:10 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1709189950; cv=pass; d=google.com; s=arc-20160816; b=YZNHpwVp/T8ho+IkWxzAavQSS9MIx4uqeTE677P1228AQUedJuru7AXuffbubKoDls koor69+Tvbd9gqOZBQ1zHKFQ4al1ToONWMM+PHHb7E3VK9O/K3SyQuZe5jItSeJeMqao aH8Ydq9e5MS4xLhJRls8oMU+xW7Hl+c/RmmNxnecr1tD5o4BXEnXt8Nm+uor5esu4Hhq TDmgvnc63S26oWQDwdM78e02TpPrg9P9WuPZ49dELHaNBflcwOeMHqVN/gexvyHsWmMa 3TmRnS3kalszBGbYv2SencdtI39icCCusGAjdP4CQaWYMtHKNP31S70nMAozgEuWdvwD kx9Q== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=O548D4ZJM+qQxwtnpg5UXQkiY5ZV60J3DSbyn2ZI5lc=; fh=U3XTG3/wmm+g74EZBmJF/aM+/HTKNpU7QIMmvSNz7bI=; b=dbzNOqIiY99akjCzQ0rS/QHkxlw4zJNK4ZoDVvLzFAFtsdEqpPwzyAHWHxbvAL9Tif sAY4azBG6LEeMQxitqfBZ70jidSuT0GIn3e9QRH+PVjPmF7KBHBJKMlsRXneL5sSD9Dn 5GGhYpILPctcNMRfvu1jpOEs+3MGIvtXICxGU2hZXvEshr+9s8b0AhTwYOSrm0DuE+kv Ml30yS0QynbFS1mXSG8wM91SmnDdUHKZEsWE8+a9ECWy3kUWmQjmNNnuFhVh8WRjb5TV YviDfUSLSQjnq9A23vuIalrtUbOQw40ugh8KQHY5yzGcFc18T65SYAQ60lIvVmc4/MgG cyFg==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=QMmFOdT0; arc=pass (i=1 spf=pass spfdomain=redhat.com dkim=pass dkdomain=redhat.com dmarc=pass fromdomain=redhat.com); spf=pass (google.com: domain of linux-kernel+bounces-86203-ouuuleilei=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-86203-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [139.178.88.99]) by mx.google.com with ESMTPS id l6-20020a170903244600b001dc9222b1besi740938pls.503.2024.02.28.22.59.10 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 28 Feb 2024 22:59:10 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-86203-ouuuleilei=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) client-ip=139.178.88.99; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=QMmFOdT0; arc=pass (i=1 spf=pass spfdomain=redhat.com dkim=pass dkdomain=redhat.com dmarc=pass fromdomain=redhat.com); spf=pass (google.com: domain of linux-kernel+bounces-86203-ouuuleilei=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-86203-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id D82DC28842D for ; Thu, 29 Feb 2024 06:59:09 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 1CF114878F; Thu, 29 Feb 2024 06:58:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="QMmFOdT0" Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CF3B44594C for ; Thu, 29 Feb 2024 06:58:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709189885; cv=none; b=SAPWvCw9nBVoqCxol8krQTIyI2c+brpWee3TIVp4iH4RsJBxTiaQWdzzEbR2lEL3uhwv07QraZ6XdStJh3B+0onl4gvRWnKRHUVQhX3W6X9qvmimJ+KdPjIJ/k2N1+CyqNs5C0OfWjRIqf1WJkfisIgPKdif/gwk/uZ9rmSngCE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709189885; c=relaxed/simple; bh=HYHSTfpelvyYDR1wzWgIV1iFpf6tLCCOfsvel0KTnk0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Kf05Fw/MFg8ZOm4oUFsmet/gpC5CbYBfRcF64n9Kqh8lpZ49fMSkl4rIPeit0bQMAzNdKmBbDVJ+0pOrTZ4QmrhwNa9jm5x1won/zM5Zn2cv/1y7CHNRa4J88W9N0gL6TsUGfXTRun8reW3XZpMSLbpPUWzfjVimTlETloYdUNc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=QMmFOdT0; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1709189882; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=O548D4ZJM+qQxwtnpg5UXQkiY5ZV60J3DSbyn2ZI5lc=; b=QMmFOdT0LDSP1QRMj+Izn0L0bvgM1QNa6IXthn+Srh6Rg55CkRxKEG83OPSP0slcPm+Y5r lAbC4hTijL/o/xwcMzB8vGpUFQJcFHDZADsEg0cDAbfzQ6ELCBYkUgrhpA+Bnsg6YTUHJ1 C80FZ8oGr5ru2YN7+RqNkNRPvTQ2s9E= Received: from mimecast-mx02.redhat.com (mx-ext.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-204-BzgnBlw4MCWclqiFPnc2kw-1; Thu, 29 Feb 2024 01:57:58 -0500 X-MC-Unique: BzgnBlw4MCWclqiFPnc2kw-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.rdu2.redhat.com [10.11.54.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 6F90E3813F32; Thu, 29 Feb 2024 06:57:57 +0000 (UTC) Received: from virt-mtcollins-01.lab.eng.rdu2.redhat.com (virt-mtcollins-01.lab.eng.rdu2.redhat.com [10.8.1.196]) by smtp.corp.redhat.com (Postfix) with ESMTP id 64D0048B; Thu, 29 Feb 2024 06:57:57 +0000 (UTC) From: Shaoqin Huang To: Oliver Upton , Marc Zyngier , kvmarm@lists.linux.dev Cc: Eric Auger , Shaoqin Huang , James Morse , Suzuki K Poulose , Zenghui Yu , Paolo Bonzini , Shuah Khan , linux-arm-kernel@lists.infradead.org, kvm@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v5 3/3] KVM: selftests: aarch64: Add invalid filter test in pmu_event_filter_test Date: Thu, 29 Feb 2024 01:56:21 -0500 Message-Id: <20240229065625.114207-4-shahuang@redhat.com> In-Reply-To: <20240229065625.114207-1-shahuang@redhat.com> References: <20240229065625.114207-1-shahuang@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.1 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1792215561062780493 X-GMAIL-MSGID: 1792215561062780493 Add the invalid filter test which sets the filter beyond the event space and sets the invalid action to double check if the KVM_ARM_VCPU_PMU_V3_FILTER will return the expected error. Signed-off-by: Shaoqin Huang --- .../kvm/aarch64/pmu_event_filter_test.c | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/tools/testing/selftests/kvm/aarch64/pmu_event_filter_test.c b/tools/testing/selftests/kvm/aarch64/pmu_event_filter_test.c index 2dd8ea418f47..86714345ee97 100644 --- a/tools/testing/selftests/kvm/aarch64/pmu_event_filter_test.c +++ b/tools/testing/selftests/kvm/aarch64/pmu_event_filter_test.c @@ -8,6 +8,7 @@ * This test checks if the guest only see the limited pmu event that userspace * sets, if the guest can use those events which user allow, and if the guest * can't use those events which user deny. + * It also checks that setting invalid filter ranges return the expected error. * This test runs only when KVM_CAP_ARM_PMU_V3, KVM_ARM_VCPU_PMU_V3_FILTER * is supported on the host. */ @@ -262,6 +263,41 @@ static void run_tests(void) run_test(t); } +static void test_invalid_filter(void) +{ + struct kvm_pmu_event_filter invalid; + int ret; + + pr_info("Test: test_invalid_filter\n"); + + memset(&vpmu_vm, 0, sizeof(vpmu_vm)); + + vpmu_vm.vm = vm_create(1); + vpmu_vm.vcpu = vm_vcpu_add_with_vpmu(vpmu_vm.vm, 0, guest_code); + vpmu_vm.gic_fd = vgic_v3_setup(vpmu_vm.vm, 1, 64, + GICD_BASE_GPA, GICR_BASE_GPA); + __TEST_REQUIRE(vpmu_vm.gic_fd >= 0, + "Failed to create vgic-v3, skipping"); + + /* The max event number is (1 << 16), set a range largeer than it. */ + invalid = __DEFINE_FILTER(BIT(15), BIT(15) + 1, 0); + ret = __kvm_device_attr_set(vpmu_vm.vcpu->fd, KVM_ARM_VCPU_PMU_V3_CTRL, + KVM_ARM_VCPU_PMU_V3_FILTER, &invalid); + TEST_ASSERT(ret && errno == EINVAL, "Set Invalid filter range " + "ret = %d, errno = %d (expected ret = -1, errno = EINVAL)", + ret, errno); + + /* Set the Invalid action. */ + invalid = __DEFINE_FILTER(0, 1, 3); + ret = __kvm_device_attr_set(vpmu_vm.vcpu->fd, KVM_ARM_VCPU_PMU_V3_CTRL, + KVM_ARM_VCPU_PMU_V3_FILTER, &invalid); + TEST_ASSERT(ret && errno == EINVAL, "Set Invalid filter action " + "ret = %d, errno = %d (expected ret = -1, errno = EINVAL)", + ret, errno); + + destroy_vpmu_vm(); +} + static bool kvm_pmu_support_events(void) { create_vpmu_vm(guest_get_pmceid); @@ -284,4 +320,6 @@ int main(void) TEST_REQUIRE(kvm_pmu_support_events()); run_tests(); + + test_invalid_filter(); }