From nobody Sun Feb 8 20:23:28 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 623D4329C56; Fri, 14 Nov 2025 15:38:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763134733; cv=none; b=kMatPBnBbdkcSJAn4sIdrD3iixoBEDfZa2y8+NFdaXHSiCybNO9WbrYeeYnBZkNhuMerFF989IRdR0SvrAmRslzwJKgdsFl8zzA122B7iX34Xwof9kY4HUDSmQ4deGA8ftod/ioBn1rOcAIm/Upvb8NCNyghhyGVRCGtjETDdj0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763134733; c=relaxed/simple; bh=RdNQKxgZm3NWUTfwaPWZhZgP0H44bwRSahfMp4ZPmWY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cDF5DQIsP+TDWxPWnMtE9dDFZzSLiw6Z0Q9NAmiiPfk9p0KMvbLogIwkMryV9i2r7smoXkkLbrJocnCgso4tAHBIwGu5jSmAYXT65XZ9FFmjV0eDsSlmm58GJwZ/+q5zs/fd79wBrQDUl9iRtcIADHhQRwsE54QFc3Vyi8LLr0k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=dAKIiGmL; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="dAKIiGmL" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B07A8C4CEF8; Fri, 14 Nov 2025 15:38:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1763134732; bh=RdNQKxgZm3NWUTfwaPWZhZgP0H44bwRSahfMp4ZPmWY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=dAKIiGmLR5NXD624H9jsEUkpObc2dqs5DvTJsFF8O+hgynx5WxltE40k5Yt4ordg5 SKGr3f+U0tybO2QVZff+fEx8xZ/uojk/WbsIrBXu0qPhMtA1lTmymoju4V2+adzVIo IkYWJ0OPsuta8oH/03jAx5LEWaWkxms16lYOF2uO8ItMVTCi1efHVtNsPMbKR1pmFF JG2k2UL3oy0VmJkwzwnczGZxhXvCiPAw7n4I0KZTfbRYQVNV0tuS3MtoIga1BKLWgm GT+BFDQUk5Lr8hAIN/TAVQZrERvRykXLO3HtWpUY53subFDghSsVWB5c5kB7vtfwGZ XTGGWEX6piqQQ== From: Mark Brown Date: Fri, 14 Nov 2025 15:35:34 +0000 Subject: [PATCH v2 1/4] KVM: selftests: arm64: Report set_id_reg reads of test registers as tests Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251114-kvm-arm64-set-id-regs-aarch64-v2-1-672f214f41bf@kernel.org> References: <20251114-kvm-arm64-set-id-regs-aarch64-v2-0-672f214f41bf@kernel.org> In-Reply-To: <20251114-kvm-arm64-set-id-regs-aarch64-v2-0-672f214f41bf@kernel.org> To: Marc Zyngier , Oliver Upton , Joey Gouly , Suzuki K Poulose , Paolo Bonzini , Shuah Khan Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, kvm@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Mark Brown X-Mailer: b4 0.15-dev-88d78 X-Developer-Signature: v=1; a=openpgp-sha256; l=4838; i=broonie@kernel.org; h=from:subject:message-id; bh=RdNQKxgZm3NWUTfwaPWZhZgP0H44bwRSahfMp4ZPmWY=; b=owEBbQGS/pANAwAKASTWi3JdVIfQAcsmYgBpF00DPaiz6v63rB7oygsadzrmHcsa6RWXbc75A SXhJr81cu6JATMEAAEKAB0WIQSt5miqZ1cYtZ/in+ok1otyXVSH0AUCaRdNAwAKCRAk1otyXVSH 0Mi8CACDDWBh8r+sr0FccV8LeR4kZbJ7pwxaznHaM1w5YwjFkbiMSqnc2wJP8znj/EJahtQSzwj Xr3bwuvDPahqRJHbrvqAUhBweXxA4eOxCICjNpLX8iiPpDID/ZUe8FEhfwoWeKyZ7G+6i7DgO9I ed018gXi188CQ97oTDJctlKT4SANHJVdi93i/MN7v+1cjAhVw3fNXqOob51oeJ7hxuZUEAahacX RQPzkmtLZd81Ae6EpzdfvLfib3ikrTrMAUYmko/OzgLv3QJSeAYjYEk/GqAWATH4/NCMzR5GKQk Mq9ku0Rkje+e0QUMnpk4RJ3AcughUmNG4Ltqo+y2nDvRLkc3 X-Developer-Key: i=broonie@kernel.org; a=openpgp; fpr=3F2568AAC26998F9E813A1C5C3F436CA30F5D8EB Currently when we run guest code to validate that the values we wrote to the registers are seen by the guest we assert that these values match using a KVM selftests level assert, resulting in unclear diagnostics if the test fails. Replace this assert with reporting a kselftest test per register. In order to support getting the names of the registers we repaint the array of ID_ registers to store the names and open code the rest. Signed-off-by: Mark Brown --- tools/testing/selftests/kvm/arm64/set_id_regs.c | 74 +++++++++++++++++++--= ---- 1 file changed, 57 insertions(+), 17 deletions(-) diff --git a/tools/testing/selftests/kvm/arm64/set_id_regs.c b/tools/testin= g/selftests/kvm/arm64/set_id_regs.c index 5e24f77868b5..7a759e976c2c 100644 --- a/tools/testing/selftests/kvm/arm64/set_id_regs.c +++ b/tools/testing/selftests/kvm/arm64/set_id_regs.c @@ -40,6 +40,7 @@ struct reg_ftr_bits { }; =20 struct test_feature_reg { + const char *name; uint32_t reg; const struct reg_ftr_bits *ftr_bits; }; @@ -218,24 +219,25 @@ static const struct reg_ftr_bits ftr_id_aa64zfr0_el1[= ] =3D { =20 #define TEST_REG(id, table) \ { \ - .reg =3D id, \ + .name =3D #id, \ + .reg =3D SYS_ ## id, \ .ftr_bits =3D &((table)[0]), \ } =20 static struct test_feature_reg test_regs[] =3D { - TEST_REG(SYS_ID_AA64DFR0_EL1, ftr_id_aa64dfr0_el1), - TEST_REG(SYS_ID_DFR0_EL1, ftr_id_dfr0_el1), - TEST_REG(SYS_ID_AA64ISAR0_EL1, ftr_id_aa64isar0_el1), - TEST_REG(SYS_ID_AA64ISAR1_EL1, ftr_id_aa64isar1_el1), - TEST_REG(SYS_ID_AA64ISAR2_EL1, ftr_id_aa64isar2_el1), - TEST_REG(SYS_ID_AA64ISAR3_EL1, ftr_id_aa64isar3_el1), - TEST_REG(SYS_ID_AA64PFR0_EL1, ftr_id_aa64pfr0_el1), - TEST_REG(SYS_ID_AA64PFR1_EL1, ftr_id_aa64pfr1_el1), - TEST_REG(SYS_ID_AA64MMFR0_EL1, ftr_id_aa64mmfr0_el1), - TEST_REG(SYS_ID_AA64MMFR1_EL1, ftr_id_aa64mmfr1_el1), - TEST_REG(SYS_ID_AA64MMFR2_EL1, ftr_id_aa64mmfr2_el1), - TEST_REG(SYS_ID_AA64MMFR3_EL1, ftr_id_aa64mmfr3_el1), - TEST_REG(SYS_ID_AA64ZFR0_EL1, ftr_id_aa64zfr0_el1), + TEST_REG(ID_AA64DFR0_EL1, ftr_id_aa64dfr0_el1), + TEST_REG(ID_DFR0_EL1, ftr_id_dfr0_el1), + TEST_REG(ID_AA64ISAR0_EL1, ftr_id_aa64isar0_el1), + TEST_REG(ID_AA64ISAR1_EL1, ftr_id_aa64isar1_el1), + TEST_REG(ID_AA64ISAR2_EL1, ftr_id_aa64isar2_el1), + TEST_REG(ID_AA64ISAR3_EL1, ftr_id_aa64isar3_el1), + TEST_REG(ID_AA64PFR0_EL1, ftr_id_aa64pfr0_el1), + TEST_REG(ID_AA64PFR1_EL1, ftr_id_aa64pfr1_el1), + TEST_REG(ID_AA64MMFR0_EL1, ftr_id_aa64mmfr0_el1), + TEST_REG(ID_AA64MMFR1_EL1, ftr_id_aa64mmfr1_el1), + TEST_REG(ID_AA64MMFR2_EL1, ftr_id_aa64mmfr2_el1), + TEST_REG(ID_AA64MMFR3_EL1, ftr_id_aa64mmfr3_el1), + TEST_REG(ID_AA64ZFR0_EL1, ftr_id_aa64zfr0_el1), }; =20 #define GUEST_REG_SYNC(id) GUEST_SYNC_ARGS(0, id, read_sysreg_s(id), 0, 0); @@ -265,6 +267,34 @@ static void guest_code(void) GUEST_DONE(); } =20 +#define GUEST_READ_TEST (ARRAY_SIZE(test_regs) + 6) + +static const char *get_reg_name(u64 id) +{ + int i; + + for (i =3D 0; i < ARRAY_SIZE(test_regs); i++) + if (test_regs[i].reg =3D=3D id) + return test_regs[i].name; + + switch (id) { + case SYS_MPIDR_EL1: + return "MPIDR_EL1"; + case SYS_CLIDR_EL1: + return "CLIDR_EL1"; + case SYS_CTR_EL0: + return "CTR_EL0"; + case SYS_MIDR_EL1: + return "MIDR_EL1"; + case SYS_REVIDR_EL1: + return "REVIDR_EL1"; + case SYS_AIDR_EL1: + return "AIDR_EL1"; + default: + TEST_FAIL("Unknown register"); + } +} + /* Return a safe value to a given ftr_bits an ftr value */ uint64_t get_safe_value(const struct reg_ftr_bits *ftr_bits, uint64_t ftr) { @@ -635,6 +665,8 @@ static void test_guest_reg_read(struct kvm_vcpu *vcpu) { bool done =3D false; struct ucall uc; + uint64_t reg_id, expected_val, guest_val; + bool match; =20 while (!done) { vcpu_run(vcpu); @@ -645,8 +677,16 @@ static void test_guest_reg_read(struct kvm_vcpu *vcpu) break; case UCALL_SYNC: /* Make sure the written values are seen by guest */ - TEST_ASSERT_EQ(test_reg_vals[encoding_to_range_idx(uc.args[2])], - uc.args[3]); + reg_id =3D uc.args[2]; + guest_val =3D uc.args[3]; + expected_val =3D test_reg_vals[encoding_to_range_idx(reg_id)]; + match =3D expected_val =3D=3D guest_val; + if (!match) + ksft_print_msg("%lx !=3D %lx\n", + expected_val, guest_val); + ksft_test_result(match, + "%s value seen in guest\n", + get_reg_name(reg_id)); break; case UCALL_DONE: done =3D true; @@ -786,7 +826,7 @@ int main(void) =20 ksft_print_header(); =20 - test_cnt =3D 3 + MPAM_IDREG_TEST + MTE_IDREG_TEST; + test_cnt =3D 3 + MPAM_IDREG_TEST + MTE_IDREG_TEST + GUEST_READ_TEST; for (i =3D 0; i < ARRAY_SIZE(test_regs); i++) for (j =3D 0; test_regs[i].ftr_bits[j].type !=3D FTR_END; j++) test_cnt++; --=20 2.47.2 From nobody Sun Feb 8 20:23:28 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 1E282329E77; Fri, 14 Nov 2025 15:38:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763134735; cv=none; b=UyGad1Mn5ZxgFzKPGlaTCrPfsFfq0Iqyu0AU856xXkb1mA9BtLceo/wVVdBLmmyA+vDxhG39enisNyr/vL9q5MfUo7eAv1FDrHweaAyuH98HEGJVyHeThkB5dhAfxR0+y3pt36R0NQNVJjc8WfGKxC+3TeUtRTxByQd/ZL/PmeE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763134735; c=relaxed/simple; bh=NZCHWtWgDq5zz30CCAR3ifMlNJpsHOdaSLoln4mIKFs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=mWJIW8RQ1TMNlsUOgGWOuNxaXm4aP7Ip6OLtTjsXykOrO64uEJ71850n8kvqc2jHN4eOnKDdKOVY6bGW+5U6BONvbATNKYDD2go1JRlWt00TLHN216y3KN3zuJ4h7K7ObjPpEqTqSogez/lt803fCixvuOMpCkXJFod0uX0Qd5g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=OSVTlQ+9; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="OSVTlQ+9" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6DEB5C4CEF5; Fri, 14 Nov 2025 15:38:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1763134734; bh=NZCHWtWgDq5zz30CCAR3ifMlNJpsHOdaSLoln4mIKFs=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=OSVTlQ+9h/egrqSsK0XbaROTf3A/nVsW6z7prKM3nrFWBaobTHTyApPdryv/2YiHJ Purg8c8/YJzbhwoHcrAtieVd5bt6N6s0Yr4yj4WPe59gOObxDF1/Q/NTqV5Tdq462h oynnKKJzFeb2Gi72aGHeUfvMRQHtM87IUWaqs9R6MVUbOR+WS39zusVrMruiApRLxG 042m1QimEwKJCC7xPdPGvTlubkxVq6XAha4V+FWo9rCLMfGCW5mijV4ueq5xvTd1Ko k3/CslX5i/Qhdcu3vhhlEzYbBvKFq9cijjyR+czlXd/29GfMQR+PCvH3E9n0PdjpD4 i2MSCPob91tnA== From: Mark Brown Date: Fri, 14 Nov 2025 15:35:35 +0000 Subject: [PATCH v2 2/4] KVM: selftests: arm64: Report register reset tests individually Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251114-kvm-arm64-set-id-regs-aarch64-v2-2-672f214f41bf@kernel.org> References: <20251114-kvm-arm64-set-id-regs-aarch64-v2-0-672f214f41bf@kernel.org> In-Reply-To: <20251114-kvm-arm64-set-id-regs-aarch64-v2-0-672f214f41bf@kernel.org> To: Marc Zyngier , Oliver Upton , Joey Gouly , Suzuki K Poulose , Paolo Bonzini , Shuah Khan Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, kvm@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Mark Brown X-Mailer: b4 0.15-dev-88d78 X-Developer-Signature: v=1; a=openpgp-sha256; l=2202; i=broonie@kernel.org; h=from:subject:message-id; bh=NZCHWtWgDq5zz30CCAR3ifMlNJpsHOdaSLoln4mIKFs=; b=owEBbQGS/pANAwAKASTWi3JdVIfQAcsmYgBpF00ExUPPIhXLM4+RvYN6tmyihAwwDeNdhhodj HEMG3Kfn9CJATMEAAEKAB0WIQSt5miqZ1cYtZ/in+ok1otyXVSH0AUCaRdNBAAKCRAk1otyXVSH 0K97B/4wbGfo6mAfnV2qQY5eFEv2JIQ9tDu2+ZycsJbISJBH8opD6Mt4UeTuWR0bm1ai2dGuUv4 0RFTc02NiXVMfjj6USZQJbKB1zBGWH/q/Roke0TLUjh5t6tYa5qwb9mAnB0mOnBscPkw2PTe4ZZ xio7KVodWYg9NFr9lIU2NQ/ZV3rb7Cg0PyabkC09FrLvACAOlDRqFQMCvdZT3IuvLXVahPmV10/ qq/fWJtBkW9VDTPQZV+SwzrMseHpUzq0SV8k7SYNQXV7ySnNYEDiDUMRCz3jCL0YeTN3jgqz7fT MeyMBGPF2Dq4nYUrDCYqMJp5ekcHNmnu0GNRjsgC1eTwOwZt X-Developer-Key: i=broonie@kernel.org; a=openpgp; fpr=3F2568AAC26998F9E813A1C5C3F436CA30F5D8EB set_id_regs tests that registers have their values preserved over reset. Currently it reports all registers in a single test with an instantly fatal assert which isn't great for diagnostics, it's hard to tell which register failed or if it's just one register. Change this to report each register as a separate test so that it's clear from the program output which registers have problems. Signed-off-by: Mark Brown --- tools/testing/selftests/kvm/arm64/set_id_regs.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/tools/testing/selftests/kvm/arm64/set_id_regs.c b/tools/testin= g/selftests/kvm/arm64/set_id_regs.c index 7a759e976c2c..1a53f3a4be8d 100644 --- a/tools/testing/selftests/kvm/arm64/set_id_regs.c +++ b/tools/testing/selftests/kvm/arm64/set_id_regs.c @@ -775,11 +775,18 @@ static void test_assert_id_reg_unchanged(struct kvm_v= cpu *vcpu, uint32_t encodin { size_t idx =3D encoding_to_range_idx(encoding); uint64_t observed; + bool pass; =20 observed =3D vcpu_get_reg(vcpu, KVM_ARM64_SYS_REG(encoding)); - TEST_ASSERT_EQ(test_reg_vals[idx], observed); + pass =3D test_reg_vals[idx] =3D=3D observed; + if (!pass) + ksft_print_msg("%lx !=3D %lx\n", test_reg_vals[idx], observed); + ksft_test_result(pass, "%s unchanged by reset\n", + get_reg_name(encoding)); } =20 +#define ID_REG_RESET_UNCHANGED_TEST (ARRAY_SIZE(test_regs) + 6) + static void test_reset_preserves_id_regs(struct kvm_vcpu *vcpu) { /* @@ -797,8 +804,6 @@ static void test_reset_preserves_id_regs(struct kvm_vcp= u *vcpu) test_assert_id_reg_unchanged(vcpu, SYS_MIDR_EL1); test_assert_id_reg_unchanged(vcpu, SYS_REVIDR_EL1); test_assert_id_reg_unchanged(vcpu, SYS_AIDR_EL1); - - ksft_test_result_pass("%s\n", __func__); } =20 int main(void) @@ -826,7 +831,8 @@ int main(void) =20 ksft_print_header(); =20 - test_cnt =3D 3 + MPAM_IDREG_TEST + MTE_IDREG_TEST + GUEST_READ_TEST; + test_cnt =3D 2 + MPAM_IDREG_TEST + MTE_IDREG_TEST + GUEST_READ_TEST + + ID_REG_RESET_UNCHANGED_TEST; for (i =3D 0; i < ARRAY_SIZE(test_regs); i++) for (j =3D 0; test_regs[i].ftr_bits[j].type !=3D FTR_END; j++) test_cnt++; --=20 2.47.2 From nobody Sun Feb 8 20:23:28 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 D241732D0C2; Fri, 14 Nov 2025 15:38:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763134737; cv=none; b=kwK4jRI4KAIHJOkdtfaEZ+2Gd5bPSf7i6WMeswlfU55JtV25j+0tBbmKh7Y3In1LuiVN6JAulbmGXZtiTHiAbwiZV8m9xmed819MgQMSTbe8Tis8rNsLYhr+0GT6BuFnRupgdPAZRhvPopEeUzzgyIUz2JRDwpoDCaP3QOnkvtw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763134737; c=relaxed/simple; bh=OOWNdlvS0e5zsqxUjtF1fvoktLBbLPB8K99I3mro3t0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=KFvnWUBCpuusfXMxxM5Fttv0D3PfCmBuoLt9Ct+5sHRwDfU6SVqTNaLHE4ONAB3F8ytKz9T+C0Y/JsrA5wGMvJnQ2tqmwXP6DoXt5Ti8OQSxf7KFD0opZGxU1i4nOn+sh1fmFpkSIg2dfE9lDokP1uIfXemc3mscsoscguyTC1I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=B3t1aR2c; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="B3t1aR2c" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2B1CDC4CEF1; Fri, 14 Nov 2025 15:38:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1763134737; bh=OOWNdlvS0e5zsqxUjtF1fvoktLBbLPB8K99I3mro3t0=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=B3t1aR2cw8emhFUhtudXYJsbh2iph2cNegTPxBt7/Sii068LSR22SVKEYGGguBqkT xq5gjfTXccsKRrCIEASxsqJfE2aCtpgKJbaMrXrMmHgUBeCSnTWLtHXt7jtZiLK4jo cpkcM1gK3phnESEfyU/mOk48gotIZxox1quhuLGnUkOH+5OVZT0VM7Kmm9Hi/IgQcw hsMv6msiAyRu3Whn1LlB7lGvwkqxhZoi5zTXH4FcH348sGsKZjwFttpkhy3iQ33mps pTSbkWSvPQap3d27XkyLnNhkC+plVBjz+iRGBAHq0KgQsiRaOVlSmlNqghhwQm/PQU YlGTWt3s6N9rQ== From: Mark Brown Date: Fri, 14 Nov 2025 15:35:36 +0000 Subject: [PATCH v2 3/4] KVM: selftests: arm64: Make set_id_regs bitfield validatity checks non-fatal Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251114-kvm-arm64-set-id-regs-aarch64-v2-3-672f214f41bf@kernel.org> References: <20251114-kvm-arm64-set-id-regs-aarch64-v2-0-672f214f41bf@kernel.org> In-Reply-To: <20251114-kvm-arm64-set-id-regs-aarch64-v2-0-672f214f41bf@kernel.org> To: Marc Zyngier , Oliver Upton , Joey Gouly , Suzuki K Poulose , Paolo Bonzini , Shuah Khan Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, kvm@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Mark Brown X-Mailer: b4 0.15-dev-88d78 X-Developer-Signature: v=1; a=openpgp-sha256; l=3523; i=broonie@kernel.org; h=from:subject:message-id; bh=OOWNdlvS0e5zsqxUjtF1fvoktLBbLPB8K99I3mro3t0=; b=owEBbQGS/pANAwAKASTWi3JdVIfQAcsmYgBpF00FbT8dIGIkVDBmG9vCD2Uz45dTz5cu1zLgR ymKD5kDLf+JATMEAAEKAB0WIQSt5miqZ1cYtZ/in+ok1otyXVSH0AUCaRdNBQAKCRAk1otyXVSH 0PiNB/9dJS0M4IeUGVK9uzaPxFh3v0wahvRTtIMYA2jaswPqvpgI5LnEbOFGlw1H4PwiyjAcSIs kNzSmHcaDnTti8Y6SdWt4A/9QEud4dIDQyYRhP1d8OaxeHLgAwIpftbYoaLuNUTtR7OPsDdgjA2 HM5HJfXcgAxxiX4/cY5vvNuISm4dK2m17y8Gl0sYrywUdpT7UrYeRbxsdLa4IVayuNnQfGsKKT7 Dv3RWy0W0IMtX/DencLJ6/mlgr86cinRJxTN869ad/9ue/lq5+J5O7wjC+E9pQWfSQ4MSAWlXpC CI9/wll1qp1F4X4mbgB1ZtJtL+ESOU9e6MuP4G4epPmWy7CT X-Developer-Key: i=broonie@kernel.org; a=openpgp; fpr=3F2568AAC26998F9E813A1C5C3F436CA30F5D8EB Currently when set_id_regs encounters a problem checking validation of writes to feature registers it uses an immediately fatal assert to report the problem. This is not idiomatic for kselftest, and it is also not great for usability. The affected bitfield is not clearly reported and further tests do not have their results reported. Switch to using standard kselftest result reporting for the two asserts we do, these are non-fatal asserts so allow the program to continue and the test names include the affected field. Signed-off-by: Mark Brown --- tools/testing/selftests/kvm/arm64/set_id_regs.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/tools/testing/selftests/kvm/arm64/set_id_regs.c b/tools/testin= g/selftests/kvm/arm64/set_id_regs.c index 1a53f3a4be8d..abe97f9293c9 100644 --- a/tools/testing/selftests/kvm/arm64/set_id_regs.c +++ b/tools/testing/selftests/kvm/arm64/set_id_regs.c @@ -405,6 +405,7 @@ static uint64_t test_reg_set_success(struct kvm_vcpu *v= cpu, uint64_t reg, uint8_t shift =3D ftr_bits->shift; uint64_t mask =3D ftr_bits->mask; uint64_t val, new_val, ftr; + bool match; =20 val =3D vcpu_get_reg(vcpu, reg); ftr =3D (val & mask) >> shift; @@ -417,7 +418,10 @@ static uint64_t test_reg_set_success(struct kvm_vcpu *= vcpu, uint64_t reg, =20 vcpu_set_reg(vcpu, reg, val); new_val =3D vcpu_get_reg(vcpu, reg); - TEST_ASSERT_EQ(new_val, val); + match =3D new_val =3D=3D val; + if (!match) + ksft_print_msg("%lx !=3D %lx\n", new_val, val); + ksft_test_result(match, "%s valid write succeeded\n", ftr_bits->name); =20 return new_val; } @@ -429,6 +433,7 @@ static void test_reg_set_fail(struct kvm_vcpu *vcpu, ui= nt64_t reg, uint64_t mask =3D ftr_bits->mask; uint64_t val, old_val, ftr; int r; + bool match; =20 val =3D vcpu_get_reg(vcpu, reg); ftr =3D (val & mask) >> shift; @@ -445,7 +450,10 @@ static void test_reg_set_fail(struct kvm_vcpu *vcpu, u= int64_t reg, "Unexpected KVM_SET_ONE_REG error: r=3D%d, errno=3D%d", r, errno); =20 val =3D vcpu_get_reg(vcpu, reg); - TEST_ASSERT_EQ(val, old_val); + match =3D val =3D=3D old_val; + if (!match) + ksft_print_msg("%lx !=3D %lx\n", val, old_val); + ksft_test_result(match, "%s invalid write rejected\n", ftr_bits->name); } =20 static uint64_t test_reg_vals[KVM_ARM_FEATURE_ID_RANGE_SIZE]; @@ -485,7 +493,11 @@ static void test_vm_ftr_id_regs(struct kvm_vcpu *vcpu,= bool aarch64_only) for (int j =3D 0; ftr_bits[j].type !=3D FTR_END; j++) { /* Skip aarch32 reg on aarch64 only system, since they are RAZ/WI. */ if (aarch64_only && sys_reg_CRm(reg_id) < 4) { - ksft_test_result_skip("%s on AARCH64 only system\n", + ksft_print_msg("%s on AARCH64 only system\n", + ftr_bits[j].name); + ksft_test_result_skip("%s invalid write rejected\n", + ftr_bits[j].name); + ksft_test_result_skip("%s valid write succeeded\n", ftr_bits[j].name); continue; } @@ -497,8 +509,6 @@ static void test_vm_ftr_id_regs(struct kvm_vcpu *vcpu, = bool aarch64_only) =20 test_reg_vals[idx] =3D test_reg_set_success(vcpu, reg, &ftr_bits[j]); - - ksft_test_result_pass("%s\n", ftr_bits[j].name); } } } @@ -835,7 +845,7 @@ int main(void) ID_REG_RESET_UNCHANGED_TEST; for (i =3D 0; i < ARRAY_SIZE(test_regs); i++) for (j =3D 0; test_regs[i].ftr_bits[j].type !=3D FTR_END; j++) - test_cnt++; + test_cnt +=3D 2; =20 ksft_set_plan(test_cnt); =20 --=20 2.47.2 From nobody Sun Feb 8 20:23:28 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 B907C32E126; Fri, 14 Nov 2025 15:39:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763134740; cv=none; b=EyNPib7Xo3ztOER6iu92EOuYAEftmsLqy94QJ6LjvzI8MDCb/aoIBC+LBeWdTczSECiXULndDgqYVCXbmMsTy/BoCHEMttCPpzk5940xvlbPG0VX5LTxxjyFvXycLy0q9Y5da0ADlBDEmnqtR0PV9jdn8GzPwwDQWgvDZMQaqdM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763134740; c=relaxed/simple; bh=uNwDXUwlPyXEgttCCR2gAD/CSzRiWE8XchLoChLWNmw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=eGl5vxHbwNGgvuxrP+rEFnsTBm/cfj7MtznIYaDkwjfZRuwAVcIslb+f1zM/OfVFutuLqTKnpg5Uu/oAQx3jYlPuOvLXRdbxUuJgFLhnP4e4bVpFYmY9bEbETMibcb8n8bEl58aH1ZPgErhK8pBzV1B1iYW8UHkmxAhP8V6xCew= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=eiDWJd0v; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="eiDWJd0v" Received: by smtp.kernel.org (Postfix) with ESMTPSA id DFAEEC4CEFB; Fri, 14 Nov 2025 15:38:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1763134740; bh=uNwDXUwlPyXEgttCCR2gAD/CSzRiWE8XchLoChLWNmw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=eiDWJd0vyrOdBwR9stZ0zhpF0IHbzcqNEQgzkTwii3Bn/QOkTZ/vsmtawWqKTjz7e rw9F8q8EydcaKFwjTIuHWbiHeRr/kjKqgwD06SAY/ynsS4hwXqfE0oCdQLPXh/RTCN mLK0qZrsVaqMFqnhjGhmaT3CvwnJL9l1fYESDd5b4SjIOXTA9NIuIMlB862l0+/TuA Li8d/XKemkVJCS0c+53xSv4wAWc4q88FUW/NapuRrDRh/m9n2mZR5R0m9TFFKsT0OI QlZx1it3lbal3fMeC0uj1aITklUAsA0XxKiBQ8XwJ8tVnLOhQvYx/XWjuZOHR3HIog jGd89XNcM97gQ== From: Mark Brown Date: Fri, 14 Nov 2025 15:35:37 +0000 Subject: [PATCH v2 4/4] KVM: selftests: arm64: Skip all 32 bit IDs when set_id_regs is aarch64 only Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251114-kvm-arm64-set-id-regs-aarch64-v2-4-672f214f41bf@kernel.org> References: <20251114-kvm-arm64-set-id-regs-aarch64-v2-0-672f214f41bf@kernel.org> In-Reply-To: <20251114-kvm-arm64-set-id-regs-aarch64-v2-0-672f214f41bf@kernel.org> To: Marc Zyngier , Oliver Upton , Joey Gouly , Suzuki K Poulose , Paolo Bonzini , Shuah Khan Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, kvm@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Mark Brown X-Mailer: b4 0.15-dev-88d78 X-Developer-Signature: v=1; a=openpgp-sha256; l=4530; i=broonie@kernel.org; h=from:subject:message-id; bh=uNwDXUwlPyXEgttCCR2gAD/CSzRiWE8XchLoChLWNmw=; b=owEBbQGS/pANAwAKASTWi3JdVIfQAcsmYgBpF00FlaR6CysOhNqJuXUWWXOCFqVSb6pOhNFeL HTvgq8VpbuJATMEAAEKAB0WIQSt5miqZ1cYtZ/in+ok1otyXVSH0AUCaRdNBQAKCRAk1otyXVSH 0PHNB/9n9jGVcM3keHTaLahbLR+v1VCSDWfsgbzxVQB7r/YLwElPxt6CuWXXa527vbk0KqdY+1C h1vJRUn2ktLos+3q+obK/94l4yrbSV0OnbWLVVRPENUgwhX1AlLX5H6EIk6B8SUWMHArBmxqGOL O9CnniEyYaRZ2zT4g94IWXp6m8XfbAxMtluFZAlvUHFyOAJvFAO8Q7DXF1hV1OeZ7RmP6lEzmIl ZtoPLxR44pfes3ZEpZEYaoUiwBgyXj8UcoiId9VFNbKkjacMohBKs3abG7LsvDQEkxRYmajaERp H+lmh/A0KFRwz5u5Z9bzlJ7PrHX0A3iuVZIhfakK23tXlcGA X-Developer-Key: i=broonie@kernel.org; a=openpgp; fpr=3F2568AAC26998F9E813A1C5C3F436CA30F5D8EB On an aarch64 only system the 32 bit ID registers have UNDEFINED values. As a result set_id_regs skips tests for setting fields in these registers when testing an aarch64 only guest. This has the side effect of meaning that we don't record an expected value for these registers, meaning that when the subsequent tests for values being visible in guests and preserved over reset check the value they can spuriously fail. This can be seen by running on an emulated system with both NV and 32 bit enabled, NV will result in the guests created by the test program being 64 bit only but the 32 bit ID registers will have values. Also skip those tests that use the values set in the field setting tests for aarch64 only guests in order to avoid these spurious failures. Signed-off-by: Mark Brown --- tools/testing/selftests/kvm/arm64/set_id_regs.c | 42 +++++++++++++++++----= ---- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/tools/testing/selftests/kvm/arm64/set_id_regs.c b/tools/testin= g/selftests/kvm/arm64/set_id_regs.c index abe97f9293c9..55e13aa758ff 100644 --- a/tools/testing/selftests/kvm/arm64/set_id_regs.c +++ b/tools/testing/selftests/kvm/arm64/set_id_regs.c @@ -671,7 +671,7 @@ static void test_user_set_mte_reg(struct kvm_vcpu *vcpu) ksft_test_result_pass("ID_AA64PFR1_EL1.MTE_frac no longer 0xF\n"); } =20 -static void test_guest_reg_read(struct kvm_vcpu *vcpu) +static void test_guest_reg_read(struct kvm_vcpu *vcpu, bool aarch64_only) { bool done =3D false; struct ucall uc; @@ -690,6 +690,13 @@ static void test_guest_reg_read(struct kvm_vcpu *vcpu) reg_id =3D uc.args[2]; guest_val =3D uc.args[3]; expected_val =3D test_reg_vals[encoding_to_range_idx(reg_id)]; + + if (aarch64_only && sys_reg_CRm(reg_id) < 4) { + ksft_test_result_skip("%s value seen in guest\n", + get_reg_name(reg_id)); + break; + } + match =3D expected_val =3D=3D guest_val; if (!match) ksft_print_msg("%lx !=3D %lx\n", @@ -781,12 +788,19 @@ static void test_vcpu_non_ftr_id_regs(struct kvm_vcpu= *vcpu) ksft_test_result_pass("%s\n", __func__); } =20 -static void test_assert_id_reg_unchanged(struct kvm_vcpu *vcpu, uint32_t e= ncoding) +static void test_assert_id_reg_unchanged(struct kvm_vcpu *vcpu, uint32_t e= ncoding, + bool aarch64_only) { size_t idx =3D encoding_to_range_idx(encoding); uint64_t observed; bool pass; =20 + if (aarch64_only && sys_reg_CRm(encoding) < 4) { + ksft_test_result_skip("%s unchanged by reset\n", + get_reg_name(encoding)); + return; + } + observed =3D vcpu_get_reg(vcpu, KVM_ARM64_SYS_REG(encoding)); pass =3D test_reg_vals[idx] =3D=3D observed; if (!pass) @@ -797,7 +811,8 @@ static void test_assert_id_reg_unchanged(struct kvm_vcp= u *vcpu, uint32_t encodin =20 #define ID_REG_RESET_UNCHANGED_TEST (ARRAY_SIZE(test_regs) + 6) =20 -static void test_reset_preserves_id_regs(struct kvm_vcpu *vcpu) +static void test_reset_preserves_id_regs(struct kvm_vcpu *vcpu, + bool aarch64_only) { /* * Calls KVM_ARM_VCPU_INIT behind the scenes, which will do an @@ -806,14 +821,15 @@ static void test_reset_preserves_id_regs(struct kvm_v= cpu *vcpu) aarch64_vcpu_setup(vcpu, NULL); =20 for (int i =3D 0; i < ARRAY_SIZE(test_regs); i++) - test_assert_id_reg_unchanged(vcpu, test_regs[i].reg); - - test_assert_id_reg_unchanged(vcpu, SYS_MPIDR_EL1); - test_assert_id_reg_unchanged(vcpu, SYS_CLIDR_EL1); - test_assert_id_reg_unchanged(vcpu, SYS_CTR_EL0); - test_assert_id_reg_unchanged(vcpu, SYS_MIDR_EL1); - test_assert_id_reg_unchanged(vcpu, SYS_REVIDR_EL1); - test_assert_id_reg_unchanged(vcpu, SYS_AIDR_EL1); + test_assert_id_reg_unchanged(vcpu, test_regs[i].reg, + aarch64_only); + + test_assert_id_reg_unchanged(vcpu, SYS_MPIDR_EL1, aarch64_only); + test_assert_id_reg_unchanged(vcpu, SYS_CLIDR_EL1, aarch64_only); + test_assert_id_reg_unchanged(vcpu, SYS_CTR_EL0, aarch64_only); + test_assert_id_reg_unchanged(vcpu, SYS_MIDR_EL1, aarch64_only); + test_assert_id_reg_unchanged(vcpu, SYS_REVIDR_EL1, aarch64_only); + test_assert_id_reg_unchanged(vcpu, SYS_AIDR_EL1, aarch64_only); } =20 int main(void) @@ -855,9 +871,9 @@ int main(void) test_user_set_mpam_reg(vcpu); test_user_set_mte_reg(vcpu); =20 - test_guest_reg_read(vcpu); + test_guest_reg_read(vcpu, aarch64_only); =20 - test_reset_preserves_id_regs(vcpu); + test_reset_preserves_id_regs(vcpu, aarch64_only); =20 kvm_vm_free(vm); =20 --=20 2.47.2