Skip to content

Commit d7e6873

Browse files
Jinrong Liangsean-jc
authored andcommitted
KVM: selftests: Add vcpu_set_cpuid_property() to set properties
Add vcpu_set_cpuid_property() helper function for setting properties, and use it instead of open coding an equivalent for MAX_PHY_ADDR. Future vPMU testcases will also need to stuff various CPUID properties. Reviewed-by: Jim Mattson <jmattson@google.com> Signed-off-by: Jinrong Liang <cloudliang@tencent.com> Co-developed-by: Sean Christopherson <seanjc@google.com> Tested-by: Dapeng Mi <dapeng1.mi@linux.intel.com> Link: https://lore.kernel.org/r/20240109230250.424295-13-seanjc@google.com Signed-off-by: Sean Christopherson <seanjc@google.com>
1 parent a634c76 commit d7e6873

3 files changed

Lines changed: 16 additions & 5 deletions

File tree

tools/testing/selftests/kvm/include/x86_64/processor.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -995,7 +995,9 @@ static inline void vcpu_set_cpuid(struct kvm_vcpu *vcpu)
995995
vcpu_ioctl(vcpu, KVM_GET_CPUID2, vcpu->cpuid);
996996
}
997997

998-
void vcpu_set_cpuid_maxphyaddr(struct kvm_vcpu *vcpu, uint8_t maxphyaddr);
998+
void vcpu_set_cpuid_property(struct kvm_vcpu *vcpu,
999+
struct kvm_x86_cpu_property property,
1000+
uint32_t value);
9991001

10001002
void vcpu_clear_cpuid_entry(struct kvm_vcpu *vcpu, uint32_t function);
10011003
void vcpu_set_or_clear_cpuid_feature(struct kvm_vcpu *vcpu,

tools/testing/selftests/kvm/lib/x86_64/processor.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -752,12 +752,21 @@ void vcpu_init_cpuid(struct kvm_vcpu *vcpu, const struct kvm_cpuid2 *cpuid)
752752
vcpu_set_cpuid(vcpu);
753753
}
754754

755-
void vcpu_set_cpuid_maxphyaddr(struct kvm_vcpu *vcpu, uint8_t maxphyaddr)
755+
void vcpu_set_cpuid_property(struct kvm_vcpu *vcpu,
756+
struct kvm_x86_cpu_property property,
757+
uint32_t value)
756758
{
757-
struct kvm_cpuid_entry2 *entry = vcpu_get_cpuid_entry(vcpu, 0x80000008);
759+
struct kvm_cpuid_entry2 *entry;
760+
761+
entry = __vcpu_get_cpuid_entry(vcpu, property.function, property.index);
762+
763+
(&entry->eax)[property.reg] &= ~GENMASK(property.hi_bit, property.lo_bit);
764+
(&entry->eax)[property.reg] |= value << property.lo_bit;
758765

759-
entry->eax = (entry->eax & ~0xff) | maxphyaddr;
760766
vcpu_set_cpuid(vcpu);
767+
768+
/* Sanity check that @value doesn't exceed the bounds in any way. */
769+
TEST_ASSERT_EQ(kvm_cpuid_property(vcpu->cpuid, property), value);
761770
}
762771

763772
void vcpu_clear_cpuid_entry(struct kvm_vcpu *vcpu, uint32_t function)

tools/testing/selftests/kvm/x86_64/smaller_maxphyaddr_emulation_test.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ int main(int argc, char *argv[])
6363
vm_init_descriptor_tables(vm);
6464
vcpu_init_descriptor_tables(vcpu);
6565

66-
vcpu_set_cpuid_maxphyaddr(vcpu, MAXPHYADDR);
66+
vcpu_set_cpuid_property(vcpu, X86_PROPERTY_MAX_PHY_ADDR, MAXPHYADDR);
6767

6868
rc = kvm_check_cap(KVM_CAP_EXIT_ON_EMULATION_FAILURE);
6969
TEST_ASSERT(rc, "KVM_CAP_EXIT_ON_EMULATION_FAILURE is unavailable");

0 commit comments

Comments
 (0)