|
@@ -3464,11 +3464,9 @@ static u64 vmx_read_l1_tsc_offset(struct kvm_vcpu *vcpu)
|
|
return vcpu->arch.tsc_offset;
|
|
return vcpu->arch.tsc_offset;
|
|
}
|
|
}
|
|
|
|
|
|
-/*
|
|
|
|
- * writes 'offset' into guest's timestamp counter offset register
|
|
|
|
- */
|
|
|
|
-static void vmx_write_tsc_offset(struct kvm_vcpu *vcpu, u64 offset)
|
|
|
|
|
|
+static u64 vmx_write_l1_tsc_offset(struct kvm_vcpu *vcpu, u64 offset)
|
|
{
|
|
{
|
|
|
|
+ u64 active_offset = offset;
|
|
if (is_guest_mode(vcpu)) {
|
|
if (is_guest_mode(vcpu)) {
|
|
/*
|
|
/*
|
|
* We're here if L1 chose not to trap WRMSR to TSC. According
|
|
* We're here if L1 chose not to trap WRMSR to TSC. According
|
|
@@ -3476,17 +3474,16 @@ static void vmx_write_tsc_offset(struct kvm_vcpu *vcpu, u64 offset)
|
|
* set for L2 remains unchanged, and still needs to be added
|
|
* set for L2 remains unchanged, and still needs to be added
|
|
* to the newly set TSC to get L2's TSC.
|
|
* to the newly set TSC to get L2's TSC.
|
|
*/
|
|
*/
|
|
- struct vmcs12 *vmcs12;
|
|
|
|
- /* recalculate vmcs02.TSC_OFFSET: */
|
|
|
|
- vmcs12 = get_vmcs12(vcpu);
|
|
|
|
- vmcs_write64(TSC_OFFSET, offset +
|
|
|
|
- (nested_cpu_has(vmcs12, CPU_BASED_USE_TSC_OFFSETING) ?
|
|
|
|
- vmcs12->tsc_offset : 0));
|
|
|
|
|
|
+ struct vmcs12 *vmcs12 = get_vmcs12(vcpu);
|
|
|
|
+ if (nested_cpu_has(vmcs12, CPU_BASED_USE_TSC_OFFSETING))
|
|
|
|
+ active_offset += vmcs12->tsc_offset;
|
|
} else {
|
|
} else {
|
|
trace_kvm_write_tsc_offset(vcpu->vcpu_id,
|
|
trace_kvm_write_tsc_offset(vcpu->vcpu_id,
|
|
vmcs_read64(TSC_OFFSET), offset);
|
|
vmcs_read64(TSC_OFFSET), offset);
|
|
- vmcs_write64(TSC_OFFSET, offset);
|
|
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ vmcs_write64(TSC_OFFSET, active_offset);
|
|
|
|
+ return active_offset;
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -15074,7 +15071,7 @@ static struct kvm_x86_ops vmx_x86_ops __ro_after_init = {
|
|
.has_wbinvd_exit = cpu_has_vmx_wbinvd_exit,
|
|
.has_wbinvd_exit = cpu_has_vmx_wbinvd_exit,
|
|
|
|
|
|
.read_l1_tsc_offset = vmx_read_l1_tsc_offset,
|
|
.read_l1_tsc_offset = vmx_read_l1_tsc_offset,
|
|
- .write_tsc_offset = vmx_write_tsc_offset,
|
|
|
|
|
|
+ .write_l1_tsc_offset = vmx_write_l1_tsc_offset,
|
|
|
|
|
|
.set_tdp_cr3 = vmx_set_cr3,
|
|
.set_tdp_cr3 = vmx_set_cr3,
|
|
|
|
|