KVM: Add generic RDPMC support
Add a helper function that emulates the RDPMC instruction operation. Signed-off-by: Avi Kivity <avi@redhat.com> Signed-off-by: Gleb Natapov <gleb@redhat.com> Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
@@ -760,6 +760,7 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data);
|
|||||||
|
|
||||||
unsigned long kvm_get_rflags(struct kvm_vcpu *vcpu);
|
unsigned long kvm_get_rflags(struct kvm_vcpu *vcpu);
|
||||||
void kvm_set_rflags(struct kvm_vcpu *vcpu, unsigned long rflags);
|
void kvm_set_rflags(struct kvm_vcpu *vcpu, unsigned long rflags);
|
||||||
|
bool kvm_rdpmc(struct kvm_vcpu *vcpu);
|
||||||
|
|
||||||
void kvm_queue_exception(struct kvm_vcpu *vcpu, unsigned nr);
|
void kvm_queue_exception(struct kvm_vcpu *vcpu, unsigned nr);
|
||||||
void kvm_queue_exception_e(struct kvm_vcpu *vcpu, unsigned nr, u32 error_code);
|
void kvm_queue_exception_e(struct kvm_vcpu *vcpu, unsigned nr, u32 error_code);
|
||||||
|
@@ -760,6 +760,21 @@ int kvm_get_dr(struct kvm_vcpu *vcpu, int dr, unsigned long *val)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(kvm_get_dr);
|
EXPORT_SYMBOL_GPL(kvm_get_dr);
|
||||||
|
|
||||||
|
bool kvm_rdpmc(struct kvm_vcpu *vcpu)
|
||||||
|
{
|
||||||
|
u32 ecx = kvm_register_read(vcpu, VCPU_REGS_RCX);
|
||||||
|
u64 data;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
err = kvm_pmu_read_pmc(vcpu, ecx, &data);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
kvm_register_write(vcpu, VCPU_REGS_RAX, (u32)data);
|
||||||
|
kvm_register_write(vcpu, VCPU_REGS_RDX, data >> 32);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(kvm_rdpmc);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* List of msr numbers which we expose to userspace through KVM_GET_MSRS
|
* List of msr numbers which we expose to userspace through KVM_GET_MSRS
|
||||||
* and KVM_SET_MSRS, and KVM_GET_MSR_INDEX_LIST.
|
* and KVM_SET_MSRS, and KVM_GET_MSR_INDEX_LIST.
|
||||||
|
Reference in New Issue
Block a user