]> www.infradead.org Git - nvme.git/commitdiff
KVM: selftests: arm64: Store expected register value in set_id_regs
authorOliver Upton <oliver.upton@linux.dev>
Thu, 2 May 2024 23:35:27 +0000 (23:35 +0000)
committerMarc Zyngier <maz@kernel.org>
Thu, 9 May 2024 17:41:50 +0000 (18:41 +0100)
Rather than comparing against what is returned by the ioctl, store
expected values for the feature ID registers in a table and compare with
that instead.

This will prove useful for subsequent tests involving vCPU reset.

Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
Link: https://lore.kernel.org/r/20240502233529.1958459-6-oliver.upton@linux.dev
Signed-off-by: Marc Zyngier <maz@kernel.org>
tools/testing/selftests/kvm/aarch64/set_id_regs.c

index 3d0ce49f9b789cbbb522fc6618696f6b4aab2b84..7c8d33fa2ae60a4c1413e14cb3eef3e2535197e2 100644 (file)
@@ -327,8 +327,8 @@ uint64_t get_invalid_value(const struct reg_ftr_bits *ftr_bits, uint64_t ftr)
        return ftr;
 }
 
-static void test_reg_set_success(struct kvm_vcpu *vcpu, uint64_t reg,
-                                const struct reg_ftr_bits *ftr_bits)
+static uint64_t test_reg_set_success(struct kvm_vcpu *vcpu, uint64_t reg,
+                                    const struct reg_ftr_bits *ftr_bits)
 {
        uint8_t shift = ftr_bits->shift;
        uint64_t mask = ftr_bits->mask;
@@ -346,6 +346,8 @@ static void test_reg_set_success(struct kvm_vcpu *vcpu, uint64_t reg,
        vcpu_set_reg(vcpu, reg, val);
        vcpu_get_reg(vcpu, reg, &new_val);
        TEST_ASSERT_EQ(new_val, val);
+
+       return new_val;
 }
 
 static void test_reg_set_fail(struct kvm_vcpu *vcpu, uint64_t reg,
@@ -374,6 +376,14 @@ static void test_reg_set_fail(struct kvm_vcpu *vcpu, uint64_t reg,
        TEST_ASSERT_EQ(val, old_val);
 }
 
+static uint64_t test_reg_vals[KVM_ARM_FEATURE_ID_RANGE_SIZE];
+
+#define encoding_to_range_idx(encoding)                                                        \
+       KVM_ARM_FEATURE_ID_RANGE_IDX(sys_reg_Op0(encoding), sys_reg_Op1(encoding),      \
+                                    sys_reg_CRn(encoding), sys_reg_CRm(encoding),      \
+                                    sys_reg_Op2(encoding))
+
+
 static void test_vm_ftr_id_regs(struct kvm_vcpu *vcpu, bool aarch64_only)
 {
        uint64_t masks[KVM_ARM_FEATURE_ID_RANGE_SIZE];
@@ -398,9 +408,7 @@ static void test_vm_ftr_id_regs(struct kvm_vcpu *vcpu, bool aarch64_only)
                int idx;
 
                /* Get the index to masks array for the idreg */
-               idx = KVM_ARM_FEATURE_ID_RANGE_IDX(sys_reg_Op0(reg_id), sys_reg_Op1(reg_id),
-                                                  sys_reg_CRn(reg_id), sys_reg_CRm(reg_id),
-                                                  sys_reg_Op2(reg_id));
+               idx = encoding_to_range_idx(reg_id);
 
                for (int j = 0;  ftr_bits[j].type != FTR_END; j++) {
                        /* Skip aarch32 reg on aarch64 only system, since they are RAZ/WI. */
@@ -414,7 +422,9 @@ static void test_vm_ftr_id_regs(struct kvm_vcpu *vcpu, bool aarch64_only)
                        TEST_ASSERT_EQ(masks[idx] & ftr_bits[j].mask, ftr_bits[j].mask);
 
                        test_reg_set_fail(vcpu, reg, &ftr_bits[j]);
-                       test_reg_set_success(vcpu, reg, &ftr_bits[j]);
+
+                       test_reg_vals[idx] = test_reg_set_success(vcpu, reg,
+                                                                 &ftr_bits[j]);
 
                        ksft_test_result_pass("%s\n", ftr_bits[j].name);
                }
@@ -425,7 +435,6 @@ static void test_guest_reg_read(struct kvm_vcpu *vcpu)
 {
        bool done = false;
        struct ucall uc;
-       uint64_t val;
 
        while (!done) {
                vcpu_run(vcpu);
@@ -436,8 +445,8 @@ static void test_guest_reg_read(struct kvm_vcpu *vcpu)
                        break;
                case UCALL_SYNC:
                        /* Make sure the written values are seen by guest */
-                       vcpu_get_reg(vcpu, KVM_ARM64_SYS_REG(uc.args[2]), &val);
-                       TEST_ASSERT_EQ(val, uc.args[3]);
+                       TEST_ASSERT_EQ(test_reg_vals[encoding_to_range_idx(uc.args[2])],
+                                      uc.args[3]);
                        break;
                case UCALL_DONE:
                        done = true;