[PATCH v8 11/11] KVM: arm64: selftests: Test for setting ID register from usersapce
Jing Zhang
jingzhangos at google.com
Wed Aug 16 10:23:43 PDT 2023
Hi Shaoqin,
On Tue, Aug 15, 2023 at 11:58 PM Shaoqin Huang <shahuang at redhat.com> 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 at google.com>
> > ---
> > 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
More information about the linux-arm-kernel
mailing list