lkml.org 
[lkml]   [2022]   [Jun]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH 25/42] KVM: selftests: Use vcpu_get_cpuid_entry() in PV features test (sort of)
    From
    Add a new helper, vcpu_clear_cpuid_entry(), to do a RMW operation on the
    vCPU's CPUID model to clear a given CPUID entry, and use it to clear
    KVM's paravirt feature instead of operating on kvm_get_supported_cpuid()'s
    static "cpuid" variable. This also eliminates a user of
    the soon-be-defunct set_cpuid() helper.

    Signed-off-by: Sean Christopherson <seanjc@google.com>
    ---
    .../testing/selftests/kvm/include/x86_64/processor.h | 1 +
    tools/testing/selftests/kvm/lib/x86_64/processor.c | 11 +++++++++++
    tools/testing/selftests/kvm/x86_64/kvm_pv_test.c | 12 +-----------
    3 files changed, 13 insertions(+), 11 deletions(-)

    diff --git a/tools/testing/selftests/kvm/include/x86_64/processor.h b/tools/testing/selftests/kvm/include/x86_64/processor.h
    index d6ffd625513b..22e2eaf42360 100644
    --- a/tools/testing/selftests/kvm/include/x86_64/processor.h
    +++ b/tools/testing/selftests/kvm/include/x86_64/processor.h
    @@ -658,6 +658,7 @@ static inline void vcpu_set_cpuid(struct kvm_vcpu *vcpu)

    void vcpu_set_cpuid_maxphyaddr(struct kvm_vcpu *vcpu, uint8_t maxphyaddr);

    +void vcpu_clear_cpuid_entry(struct kvm_vcpu *vcpu, uint32_t function);
    void vcpu_set_or_clear_cpuid_feature(struct kvm_vcpu *vcpu,
    struct kvm_x86_cpu_feature feature,
    bool set);
    diff --git a/tools/testing/selftests/kvm/lib/x86_64/processor.c b/tools/testing/selftests/kvm/lib/x86_64/processor.c
    index 06ae7542f2c9..69239b3613f7 100644
    --- a/tools/testing/selftests/kvm/lib/x86_64/processor.c
    +++ b/tools/testing/selftests/kvm/lib/x86_64/processor.c
    @@ -771,6 +771,17 @@ void vcpu_set_cpuid_maxphyaddr(struct kvm_vcpu *vcpu, uint8_t maxphyaddr)
    vcpu_set_cpuid(vcpu);
    }

    +void vcpu_clear_cpuid_entry(struct kvm_vcpu *vcpu, uint32_t function)
    +{
    + struct kvm_cpuid_entry2 *entry = vcpu_get_cpuid_entry(vcpu, function);
    +
    + entry->eax = 0;
    + entry->ebx = 0;
    + entry->ecx = 0;
    + entry->edx = 0;
    + vcpu_set_cpuid(vcpu);
    +}
    +
    void vcpu_set_or_clear_cpuid_feature(struct kvm_vcpu *vcpu,
    struct kvm_x86_cpu_feature feature,
    bool set)
    diff --git a/tools/testing/selftests/kvm/x86_64/kvm_pv_test.c b/tools/testing/selftests/kvm/x86_64/kvm_pv_test.c
    index e3bb9b803944..7ab61f3f2a20 100644
    --- a/tools/testing/selftests/kvm/x86_64/kvm_pv_test.c
    +++ b/tools/testing/selftests/kvm/x86_64/kvm_pv_test.c
    @@ -142,15 +142,6 @@ static void guest_main(void)
    GUEST_DONE();
    }

    -static void clear_kvm_cpuid_features(struct kvm_cpuid2 *cpuid)
    -{
    - struct kvm_cpuid_entry2 ent = {0};
    -
    - ent.function = KVM_CPUID_FEATURES;
    - TEST_ASSERT(set_cpuid(cpuid, &ent),
    - "failed to clear KVM_CPUID_FEATURES leaf");
    -}
    -
    static void pr_msr(struct ucall *uc)
    {
    struct msr_data *msr = (struct msr_data *)uc->args[0];
    @@ -209,8 +200,7 @@ int main(void)

    vcpu_enable_cap(vcpu, KVM_CAP_ENFORCE_PV_FEATURE_CPUID, 1);

    - clear_kvm_cpuid_features(vcpu->cpuid);
    - vcpu_set_cpuid(vcpu);
    + vcpu_clear_cpuid_entry(vcpu, KVM_CPUID_FEATURES);

    vm_init_descriptor_tables(vm);
    vcpu_init_descriptor_tables(vcpu);
    --
    2.36.1.255.ge46751e96f-goog
    \
     
     \ /
      Last update: 2022-06-04 03:24    [W:4.341 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site