Commit 46247a31 authored by Oliver Upton's avatar Oliver Upton Committed by Marc Zyngier

KVM: selftests: arm64: Store expected register value in set_id_regs

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: default avatarOliver Upton <oliver.upton@linux.dev>
Link: https://lore.kernel.org/r/20240502233529.1958459-6-oliver.upton@linux.devSigned-off-by: default avatarMarc Zyngier <maz@kernel.org>
parent 41ee9b33
...@@ -327,7 +327,7 @@ uint64_t get_invalid_value(const struct reg_ftr_bits *ftr_bits, uint64_t ftr) ...@@ -327,7 +327,7 @@ uint64_t get_invalid_value(const struct reg_ftr_bits *ftr_bits, uint64_t ftr)
return ftr; return ftr;
} }
static void test_reg_set_success(struct kvm_vcpu *vcpu, uint64_t reg, static uint64_t test_reg_set_success(struct kvm_vcpu *vcpu, uint64_t reg,
const struct reg_ftr_bits *ftr_bits) const struct reg_ftr_bits *ftr_bits)
{ {
uint8_t shift = ftr_bits->shift; uint8_t shift = ftr_bits->shift;
...@@ -346,6 +346,8 @@ static void test_reg_set_success(struct kvm_vcpu *vcpu, uint64_t reg, ...@@ -346,6 +346,8 @@ static void test_reg_set_success(struct kvm_vcpu *vcpu, uint64_t reg,
vcpu_set_reg(vcpu, reg, val); vcpu_set_reg(vcpu, reg, val);
vcpu_get_reg(vcpu, reg, &new_val); vcpu_get_reg(vcpu, reg, &new_val);
TEST_ASSERT_EQ(new_val, val); TEST_ASSERT_EQ(new_val, val);
return new_val;
} }
static void test_reg_set_fail(struct kvm_vcpu *vcpu, uint64_t reg, 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, ...@@ -374,6 +376,14 @@ static void test_reg_set_fail(struct kvm_vcpu *vcpu, uint64_t reg,
TEST_ASSERT_EQ(val, old_val); 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) static void test_vm_ftr_id_regs(struct kvm_vcpu *vcpu, bool aarch64_only)
{ {
uint64_t masks[KVM_ARM_FEATURE_ID_RANGE_SIZE]; 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) ...@@ -398,9 +408,7 @@ static void test_vm_ftr_id_regs(struct kvm_vcpu *vcpu, bool aarch64_only)
int idx; int idx;
/* Get the index to masks array for the idreg */ /* 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), idx = encoding_to_range_idx(reg_id);
sys_reg_CRn(reg_id), sys_reg_CRm(reg_id),
sys_reg_Op2(reg_id));
for (int j = 0; ftr_bits[j].type != FTR_END; j++) { for (int j = 0; ftr_bits[j].type != FTR_END; j++) {
/* Skip aarch32 reg on aarch64 only system, since they are RAZ/WI. */ /* 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) ...@@ -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_ASSERT_EQ(masks[idx] & ftr_bits[j].mask, ftr_bits[j].mask);
test_reg_set_fail(vcpu, reg, &ftr_bits[j]); 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); ksft_test_result_pass("%s\n", ftr_bits[j].name);
} }
...@@ -425,7 +435,6 @@ static void test_guest_reg_read(struct kvm_vcpu *vcpu) ...@@ -425,7 +435,6 @@ static void test_guest_reg_read(struct kvm_vcpu *vcpu)
{ {
bool done = false; bool done = false;
struct ucall uc; struct ucall uc;
uint64_t val;
while (!done) { while (!done) {
vcpu_run(vcpu); vcpu_run(vcpu);
...@@ -436,8 +445,8 @@ static void test_guest_reg_read(struct kvm_vcpu *vcpu) ...@@ -436,8 +445,8 @@ static void test_guest_reg_read(struct kvm_vcpu *vcpu)
break; break;
case UCALL_SYNC: case UCALL_SYNC:
/* Make sure the written values are seen by guest */ /* Make sure the written values are seen by guest */
vcpu_get_reg(vcpu, KVM_ARM64_SYS_REG(uc.args[2]), &val); TEST_ASSERT_EQ(test_reg_vals[encoding_to_range_idx(uc.args[2])],
TEST_ASSERT_EQ(val, uc.args[3]); uc.args[3]);
break; break;
case UCALL_DONE: case UCALL_DONE:
done = true; done = true;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment