KVM: selftests: Add helpers to get and modify a vCPU's CPUID entries
Add helpers to get a specific CPUID entry for a given vCPU, and to toggle a specific CPUID-based feature for a vCPU. The helpers will reduce the amount of boilerplate code needed to tweak a vCPU's CPUID model, improve code clarity, and most importantly move tests away from modifying the static "cpuid" returned by kvm_get_supported_cpuid(). Signed-off-by: Sean Christopherson <seanjc@google.com> Link: https://lore.kernel.org/r/20220614200707.3315957-23-seanjc@google.com
This commit is contained in:
parent
662162fed2
commit
c41880b5f0
@ -622,6 +622,19 @@ struct kvm_cpuid_entry2 *get_cpuid_entry(struct kvm_cpuid2 *cpuid,
|
||||
uint32_t function, uint32_t index);
|
||||
void vcpu_init_cpuid(struct kvm_vcpu *vcpu, struct kvm_cpuid2 *cpuid);
|
||||
|
||||
static inline struct kvm_cpuid_entry2 *__vcpu_get_cpuid_entry(struct kvm_vcpu *vcpu,
|
||||
uint32_t function,
|
||||
uint32_t index)
|
||||
{
|
||||
return get_cpuid_entry(vcpu->cpuid, function, index);
|
||||
}
|
||||
|
||||
static inline struct kvm_cpuid_entry2 *vcpu_get_cpuid_entry(struct kvm_vcpu *vcpu,
|
||||
uint32_t function)
|
||||
{
|
||||
return __vcpu_get_cpuid_entry(vcpu, function, 0);
|
||||
}
|
||||
|
||||
static inline int __vcpu_set_cpuid(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
int r;
|
||||
@ -645,6 +658,23 @@ static inline void vcpu_set_cpuid(struct kvm_vcpu *vcpu)
|
||||
vcpu_ioctl(vcpu, KVM_GET_CPUID2, vcpu->cpuid);
|
||||
}
|
||||
|
||||
void vcpu_set_or_clear_cpuid_feature(struct kvm_vcpu *vcpu,
|
||||
struct kvm_x86_cpu_feature feature,
|
||||
bool set);
|
||||
|
||||
static inline void vcpu_set_cpuid_feature(struct kvm_vcpu *vcpu,
|
||||
struct kvm_x86_cpu_feature feature)
|
||||
{
|
||||
vcpu_set_or_clear_cpuid_feature(vcpu, feature, true);
|
||||
|
||||
}
|
||||
|
||||
static inline void vcpu_clear_cpuid_feature(struct kvm_vcpu *vcpu,
|
||||
struct kvm_x86_cpu_feature feature)
|
||||
{
|
||||
vcpu_set_or_clear_cpuid_feature(vcpu, feature, false);
|
||||
}
|
||||
|
||||
static inline struct kvm_cpuid_entry2 *kvm_get_supported_cpuid_index(uint32_t function,
|
||||
uint32_t index)
|
||||
{
|
||||
|
@ -766,6 +766,24 @@ void vcpu_init_cpuid(struct kvm_vcpu *vcpu, struct kvm_cpuid2 *cpuid)
|
||||
vcpu_set_cpuid(vcpu);
|
||||
}
|
||||
|
||||
void vcpu_set_or_clear_cpuid_feature(struct kvm_vcpu *vcpu,
|
||||
struct kvm_x86_cpu_feature feature,
|
||||
bool set)
|
||||
{
|
||||
struct kvm_cpuid_entry2 *entry;
|
||||
u32 *reg;
|
||||
|
||||
entry = __vcpu_get_cpuid_entry(vcpu, feature.function, feature.index);
|
||||
reg = (&entry->eax) + feature.reg;
|
||||
|
||||
if (set)
|
||||
*reg |= BIT(feature.bit);
|
||||
else
|
||||
*reg &= ~BIT(feature.bit);
|
||||
|
||||
vcpu_set_cpuid(vcpu);
|
||||
}
|
||||
|
||||
uint64_t vcpu_get_msr(struct kvm_vcpu *vcpu, uint64_t msr_index)
|
||||
{
|
||||
struct {
|
||||
|
Loading…
Reference in New Issue
Block a user