KVM: X86: Implement userspace interface to set virtual_tsc_khz
This patch implements two new vm-ioctls to get and set the virtual_tsc_khz if the machine supports tsc-scaling. Setting the tsc-frequency is only possible before userspace creates any vcpu. Signed-off-by: Joerg Roedel <joerg.roedel@amd.com> Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
@@ -64,6 +64,8 @@ MODULE_LICENSE("GPL");
|
||||
#define DEBUGCTL_RESERVED_BITS (~(0x3fULL))
|
||||
|
||||
#define TSC_RATIO_RSVD 0xffffff0000000000ULL
|
||||
#define TSC_RATIO_MIN 0x0000000000000001ULL
|
||||
#define TSC_RATIO_MAX 0x000000ffffffffffULL
|
||||
|
||||
static bool erratum_383_found __read_mostly;
|
||||
|
||||
@@ -189,6 +191,7 @@ static int nested_svm_intercept(struct vcpu_svm *svm);
|
||||
static int nested_svm_vmexit(struct vcpu_svm *svm);
|
||||
static int nested_svm_check_exception(struct vcpu_svm *svm, unsigned nr,
|
||||
bool has_error_code, u32 error_code);
|
||||
static u64 __scale_tsc(u64 ratio, u64 tsc);
|
||||
|
||||
enum {
|
||||
VMCB_INTERCEPTS, /* Intercept vectors, TSC offset,
|
||||
@@ -798,6 +801,23 @@ static __init int svm_hardware_setup(void)
|
||||
if (boot_cpu_has(X86_FEATURE_FXSR_OPT))
|
||||
kvm_enable_efer_bits(EFER_FFXSR);
|
||||
|
||||
if (boot_cpu_has(X86_FEATURE_TSCRATEMSR)) {
|
||||
u64 max;
|
||||
|
||||
kvm_has_tsc_control = true;
|
||||
|
||||
/*
|
||||
* Make sure the user can only configure tsc_khz values that
|
||||
* fit into a signed integer.
|
||||
* A min value is not calculated needed because it will always
|
||||
* be 1 on all machines and a value of 0 is used to disable
|
||||
* tsc-scaling for the vcpu.
|
||||
*/
|
||||
max = min(0x7fffffffULL, __scale_tsc(tsc_khz, TSC_RATIO_MAX));
|
||||
|
||||
kvm_max_guest_tsc_khz = max;
|
||||
}
|
||||
|
||||
if (nested) {
|
||||
printk(KERN_INFO "kvm: Nested Virtualization enabled\n");
|
||||
kvm_enable_efer_bits(EFER_SVME | EFER_LMSLE);
|
||||
|
Reference in New Issue
Block a user