Hi Shaoqin, On Tue, Aug 15, 2023 at 11:58 PM Shaoqin Huang <shahuang@xxxxxxxxxx> wrote: > > Hi Jing, > > On 8/8/23 00:22, Jing Zhang wrote: > > Add tests to verify setting ID registers from userapce is handled > > correctly by KVM. Also add a test case to use ioctl > > KVM_ARM_GET_REG_WRITABLE_MASKS to get writable masks. > > > > Signed-off-by: Jing Zhang <jingzhangos@xxxxxxxxxx> > > --- > > tools/testing/selftests/kvm/Makefile | 1 + > > .../selftests/kvm/aarch64/set_id_regs.c | 453 ++++++++++++++++++ > > 2 files changed, 454 insertions(+) > > create mode 100644 tools/testing/selftests/kvm/aarch64/set_id_regs.c > > > > + > > +static void test_guest_reg_read(struct kvm_vcpu *vcpu) > > +{ > > + struct ucall uc; > > + bool done = false; > > + > > + while (!done) { > > + vcpu_run(vcpu); > > + > > + switch (get_ucall(vcpu, &uc)) { > > + case UCALL_ABORT: > > + REPORT_GUEST_ASSERT(uc); > > + break; > > + case UCALL_SYNC: > > + uint64_t val; > aarch64/set_id_regs.c:408:4: error: a label can only be part of a > statement and a declaration is not a statement. > > I can encounter a compiler error at this line. Why not just put the > uint64_t at the beginning of the function. Sure. Will move it to the beginning of the function. > > Thanks, > Shaoqin > > > + > > + /* Make sure the written values are seen by guest */ > > + vcpu_get_reg(vcpu, KVM_ARM64_SYS_REG(uc.args[2]), &val); > > + ASSERT_EQ(val, uc.args[3]); > > + break; > > + case UCALL_DONE: > > + done = true; > > + break; > > + default: > > + TEST_FAIL("Unexpected ucall: %lu", uc.cmd); > > + } > > + } > > +} > > + > > +int main(void) > > +{ > > + struct kvm_vcpu *vcpu; > > + struct kvm_vm *vm; > > + bool aarch64_only; > > + uint64_t val, el0; > > + int ftr_cnt; > > + > > + vm = vm_create_with_one_vcpu(&vcpu, guest_code); > > + > > + /* Check for AARCH64 only system */ > > + vcpu_get_reg(vcpu, KVM_ARM64_SYS_REG(SYS_ID_AA64PFR0_EL1), &val); > > + el0 = FIELD_GET(ARM64_FEATURE_MASK(ID_AA64PFR0_EL1_EL0), val); > > + aarch64_only = (el0 == ID_AA64PFR0_EL1_ELx_64BIT_ONLY); > > + > > + ksft_print_header(); > > + > > + ftr_cnt = ARRAY_SIZE(ftr_id_aa64dfr0_el1) + ARRAY_SIZE(ftr_id_dfr0_el1) > > + + ARRAY_SIZE(ftr_id_aa64pfr0_el1) + ARRAY_SIZE(ftr_id_aa64mmfr0_el1) > > + + ARRAY_SIZE(ftr_id_aa64mmfr1_el1) + ARRAY_SIZE(ftr_id_aa64mmfr2_el1) > > + + ARRAY_SIZE(ftr_id_aa64mmfr3_el1) - ARRAY_SIZE(test_regs); > > + > > + ksft_set_plan(ftr_cnt); > > + > > + test_user_set_reg(vcpu, aarch64_only); > > + test_guest_reg_read(vcpu); > > + > > + kvm_vm_free(vm); > > + > > + ksft_finished(); > > +} > > -- > Shaoqin > Thanks, Jing